Hadoop HDFS入门
当前位置:以往代写 > 其他教程 >Hadoop HDFS入门
2019-06-14

Hadoop HDFS入门

Hadoop HDFS入门


Hadoop 附带了一个名为 HDFS(Hadoop漫衍式文件系统)的漫衍式文件系统,基于 Hadoop 的应用措施利用 HDFS 。HDFS 是专为存储超大数据文件,运行在集群的商品硬件上。它是容错的,可伸缩的,而且很是易于扩展。

    你知道吗?  当数据高出一个单个物理呆板上存储的容量,除以跨独立呆板数。打点超过呆板的网络存储特定操纵被称为漫衍式文件系统。

HDFS集群主要由 NameNode 打点文件系统 Metadata 和 DataNodes 存储的实际数据。

  • NameNode: NameNode可以被认为是系统的主站。它维护所有系统中存在的文件和目次的文件系统树和元数据 。 两个文件:“定名空间映像“和”编辑日志“是用来存储元数据信息。Namenode 有所有包括数据块为一个给定的文件中的数据节点的常识,可是不存储块的位置一连。从数据节点在系统每次启动时信息重构一次。

  • DataNode : DataNodes作为从机,每台呆板位于一个集群中,并提供实际的存储. 它认真为客户读写请求处事。

  • HDFS中的读/写操纵运行在块级。HDFS数据文件被分成块巨细的块,这是作为独立的单位存储。默认块巨细为64 MB。

    HDFS操纵上是数据复制的观念,个中在数据块的多个副本被建设,漫衍在整个节点的群集以使在节点妨碍的环境下数据的高可用性。

    注:  在HDFS的文件,比单个块小,不占用块的全部存储。

    在HDFS读操纵

    数据读取请求将由 HDFS,NameNode和DataNode来处事。让我们把读取器叫 “客户”。下图描画了文件的读取操纵在 Hadoop 中。
    Hadoop HDFS入门

    1. 客户端启动通过挪用文件系统工具的 open() 要领读取请求; 它是 DistributedFileSystem 范例的工具。
    2. 此工具利用 RPC 毗连到 namenode 并获取的元数据信息,如该文件的块的位置。 请留意,这些地点是文件的前几个块。
    3. 响应该元数据请求,具有该块副本的 DataNodes 地点被返回。
    4. 一旦吸收到 DataNodes 的地点,FSDataInputStream 范例的一个工具被返回到客户端。 FSDataInputStream 包括 DFSInputStream 这需要处理惩罚交互 DataNode 和 NameNode。在上图所示的步调4,客户端挪用 read() 要领,这将导致 DFSInputStream 成立与第一个 DataNode 文件的第一个块毗连。

    5. 以数据流的形式读取数据,个中客户端多次挪用 “read() ” 要领。 read() 操纵这个进程一直一连,直到它达到块竣事位置。

    6. 一旦到模块的末了,DFSInputStream 封锁毗连,移动定位到下一个 DataNode 的下一个块
    7. 一旦客户端已读取完成后,它会挪用 close()要领。

    HDFS写操纵

    在本节中,我们将相识如何通过的文件将数据写入到 HDFS。
    Hadoop HDFS入门

    1. 客户端通过挪用 DistributedFileSystem工具的 create() 要领建设一个新的文件,并开始写操纵 – 在上面的图中的步调1
    2. DistributedFileSystem工具利用 RPC 挪用毗连到 NameNode,并启动新的文件建设。可是,此文件建设操纵不与文件任何块相关联。NameNode 的责任是验证文件(其正被建设的)不存在,而且客户端具有正确权限来建设新文件。假如文件已经存在,可能客户端不具有足够的权限来建设一个新的文件,则抛出 IOException 到客户端。不然操纵乐成,而且该文件新的记录是由 NameNode 建设。
    3. 一旦 NameNode 建设一条新的记录,返回FSDataOutputStream 范例的一个工具到客户端。客户端利用它来写入数据到 HDFS。数据写入要领被挪用(图中的步调3)。
    4. FSDataOutputStream包括DFSOutputStream工具,它利用 DataNodes 和 NameNode 通信后查找。当客户机继承写入数据,DFSOutputStream 继承建设这个数据包。这些数据包毗连列队到一个行列被称为 DataQueue
    5. 尚有一个名为 DataStreamer 组件,用于耗损DataQueue。DataStreamer 也要求 NameNode 分派新的块,拣选 DataNodes 用于复制。
    6. 此刻,复制进程始于利用 DataNodes 建设一个管道。 在我们的例子中,选择了复制程度3,因此有 3 个 DataNodes 管道。
    7. 所述 DataStreamer 注入包分成到第一个 DataNode 的管道中。
    8. 在每个 DataNode 的管道中存储数据包吸收并同样转发在第二个 DataNode 的管道中。
    9. 另一个行列,“Ack Queue”是由 DFSOutputStream 保持存储,它们是 DataNodes 期待确认的数据包。
    10. 一旦确认在行列中的分组从所有 DataNodes 已吸收在管道,它从 'Ack Queue' 删除。在任何 DataNode 产生妨碍时,从行列中的包从头用于操纵。
    11. 在客户端的数据写入完成后,它会挪用close()要领(第9步图中),挪用close()功效进入到清理缓存剩余数据包到管道之后期待确认。
    12. 一旦收到最终确认,NameNode 毗连汇报它该文件的写操纵完成。

    利用JAVA API会见HDFS

    在本节中,我们来相识 Java 接口并用它们来会见Hadoop的文件系统。

    #p#分页标题#e#

    为了利用编程方法与 Hadoop 文件系统举办交互,Hadoop 提供多种 Java 类。org.apache.hadoop.fs 包中包括哄骗 Hadoop 文件系统中的文件类东西。这些操纵包罗,打开,读取,写入,和封锁。实际上,对付 Hadoop 文件 API 是通用的,可以扩展到 HDFS 的其他文件系统交互。

    编程从 HDFS 读取文件

    java.net.URL 工具是用于读取文件的内容。首先,我们需要让 Java 识别 Hadoop 的 HDFS URL架构。这是通过挪用 URL 工具的 setURLStreamHandlerFactory要领和 FsUrlStreamHandlerFactory 的一个实例琮通报给它。此要领只需要执行一次在每个JVM,因此,它被关闭在一个静态块中。

    示例代码

     

    publicclassURLCat {

        static{

            URL.setURLStreamHandlerFactory(newFsUrlStreamHandlerFactory());

        }

        publicstaticvoidmain(String[] args) throwsException {

            InputStream in = null;

            try{

                in = newURL(args[0]).openStream();

                IOUtils.copyBytes(in, System.out, 4096, false);

            } finally{

                IOUtils.closeStream(in);

            }

        }

    }

    这段代码用于打开和读取文件的内容。HDFS文件的路径作为呼吁行参数通报给该措施。

    利用呼吁行界面会见HDFS

    这是与 HDFS 交互的最简朴的要领之一。 呼吁行接口支持对文件系统操纵,譬喻:如读取文件,建设目次,移动文件,删除数据,并列出目次。

    可以执行 '$HADOOP_HOME/bin/hdfs dfs -help' 来得到每一个呼吁的具体辅佐。这里, 'dfs' HDFS是一个shell呼吁,它支持多个子呼吁。首先要启动 Haddop 处事(利用 hduser_用户),执行呼吁如下:

    [email protected]:~$ su hduser_
    [email protected]:~$ $HADOOP_HOME/sbin/start-dfs.sh
    [email protected]:~$ $HADOOP_HOME/sbin/start-yarn.sh
    

    一些遍及利用的呼吁的列表如下

    1. 从当地文件系统复制文件到 HDFS

    [email protected]:~$ $HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

    此呼吁将文件从当地文件系统拷贝 temp.txt 文件到 HDFS。

    2. 我们可以通过以下呼吁列出一个目次下存在的文件 -ls

    [email protected]:~$ $HADOOP_HOME/bin/hdfs dfs -ls /

    Hadoop HDFS入门Hadoop HDFS入门

    我们可以看到一个文件 'temp.txt“(之前复制)被列在”/“目次。

    #p#分页标题#e#

    3. 以下呼吁将文件从 HDFS 拷贝到当地文件系统

    [email protected]:~$ $HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

    我们可以看到 temp.txt 已经复制到当地文件系统。

    4. 以下呼吁用来建设新的目次

    [email protected]:~$ $HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

    Hadoop HDFS入门接下来查抄是否已经成立了目次。此刻,应该知道怎么做了吧?

      关键字:

    在线提交作业