- 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服务绑定地址
- core-site.xml
-
- 注意:这里指定一个network interface 地址(hostname),如果指定本地回环地址(localhost、127.0.0.1)将无法远程访问。
- 配置Hadoop临时目录(防止Linux重启,数据丢失)
- hdfs-site.xml
- 配置HDFS默认副本系数(默认是3)
- 格式化HDFS
- 第一次启动HDFS之前执行。
- 注意,多次执行的话,应该清空Hadoop临时目录
- bin/hdfs namenode -format
- 第一次启动HDFS之前执行。
- 每个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
- client 通过blocksize和Replication Factor ,将文件切分成block,
- HDFS读文件流程:
- Client向NameNode请求 file相关的Metadata
- 获取两部分:all blocks(primary) for this file 和 list of sorted DataNodes(副本) for each block
- Client 从first sorted DataNode 读取数据
- Client向NameNode请求 file相关的Metadata
- HDFS读写数据,本质上,都需要两次交互:
- 第一次,Client与NameNode交互,获取相关信息(sorted NameNode地址等)
- 第二次,Client与sorted NameNodes交互,读写数据
- HDFS不适合小文件存储:
- HDFS文件存储,会以Metadata信息占用NameNode的资源。大量小文件,对NN造成压力。
- HDFS访问延迟比较高。