Hadoop系列一HDFS简介

HDFS架构


NameNode(NN)
  • 接受客户端的读写服务
  • 保存metadata信息,包括文件的所属和权限和文件分割块信息
  • Block保存在哪个DataNode上(该数据由DataNode上报)

NameNode的metadata信息在启动后会加载到内存中,metadata信息存储在磁盘文件fsimage,edits文件记录对metadata的操作日志,Block位置信息只存在内存,不保存到fsimage。

SecondaryNameNode(SNN)

不是NN的备份,但是可以备份部分,主要工作是帮助NN合并edits的log,减少NN启动时间。SNN执行合并时机有2种,1种是间隔3600秒,2是根据edits文件的最大值来确定,默认为64M。

DataNode(DN)
  • 存储数据(Block)
  • 启动DN线程的时候会向NN汇报block信息

通过向NN发送心跳保持与其联系,默认3秒/次,如果NN在10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其他DN。

SNN合并流程

SNN

  1. SNN会定期的检查NN节点中Edits日志文件的大小。
  2. 若Edits文件大小或者时间间隔达到合并时机,SNN将请求下载Edits和FsImage文件。
  3. NN在SNN下载文件的同时,创建一个新的Edits文件,后续对文件系统的操作都记录到该文件中。
  4. SNN将下载的文件进行合并,输出fsimage.ckpt。
  5. SNN通知NN节点,让NN节点下载fsimage.ckpt,并替换原来的fsimage文件。同时将edits.new文件重命名为edits。

HDFS读写操作

  • 读操作


    1. 客户端用FileSystem的open()函数打开文件,DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。对于每个数据块,元数据节点返回保存数据块的DataNode节点的地址。
    2. DistributedFileSystem返回FSDataInputStream给客户端。客户端调用read()函数开始读取数据。
    3. FSDataInputStream连接保存保存文件第一个数据块的最近的数据节点。当数据块读取完毕时,FSDataInputStream 关闭和此数据节点的连接,然后开始连接此文件下一个数据块的最近节点,直到该文件所有数据块全部被读取完毕。
    4. 在读取过程中,如果有DataNode节点通信出现错误,则尝试连接下个包含该数据块的DataNode节点,失败的节点被记录,以后不再连接。
  • 写操作

    hdfswrite

    1. 客户端调用create()创建文件,DistributedFileSystem调用RPC在文件系统的命名空间中创建一个文件。

      NameNode节点需要确认源文文件不存在,并且客户端有写入的权限,才会创建文件。

    2. DistributedFileSystem返回FSDataOutputStream,供客户端调用写入文件。

    3. FSDataOutputStream将文件分成块,写入data queue。data queue由Data Streamer读取,并曲子NameNode节点分配数据DataNode节点,用来存储数据块。分配的DataNode几点在一个pipeline里。

    4. Data Streamer将数据块写入pipeline中的第一个DataNode,第一个DataNode将数据块发送给第二个DataNode,第二个发送到第三个DataNode。

    5. FSOutputStream为已经发出去的数据块保存了ack queue,等待pipeline中DataNode告知数据写入成功。

    6. 如果DataNode在写入的过程中失败:

      • 关闭pipeline,将ack queue中的数据块放入data queue的开始。
      • NameNode标识已经写入数据块的DataNode节点,则错误节点在重启后可以察觉其数据块是过时的,会将其删除。
      • NameNode节点会被通知此数据块时副本不足,将来会创建新的副本。
    7. 当客户端结束写入数据,则调用close函数,此操作将所有数据库写入pipeline中的DataNode节点,并等待ack queue返回成功,最后通知NameNode节点写入完毕。

Block数据块

  1. 第一个副本放在上传文件的DN上,如果是集群外提交,则随机挑选一台,cpu不忙的节点。
  2. 第二个副本放在与第一个副本不同机架的节点上。
  3. 第三个副本与第二个副本放在相同机架的节点上。

文件权限

HDFS支持权限控制,但比较弱,支持按用户、用户组、其他用户的读写执行控制权限。HDFS权限目的还是阻止好人做错事,而不是阻止坏人做坏事。用户上传文件到HDFS,那么文件所有者就是该用户,不管Linux中该用户是否存在。

安全模式

当集群启动时,会首先进入安全模式。NameNode节点首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中各项操作。一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。

此刻NameNode运行在安全模式,即NameNode的文件系统对于客户端来仅仅是可读的。(只显示目录、文件内容等,写、删除、重命名都会失败)。

该阶段NameNode收集各个DataNode的报告,当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。数据块达到最小副本数以上时,会被认为是安全的。在一定比例的数据块被确定为安全后,过若干时间,安全模式结束。

HDFS优缺点

优点:

  • 高容错性
  • 适合批处理
  • 适合大数据处理
  • 可以构建在廉价机器上。

缺点:

  • 低延迟数据访问,比如毫秒级、低延迟与高吞吐量。
  • 小文件存取占用NameNode大量内存,寻道时间超过读取时间。
  • 不支持并发写入、文件随机修改。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值