HDFS学习笔记

一、概念
    用于管理网络中跨多台计算机存储的分布式文件系统。
二、设计
优点:
    1、高数据吞吐量的批量数据处理
    2、针对超大文件:TB、PB级数据
    3、流式数据访问:一次写入,多次读取
    4、高容错性:在硬件出现故障时能够不被用户发现明显中断而继续运行
缺点(不适应):
    1、低延时的数据访问:即快速响应,HBase更合适
    2、大量的小文件
    3、多用户写入,任意修改文件
三、基本组成元素概念
3.1、数据块
    hdfs默认数据块大小:128M(64M)。
    特点:hdfs中小于1个块的文件不会占据整个块的空间。
    使用128M(64M)作为块大小的原因:最小化寻址开销。一个大文件的传输时间主要由磁盘传输数据的速率和寻找文件的寻址时间决定。当文件块的体积变大了,同体积下,块的数量就变少了,那么在定位这些块起始位置所花的时间就会减少,在传输速率不变的情况下,减少了寻址时间,那么文件的传输时间就会减少,达到了提升效率的效果。
集群的常用节点设置:任务数量不少于集群中的几点数量。mapreduce中的map任务通常一次处理一个块中的数据,因此如果任务数太少(少于集群中的节点数量),作业的运行速度就会变慢。
    使用块作为存储单元的优点(好处):
1、文件的大小可以大于网络中任意一个磁盘的容量。
2、大大简化了存储子系统的设计。既简化了存储管理,也消除了对元数据的顾虑。
3、块适用于数据备份,从而提升了数据容错能力和可用性。
3.2、namenode
    namenode(管理者):管理文件系统的命名空间。
    功能:
1、维护文件系统树,包括树内所有的目录和文件。这些信息永久保存在两个文件中:命名空间镜像文件、编辑日志镜像文件。
2、在系统运行时临时记录着每个文件中各个块所在的数据节点信息。
    针对namenode出错导致hdfs不可用的问题,hadoop提供了两种容错机制:
1、备份组成文件系统元数据持久状态的文件;一般情况下,将持久状态文件写入本地文件磁盘的同时,写入一个远程挂载的网络文件系统(NFS);
2、运行一个辅助namenode。它的作用是定期合并编辑日志与命名空间镜像。由于辅助namenode状态无法实时同步运行的namenode,一般情况下,会把存储在NFS上的namenode元数据复制到辅助namenode并作为新的主namenode运行。
3.3、datanode
    datanode(工作者):hdfs的工作节点。他们按需存储并检索数据块,定期向namenode发送他们存储的块的列表。
3.4、块缓存
    对于频繁访问的文件,以对外缓存(off-heap block cache)的形式存储在datanode的内存中。
    缓存池:
管理缓存权限和资源使用的管理性分组。用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及多久。
3.5、联合HDFS:
    使用多个namenode管理HDFS中的文件,每一个namenode管理文件系统命名空间的一部分。比如,一个namenode管理/usr下的所有文件,另一个管理/share下的所有文件。
    每个namenode维护一个命名空间卷(namespace volume),包含元数据和数据块池(block pool)。命名空间卷互相独立,数据块池不再进行切分,因此集群中的datanode需要注册到每个namenode中。
3.6、高可用性支持(HA):
    why?namenode的冷启动时间太长
    what?hadoop2增加了HDFS高可用性支持,配置了一对活动-备用namenode。当活动namenode失效,备用namenode会接管其任务继续服务客户端请求,并不会有明显中断(几十秒)。
    how?
        1、namenode之间通过高可用共享存储实现编辑日志的共享;
            NFS过滤器
            群体日志管理器(QJM, quorum journal manager)。即为包含多个日志节点的系统,每次日志会写入所有节点,所以能够忍受任何节点的丢失。
        2、datanode同时向两个namenode发送数据块处理报告;
        3、客户端需要使用特定的机制来处理namenode的失效问题;
        4、备用namenode替代了辅助namenode,备用namenode为活动namenode设置周期性检查。
3.7、故障切换与规避:

    故障转移控制器管理着将活动namenode转移为备用namenode的转换过程。其工作就是监视宿主namenode是否失效并在namenode失效时进行故障切换。

    实现故障转移的规避机制:

        1、撤销namenode访问共享存储目录的权限;

        2、通过远程命令屏蔽影响的网络接口;

        3、断电

四、hadoop文件系统:

    hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。java抽象类org.apache.hadoop.fs.FileSystem定义了hadoop中一个文件系统的客户端接口,该抽象类有多个具体实现。

    hadoop文件系统默认将文件系统块复本设置为3。

4.1、命令行接口:

    文件系统的基本操作命令与linux的命令对齐,hadoop使用命令时比linux命令多了一个"-",如:

    linux:mkdir

    hadoop:-mkdir

    标准的hadoop命令:

    hadoop fs -${cmd} ${option}

    示例:

        从本地复制到hdfs: hadoop fs -copyFromLocal xxx hdfs://xxx

        从hdfs复制到本地:hadoop fs -copyToLocal hdfs://xxx xxx

        创建目录:hadoop fs -mkdir hdfs://newdir

4.2、java接口:

    hadoop作为一个抽象的文件系统概念提供了一个FileSystem抽象类,它提供了与hadoop的某一个文件系统进行交互的java API接口。如hdfs对应的实例为DistributedFileSystem。用户可以采用不同的实例与hadoop的具体文件系统进行交互,实现文件的读写等操作。

五、数据流:
    1、文件读取流程:
    客户端调用HDFS的DistributedFileSystem对象的open()方法打开希望读取的文件,该对象使用远程过程调用(RPC)调用namenode来获取文件起始块的位置,并将一个包含datanode和I/O信息的DFSDataInputStream对象返还给客户端用于读取数据。接着,客户端对这个输入流对象调用read()方法,按照带宽定义的节点距离远近依次读取datanode上的块的数据,读取完成一个datanode的块中数据之后关闭与该datanode的连接,继续读取下一个datanode的块中的数据,读取完所有datanode的块中数据之后,调用close()方法关闭连接。

    问题1:当DFSDataInputStream与一个datanode连接时出现通讯故障,如何处理?
    答:尝试与这个datanode最近的datanode读取数据。同时,标记该故障datanode,以保证以后不会读取该故障datanode的数据。DFSDataInputStream在读取到一个datanode的数据块之后,会对该块进行校验并确认该块中的数据是否完整,如果发现损坏,会试图从其他datanode处读取该数据块的副本,并通知namenode该datanode数据损坏。

    2、文件写入流程:
    客户端通过对DistributedFileSystem对象调用create()来新建文件,使用RPC告知namenode为新建文件建立一条记录,之后DistributedFileSystem对象返回一个DFSDataOutputStream对象。DFSDataOutputStream将客户端写入的数据分割成一个一个的数据包,并写入内部数据队列并维护一个确认队列。对于每一个数据包,由DataStreamer完成将数据写入一组合适的datanode构成的管线,DataStreamer将数据包写入管线中的第一个datanode,该datanode将数据存储完成并发送给第二个datanode,依次类推。当完成一个数据包的写入之后,datanode会返回确认信息给DFSDataOutputStream对象,并将内部数据队列中的该数据包删除。完成所有的数据写入之后,对数据流调用close()方法关闭连接。

    问题2:在写入数据时datanode发生故障怎么办?
    答:首先关闭管线,确认将队列中的所有数据包添加回数据队列的最前端。为存储在另一个datanode的当前数据块指定一个新标识,并将该标识传给namenode,namenode分配新的datanode代替出故障的datanode,与另外两个datanode重新组成管线完成数据的写入。

    问题3:数据块默认的3个副本怎么存放?
答:第一个副本存在放运行客户端的节点上,如果客户端不在集群中,则在集群中随机选择一个节点。第二个副本存在非第一个节点所在的随机一个机架上,第三个副本存储在第二个副本所在机架上,并与第二个副本不在同一个节点。


    3、一致模型

    文件系统的一致模型描述了读/写的数据可见性。hdfs为了性能牺牲了一些posix要求,在默认情况下,写入文件的内容并不能保证立即可见,即使数据流已经存储。

    hflush():强制将所有缓存刷新到datanode的内存中;

    hsync():强制同步到磁盘。

六、distcp并行复制

并行的从hdfs中复制大量数据(文件或目录)或将大量数据复制到hdfs中。

示例:

hadoop distcp file1(dir1) file2(dir2)

-m:指定map数量,map默认设置为20;

-update:只更新发生变化的文件;

-delete:删除dir1中没有但是dir2中有的文件。

-P:保留文件原始状态属性。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页