HDFS原理

1.HDFS简介

image-20230411101138941

image-20230411101205152

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存储架构

image-20230411102812915

image-20230411103704467

2.1 元数据

  • 元数据持久化:1)fsimage 2)edits
  • namenode内存大小,决定了整个集群的规模,因为每个文件都会在namenode中存储150字节的元数据信息
  • 机架感知:每个block通过机架感知,获取存储的位置

2.2 总结与思考⭐

1)HDFS采用传统的主从架构,有一个NAMENODE和多个DATANODE组成

2)NAMENODE内存大小,决定集群大小


3.HDFS文件读写原理⭐⭐⭐⭐⭐

image-20230411103918534

3.1 HDFS写数据

image-20230411104743057

  1. 发出RPC(远程过程调用),请求上传文件
  2. namenode检查元数据文件的目录树,查看文件是否存在
  3. 告诉客户端,可以上传
  4. 请求上传第一个block
  5. 检查datanode信息池,找出可以用的datanode
  6. namenode返回可用的datanode列表,例如:datanode01 datanode02 datanode03
  7. 和datanode01建立管道(Pipeline)--->和datanode02建立管道(Pipeline)--->和datanode03建立管道(Pipeline)
  8. 返回建立完毕信息
  9. 客户端和datanode之间建立数据流,开始发送数据
  10. 以package为单位发送数据
  11. 返回ACK确认信息
  12. 通知客户端,block发送完毕,请求发送下一个block

3.2 HDFS读数据

image-20230411105830623

  1. 客户端发送RPC请求,获取被读取文件block数据块所在位置
  2. namenode发挥blcok的datanode地址列表,例如:
block01: DataNode01 DataNode02
block02: DataNode02 DataNode03
block03: DataNode01 DataNode03
  1. 通过机架感知,选取离自己较近的datanode,选取健康状况较好的datanode,然后与datanode建立数据传输流,读取block
  2. 客户端将读取的block合并成一个完整的文件

3.3 总结与思考⭐

1)HDFS写数据,提交申请-->提供datanode-->建立管道-->数据传输,为了保证完整性,会在过程中进行多次确认

2)HDFS读数据,提交申请-->提供datanode-->读取数据

4.HDFS的shell操作

image-20230411110309292

hadoop fs <args> ## 既可以hdfs系统,也可以操作其他文件系统
hadoop dfs <args> ## 主要操作hdfs文件系统
hdfs dfs <args>  ## 主要操作hdfs文件系统

image-20230411110530260

image-20230411110608682

hadoop fs -ls /
hadoop fs -mkdir -p /itcast/hadoop
hadoop fs -put -f install.log /  ## -f 如果文件已经存在,则覆盖
## 常用的是第一个和第三个

4.1 通过shell脚本实现hdfs文件上传

image-20230411111315282

image-20230411111256757

image-20230411111418354

image-20230411111515176

5. HDFS的java API操作

5.1 HDFS java API 介绍

image-20230411112248626

image-20230411112505864

image-20230411112905629

image-20230411112955792

5.2 JAVA API 操作HDFS案例

image-20230411140930842

  • POM依赖

image-20230411141026154

image-20230411141212987

image-20230411141327950

@Before
加在init方法前,表示最开始运行的方法
@Test
加在testAddFileToHdfs方法前,表示可运行的方法
  • 创建/重建/删除目录

image-20230411142117810

  • 下载文件到本地

image-20230411141832664

  • 查看文件信息

image-20230411142334007

image-20230411142441081

posted @ 2023-06-28 16:16  付十一。  阅读(42)  评论(0)    收藏  举报