- 3.Hadoop HDFS
- 3.1 HDFS 优点
- 3.2 HDFS 组成
- 3.3 HDFS Shell *** 作
- 3.4 HDFS API *** 作
- 3.5 HDFS 读写流程
- 3.6 HDFS NN和2NN
- 3.7 HDFS DN
- 3.6 HDFS NN和2NN
- 3.7 HDFS DN
- 3.8 HDFS 数据完整性
3.1 HDFS 优点文件系统,分布式,树型结构,针对文件的读写 *** 作,多副本容错
- 多副本
- 存储大数据
- 对机器没有要求
- NN
- 管理HDFS名称空间
- 管理副本策略
- 管理块的映射信息
- 处理客户端请求
- DN
- 存储数据块
- 执行读写 *** 作
- 2NN
-
辅助NN,定期合并Fsimage和Edits,并推送给NN
-
可恢复一部分NN数据
- Client
- 文件切分
- 从NN获取文件位置
- 在DN执行读写 *** 作
hadoop fs -xxx or hdfs dfs -xxx
hadoop fs -put xxx /yyy # put xxx to /yyy hadoop fs -appendToFile xxx /yyy/xxx # append xxx to xxx end hadoop fs -get /yyy/xxx xxx # get xxx to xxx hadoop fs -ls /xxx hadoop fs -mkdir /xxx # mkdir hadoop fs -cat /yyy/xxx hadoop fs -chmod 777 -R /yyy # chmod hadoop fs -cp /xxx /yyy # cp hadoop fs -mv /xxx /yyy # mv hadoop fs -tail /yyy/xxx hadoop fs -rm /yyy # 删除/yyy 文件夹下文件 hadoop fs -rm -r /yyy # 删除/yyy 文件夹及文件夹下文件 hadoop fs -du -h /yyy # 统计文件夹文件大小 -s3.4 HDFS API *** 作
需要先在工作环境(windows)配置hadoop的环境变量,需要一个额外的winutils.exe放置在bin目录下
// 1.fs URI uri = new URI("hdfs://hadoop102:8020"); Configuration conf = new Configuration(); String user = "root"; FileSystem fileSystem = FileSystem.get(uri, conf, user); // 2.transform // 3.close fileSystem.close();
- 配置文件优先级顺序
code configuration > resource xxx-site.xml > {HDOOP_HOME}/etc/hadoop/xxx-site.xml > {HDOOP_HOME}/etc/hadoop/xxx-default.xml
- 常用API
- 读数据流程
- client 向NN 请求上传
- NN 响应可以上传(检查权限和路径是否存在)
- client 请求上传第一个Block,请求返回DN节点
- NN 响应三个DN节点(DN1,DN2,DN3)
- client 向DN1请求建立Block传输通道,DN1 再与DN2、DN3建立通道
- DN3、DN2、DN1 响应 应答成功
- client 向DN1 传输数据Packet(64K)
- DN1 数据一份存入磁盘,一份存入内存,内存的那份在分发给DN2、DN3
- DN节点回复 client ack响应,存储成功
- 重复第5步往下,发送第二个Block,直至文件上传成功!
节点距离计算:两个节点的距离为节点到共同祖先的距离之和
存储副本选择策略:
- 本机节点
- 其他机架一个节点,保证可靠性
- 其他机架另一个节点
存储副本策略源码在:
Class:BloclPlacementPlolicyDefault
function: chooseTargetInOrder()
- 读数据流程
-
client 向NN 请求下载
-
NN 响应文件元数据
-
client 请求 DN读数据Block1(串行读数据)
-
DN 传输数据给client
-
client 接收到所有的Block后,合并文件
-
关闭资源
NN元数据:一份在内存,一份在磁盘【fsImage+Edits】
2NN: 合并【fsimage+edits】
- NN 和2NN具体工作流程
- 启动时,NN将 fsimage+edits 加载进内存
- 当client 对元数据进行增删改请求时
- NN 记录 *** 作日志【edits_inprogesss_xxx】、更新滚动日志【edit_inprogress_xxx -> edits_xxx】
- NN 在内存进行数据增删改
- 2NN 请求是否需要checkpoint
- 当满足checkpoint条件(定时默认一小时到了/edits满了),2NN请求执行checkpoint
- NN 滚动正在写的edits,记录新的 *** 作日志
- 2NN 从NN拷贝【fsimage+edits_xxx】
- 2NN 加载到内存进行合并,生成fsimage.checkpoint
- 2NN 拷贝文件到NN
- NN 把fsimage.checkpoint 更名为fsimage
- 下次启动时时,只需要把【edits_inprogress_xxx + fsimage】加载进内存即可
- fsimage和edits 文件内容查看
# 转换fsimage 格式之后,再查看 hdfs oiv -p XML -i fsimage_xxx -o /xxx/xxx/xxx.xml # fsimage 文件内不存文件块的位置信息,由DN汇报 # 转换edits 格式之后,在查看 hdfs oev -p XML -i edits_inprogress_xxx -o /xxx/xxx/xxx.xml
? DN的文件块信息到底存储再NN的哪里
3.7 HDFS DN流程
-
client 向NN 请求下载
-
NN 响应文件元数据
-
client 请求 DN读数据Block1(串行读数据)
-
DN 传输数据给client
-
client 接收到所有的Block后,合并文件
-
关闭资源
NN元数据:一份在内存,一份在磁盘【fsImage+Edits】
2NN: 合并【fsimage+edits】
- NN 和2NN具体工作流程
- 启动时,NN将 fsimage+edits 加载进内存
- 当client 对元数据进行增删改请求时
- NN 记录 *** 作日志【edits_inprogesss_xxx】、更新滚动日志【edit_inprogress_xxx -> edits_xxx】
- NN 在内存进行数据增删改
- 2NN 请求是否需要checkpoint
- 当满足checkpoint条件(定时默认一小时到了/edits满了),2NN请求执行checkpoint
- NN 滚动正在写的edits,记录新的 *** 作日志
- 2NN 从NN拷贝【fsimage+edits_xxx】
- 2NN 加载到内存进行合并,生成fsimage.checkpoint
- 2NN 拷贝文件到NN
- NN 把fsimage.checkpoint 更名为fsimage
- 下次启动时时,只需要把【edits_inprogress_xxx + fsimage】加载进内存即可
- fsimage和edits 文件内容查看
# 转换fsimage 格式之后,再查看 hdfs oiv -p XML -i fsimage_xxx -o /xxx/xxx/xxx.xml # fsimage 文件内不存文件块的位置信息,由DN汇报 # 转换edits 格式之后,在查看 hdfs oev -p XML -i edits_inprogress_xxx -o /xxx/xxx/xxx.xml
? DN的文件块信息到底存储再NN的哪里
3.7 HDFS DN存储数据、数据长度、校验和、时间戳
- 工作流程
- DN 启动后向NN注册
- NN 告知DN 注册成功
- DN每周期(6h)自查,然后向NN上传所有块信息
- NN 与DN 保持心跳机制(3s),正常工作中
- 当超过默认值10min+30s没有收到DN 的心跳,则NN 判定DN 不可用
对待上传的数据加一个校验位,crc校验位,类似于奇偶校验
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)