DataNode启动过程:
1. 从dfs.data.dir得到DataNode存储数据的目录
2. 得到dataNode服务器名称:从配置slave.host.name读取,如果没有,则尝试根据DNS读取,hadoop环境中机器识别以及网络拓扑结构组建请参见前面介绍NameNode的文章
3. 从config中得到NameNode地址,建立RPC连接,从NameNode处拿到版本号,和自己的版本号对比,如果不同,则说明NameNode和DataNode的hadoop jar包版本不同,不能使用,启动失败
4. 分析dataNode上每个dataDir的状态
a) 如判定文件夹是否存在,是否可读可写
b) 根据启动状态判定是否合法,如Formate时文件夹是否存在,Import时是否需要做数据升级等,其判断逻辑和NameNode一样,因为NameNode和DataNode存储数据到文件夹的操作都是storage类
5. 在端口dfs.datanode.address启动DataXceiverServer,用来和Client或DataNode之间传输block数据,配置dfs.datanode.max.xcievers控制DataNode同时建立的连接数,默认256,配置dfs.block.size默认的block大小,默认64M
6. 在端口dfs.datanode.http.address启动InfoServer
7. 在端口dfs.datanode.ipc.address启动RPCServer
8. 根据dfs.datanode.scan.period.hours配置的扫描间隔时间启动DataBlockScanner
9. 主线程中:
a) 检测升级过程
b) 定时和NameNod发送心跳包通信,从NameNode处拿回操作,如DNA_TRANSFER,DNA_INVALIDATE,DNA_SHUTDOWN等
i. DNA_TRANSFER:传输block数据到其他DataNode,首先验证要传输的block是否有效,如果无效则会告知NameNode做相应处理,然后启动DataTransfer线程传输数据到指定DataNode,按照block传输逻辑做相应处理。
ii. DNA_INVALIDATE:block无效(如block备份数过大,需要删除一些备份),将要删除的Block加到DataBlockScanner中,按照扫描逻辑做相应处理。
iii. DNA_SHUTDOWN:表示要停止该DataNode,该命令是通过向NameNode发送
iv. DNA_REGISTER:向NameNode发送注册消息,当NameNode重新启动时,NameNode处理DataNode发送来心跳包时,发现自己没有记录该DataNode的信息,就会让发送该命令,让DataNode重新注册。
v. DNA_FINALIZE:
vi. UC_ACTION_START_UPG