前言
在前面的几章内,我们介绍了Hadoop Shell 命令 与 WordCount与Hadoop HDFS的Java API使用. 本章我们稍微讲解下Hadoop的客户端提交、Hadoop服务端 、Secondary namenode原理.
概述
- HDFS集群分为2大角色:
NameNode与DataNode/Secondary NameNode. -
NameNode负责整个文件系统的原数据. -
DataNode负责管理用户的文件数据块. - 文件会被按照固定大小(blocksize)切分成若干块后分布式存储在若干台
NameNode上. - 每一个文件有多个副本(Replication), 并放在不同的
datanode上. -
datanode会定期汇报自身所保存的文件的block信息, 而namenode则会负责保持文件的副本数量. - HDFS的内部机制对客户端保持透明, 客户端请求访问HDFS都是通过向
namenode申请来进行.
客户端写文件基本流程
- 客户端向
namenode结点发送请求上传文件(例如:/hello.sh). -
namenode响应可以上传. -
RPC请求上传第一个block(0-128M), 请返回DataNode. - 适配符合的
datanode(例如:sean60/sean61). 考虑因素(空间/距离)
4.1. 第一个考虑距离client端最近的结点;
4.2. 第二个再另外一个虚拟机上挑选一个datanode进行拷贝.
4.3 第三个考虑不同机架上的datanode结点.(机架感知-配置) - 请求建立block传输通道channel.
5.1pipeline同机器间请求建立通道.
5.2pipeline请求建立通道 - 请求成功, 开始传输数据.
6.1 应答成功.
6.2 应答成功.
- 注: 每次传输
packet时,有一个64K的缓冲池.- 相同管道流内是同步进行传输.
- 当一个
datanode上传输完成后即完成, 没必要等待所有的副本都传输完成. - 传输时,
chunk是以512Byte进行校验.
客户端读文件基本流程
- 客户端向
namenode结点发送请求下载某个文件(例如:/hello.sh). -
namenode响应, 并将存储的结点信息通知客户端.(例如:/hello.sh ({BLK_1, BLK_2} {BLK_1: sean60,sean62})) - 客户端根据返回信息, 查询BLK, 并且选择其中的一个BLK, 与其建立管道.
-
BLK所在的datanode响应信息, 建立Socket管道, 开始传输数据. - 对于其他块, 重复上述的3, 4两个步骤.
NameNode & Secondary NameNode 基本运行机制
NameNode的工作流程
- 更新内容(增删查改等操作).
- 记录操作日志(
edits.inprocess-edits.0002/edits.0003)
SecondaryNameNode的工作流程
-
SecondaryNameNode向NameNode请求是否需要checkPoint. - 请求
checkpoint. -
namenode滚动正在写的edits. -
secondary name node下载滚动的文件到本地. -
secondary name node将文件加载到内存并合并. -
secondary name nodedump新的image文件. -
secondary name node将新的image文件上传到namenode目录下. -
namenode将下载的image文件其重命名为fsimage.
- 注: 格式化命令
hdfs namenode -format [-cluster <cluster_id>] -
dfs.namenode.dir.current目录下,format同时也会生成fsimage与edits文件, 及与其对应的md5校验文件. -
seen_txid文件记录的是edits滚动的序号, 每次重启namenode时,namenode就知道哪些edits进行加载edit.
DataNode相关信息
-
dfs.blockreport.inervalMsec汇报时间(1H默认). -
heartbeat.recheck.interval心跳机制(10分钟30秒).
Q&A
Q1: NameNode如果宕机, hdfs是否还能够继续执行?
A1: 不能.Secondary Name Node并不具有NameNode的权限与职能.
Q2: 如果
NameNode的磁盘损坏, 元数据是否还能恢复? 如果需要恢复, 如何恢复?
A2: 能恢复绝大部分内容. 将Secondary Name Node的部分拷贝到NameNode目录下即可.
Q3: 通过以上思考, 在配置
NameNode工作目录时, 有什么注意点?
A3: 尽量将Secondary NameNode与NameNode的工作目录分开存放.NameNode的有时也可以配置在多块磁盘上.dfs.namenode.name.dir也可以配置多块磁盘./data1/dfs/name,/data2/dfs/name,/data3/dfs/name.