HDFS原理
1.HDFS简介
1.1 HDFS优点
- 高容错:副本+namenode机制,保证高容错
- 流式数据访问:提供API接口,通过字节流访问文件
- 支持超大文件:对文件进行切片,切分成block,多大文件都可以存储
- 高数据吞吐量:一次写入,多次读取,不支持随机写入,只支持追加
1.2 HDFS缺点
- 高延迟: 存时需要切片,并要复制成3个副本
- 不适合小文件存取:因为一个1kb的小文件,也会在namenode中生成150字节的元数据信息,小文件过多,增加namenode的压力,如果要存储小文件,在上传到hdfs前,进行小文件合并
- 不允许并发写入:只适合追加写入
1.3 总结与思考⭐
1)HDFS的元数据,metadata用于存储文件目录信息;存储相关信息;datanode信息
2)HDFS优点:副本机制支撑的高容错;切分后能够存储超大文件;高数据吞吐量;流式数据访问
3)HDFS缺点:高延迟;不允许并发写入;不适合小文件存储;事务支持不完善
2.HDFS存储架构
2.1 元数据
- 元数据持久化:1)fsimage 2)edits
- namenode内存大小,决定了整个集群的规模,因为每个文件都会在namenode中存储150字节的元数据信息
- 机架感知:每个block通过机架感知,获取存储的位置
2.2 总结与思考⭐
1)HDFS采用传统的主从架构,有一个NAMENODE和多个DATANODE组成
2)NAMENODE内存大小,决定集群大小
3.HDFS文件读写原理⭐⭐⭐⭐⭐
3.1 HDFS写数据
- 发出RPC(远程过程调用),请求上传文件
- namenode检查元数据文件的目录树,查看文件是否存在
- 告诉客户端,可以上传
- 请求上传第一个block
- 检查datanode信息池,找出可以用的datanode
- namenode返回可用的datanode列表,例如:datanode01 datanode02 datanode03
- 和datanode01建立管道(Pipeline)--->和datanode02建立管道(Pipeline)--->和datanode03建立管道(Pipeline)
- 返回建立完毕信息
- 客户端和datanode之间建立数据流,开始发送数据
- 以package为单位发送数据
- 返回ACK确认信息
- 通知客户端,block发送完毕,请求发送下一个block
3.2 HDFS读数据
- 客户端发送RPC请求,获取被读取文件block数据块所在位置
- namenode发挥blcok的datanode地址列表,例如:
block01: DataNode01 DataNode02
block02: DataNode02 DataNode03
block03: DataNode01 DataNode03
- 通过机架感知,选取离自己较近的datanode,选取健康状况较好的datanode,然后与datanode建立数据传输流,读取block
- 客户端将读取的block合并成一个完整的文件
3.3 总结与思考⭐
1)HDFS写数据,提交申请-->提供datanode-->建立管道-->数据传输,为了保证完整性,会在过程中进行多次确认
2)HDFS读数据,提交申请-->提供datanode-->读取数据
4.HDFS的shell操作
hadoop fs <args> ## 既可以hdfs系统,也可以操作其他文件系统
hadoop dfs <args> ## 主要操作hdfs文件系统
hdfs dfs <args> ## 主要操作hdfs文件系统
hadoop fs -ls /
hadoop fs -mkdir -p /itcast/hadoop
hadoop fs -put -f install.log / ## -f 如果文件已经存在,则覆盖
## 常用的是第一个和第三个
4.1 通过shell脚本实现hdfs文件上传
5. HDFS的java API操作
5.1 HDFS java API 介绍
- hadoop api 官方文件:https://hadoop.apache.org/docs/stable/api/index.html
5.2 JAVA API 操作HDFS案例
- POM依赖
@Before
加在init方法前,表示最开始运行的方法
@Test
加在testAddFileToHdfs方法前,表示可运行的方法
- 创建/重建/删除目录
- 下载文件到本地
- 查看文件信息