HDFS研究

来源:互联网 发布:猫喜欢臭袜子 知乎 编辑:程序博客网 时间:2024/06/05 14:45

1. HDFS的组成部分及各部分职责?

  • Client:
    • 调用HDFS API操作文件;
    • 与NN交互,进行文件元数据的操作,获取文件元数据;
    • 与DN交互,数据读写。
  • NN:
    • 唯一管理者,管理元数据(保存和管理文件系统的命名空间,包括目录树、文件和目录的元数据(数据以fsimage和editlog两个文件形式存放在本地磁盘)&&保存和构造文件与数据块所占DN的对应关系);
    • 与Client交互,文件操作与元数据查找;
    • 接受DN数据块报告,更新元数据,分配数据存储节点,一旦发现某个DN宕掉则将DN移出HDFS并重新备份上面的数据。
  • SNN:
    • 为了减小NN的压力,会定期合并fsimage和edits日志并传输给NN
  • DN:
    • 数据存储节点,与Clinet交互,数据读写;
    • 文件分割为block,冗余备份存储在多个DN上;
    • 向NN定期报告数据块的存储情况

2. 数据是怎样进行读取的?

  • Client生成一个HDFS类库中的DistributedFileSystem对象实例,并使用此实例的open()接口打开一个文件;
  • DistributedFileSystem通过RPC向NN发出请求,以获得文件相关block位置信息。NN将包含此文件相关block的DN地址,经过按与Client距离排序后返回给DistributedFileSystem
  • DistributedFileSystem在获得block信息后,生成一个FSDataInputStream对象,返回给Client。封装了DFSInputStream对象,负责存储block信息及DN地址信息,负责后续文件内容读取;
  • Client向FSDataInputStream发出读取数据的read()调用;
  • DFSInputStream选择第一个block最近的DN,读数据返回给Client。读完后,DFSInputStream关闭相应DN的连接;
  • DFSInputStream选择后续block的最近DN,读数据返回给Client,直到最后一个block读完
  • Client读完所有数据,调用FSDataInputStream的close()接口结束本次文件读取

3. 数据是怎样写入的?

  • Client生成一个HDFS类库中的DistributedFileSystem对象实例,并使用此实例的create()接口创建一个文件;
  • DistributedFileSystem通过RPC向NN发出创建文件请求,NN确认无重名文件,Client有写权限,否则IOException;
  • DistributedFileSystem生成一个FSDataOutputStream对象,返回给Client。封装一个DFSOutputStream,负责后续文件内容写入;
  • Client向FSDataOutputStream发出写入数据的write()调用以及要写入的数据,DFSOutputStream收到数据后将数据拆分放入数据队列;
  • DataStreamer负责从数据队列中不断取出数据,准备写入DN。写入之前,DataStreamer需要从NN请求分配一些存放数据block信息以及适合存放这些block的DN地址;
  • 对于每个block,NN会分配若干个DN以复制存储数据块。DataStreamer将block写入第一个DN,这个DN将数据传给第二个DN,依次类推,完成整个DN链写入;
  • 每个DN写入完成后,向DataStreamer报告完成,向NN报告完成block写入,每个block循环执行;
  • Client完成所有数据写入,调用FSDataOutputStream的close()接口结束本次写入;
  • Note:如果某个DN写入失败,DataStreamer到此节点连接关闭,故障节点从DN链中删除,其他DN写入继续。NN通过返回信息发现某DN写入未完成,会分配另一个DN完成写入。多个DN写入失败是,只要有一个写入成功,本次写入即完成,后续会将数据库异步复制到满足副本数要求的若干DN节点

3. 副本机制是怎样实现的

  • 副本摆放
    • 第一副本:上传文件的DN
    • 第二副本:与第一副本不同机架的节点
    • 第三副本:与第二副本同机架的不同节点
  • 副本系数
    • dfs.replication
    • hadoop fs -setrep -R 1 filename
    • 上传到HDFS系统的文件副本数是由当时的系统副本数决定的,不会受副本系数修改而变
  • balance策略
    • Default:DN平衡即平衡
    • Blockpool:按block算

4. CheckpointNode是什么?

  • Edits(操作序列),fsImage(快照)
  • dfs.namenode.checkpoint.period:合并周期,默认1小时
  • dfs.namenode.checkpoint.txns:edits文件阈值,默认1MB
  • 什么时候写edits呢?
    • 由DataNode的写操作触发的,当我们往DataNode写文件时,DataNode会跟NameNode通信,告诉NameNode什么文件的第几个block放在它那里,NameNode这个时候会将这些元数据信息写到edit logs文件中。

5. 机架感知怎么设置?

  • 管理员通过配置net.topology.script.file.name来决定node属于哪个机架
  • 相同的datanode举例为0,同一rack下不同dn距离为2,同一IDC下不同的dn距离为4,不同IDC下的dn距离为6

6. 关于安全模式

  • NN启动加载fsimage和editslog,之后会等待DN报告block的状态(这样的话如果副本数不够会重新复制,避免副本数足够再重新复制吧);
  • NN从DN接收心跳信号和块状态报告,块状态报告包括某个DN所有的数据块列表,每个数据块都有指定的最小副本数,当NN检测到副本数达到最小值时认为副本安全;
  • 这段等待时间,NN处于安全模式,hdfs只能读不能改。只有DN报告说hdfs中大部分block都准备就绪才可以;
  • 可以显示制定安全模式bin/hdfs dfsadmin –safemode

7. Secondary NameNode的作用?

  • SNN会将从NN中得到的fsimage和edits定期合成一个新的fsimage文件给NN,将edits日志的大小控制在一个限度下;

8. HDFS的负载均衡是怎么实现的?

  • 将数据块的一个副本放在正在写这个数据块的节点上;
  • 尽量将数据块的不同副本分布在不同的机架上,这样集群可在完全失去某一机架的情况下还能存活;
  • 一个副本通常被放置在和写文件的节点同一机架的某个节点上,这样可以减少跨越机架的网络I/O;
  • 尽量均匀地将HDFS数据分布在集群的DataNode中
  • HDFS自带有数据均衡算法,该算法会不断迭代数据均衡逻辑,直至集群内的数据均衡为止。每次迭代的逻辑是通过Rebalabcing Server从NN中获取每个DN的磁盘使用情况,然后汇总需要移动的数据分布情况,计算数据块迁移图,最后进行数据块的转移。
  • Hadoop提供了自带的工具bin/start-balancer.sh可以通过参数指定系统中的均衡标准如10%,这样就保证了系统磁盘的使用率的偏差在10%之内。如果超过这个值,系统将自动执行数据块的重分布工作使之达到偏差限额。

9. HDFS如何实现健壮性?

  • 心跳检测和重新复制:NN会根据心跳信息来标记DN的状态,DN的宕机会使得一些数据块的副本系数低于定值,NN一旦发现就启动复制
  • 快照机制:快照支持某一特定时刻数据的复制备份,利用快照可以让HDFS在数据损坏时恢复到过去一个已知的正确时间
  • 支持多 FsImage 和 Editlog 的副本:多副本在NN重启时会选择最近的完整FsImage 和 Editlog来使用;
  • 保证数据的完整性:HDFS实现了对文件内容的校验和检查,若不匹配则选择从其他DN上的数据副本。
0 0