• HDFS架构:
    • 1Master(NameNode、NN),带N个Slaves(DataNode,DN)

  • 心跳机制:
    • DN定期发送心跳包,给NN,报告自身及block信息。
    • NN汇总Blockreport,维护Metadata(元数据信息)
      • 包括filename、number of Relicas、block ids等等


  • 文件分块(block)
    • 默认blocksize=128M
  • 副本机制
    • 基于block的复制
    • 默认副本系数(Replication Factor)是3
  • 类似Elasticsearch的分片、复制


  • 副本分布策略
    • 第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的)。
    • 第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。
    • 第三个副本放置在与第二个副本所在节点同一机架的另一个节点上


  • 配置HDFS:
    • core-site.xml
      • 配置HDFS服务绑定地址
    • 注意:这里指定一个network interface 地址(hostname),如果指定本地回环地址(localhost、127.0.0.1)将无法远程访问。
  • 配置Hadoop临时目录(防止Linux重启,数据丢失)
  • hdfs-site.xml
    • 配置HDFS默认副本系数(默认是3)


  • 格式化HDFS
    • 第一次启动HDFS之前执行。
      • 注意,多次执行的话,应该清空Hadoop临时目录
    • bin/hdfs namenode -format


  • 每个daemon服务进程,都会有logs日志的概念
    • 记录日志、查看日志、分析日志非常重要。

  • 监控HDFS服务状态的web服务:
    • namenode_hostname:50070


  • HDFS访问:
    • shell操作
    • java Client操作
      • 使用CDH 5 Maven Repository
      • 引入cdh版本的hadoop-client
      • 关键是获取FileSystem对象,所有操作都是基于此

  • HDFS写数据流程
    • client 通过blocksize和Replication Factor ,将文件切分成block,
      • 按block依次写入HDFS
    • Client,请求NameNode,
      • 返回sorted DataNode地址
    • Client只向first DataNode发送block数据
      • sorted DataNodes 内部,通过Replication Pipeline,完成副本的复制
    • 一旦当前block传输、复制完毕,sorted DataNodes发送Done给NameNode
      • 最终NameNode会保存Metadata
Hadoop HDFS
Hadoop HDFS



  • HDFS读文件流程:
    • Client向NameNode请求 file相关的Metadata
      • 获取两部分:all blocks(primary) for this file 和  list of sorted DataNodes(副本) for each block
    • Client 从first sorted DataNode 读取数据
Hadoop HDFS

  • HDFS读写数据,本质上,都需要两次交互:
    • 第一次,Client与NameNode交互,获取相关信息(sorted NameNode地址等)
    • 第二次,Client与sorted NameNodes交互,读写数据


  • HDFS不适合小文件存储:
    • HDFS文件存储,会以Metadata信息占用NameNode的资源。大量小文件,对NN造成压力。
    • HDFS访问延迟比较高。

相关文章: