hadoop-HDFS
一、HDFS
- HDFS:Hadoop Distribution File System
- HDFS有三个部分:NameNode、DataNode、Secondary NameNode
- 适合一次写入、多次读取、不支持文件修改的情况
- 无法高效的对大量小文件进行存储
- 不支持并发写入、文件随机修改,仅支持数据append
- DataNode里面:文件不是整个存储的,是分成一个个block(块),默认一个block为128M
二、数据流
分上传、下载两个部分,这是重点
上传:
客户端(client)读取文件A(假设200M)
client向NameNode申请
NameNode审核后,同意申请client的请求
client将200M的文件逻辑切分成128M和72M
- client输出流,请求NameNode上传第一个block
- NameNode返回DataNode的list,存储副本几个,list就有几个。这里有节点选择策略
- client依次向DataNode请求建立通道
- DataNode向client回复应答成功,注意这个通道是串联的
- client向DataNode传数据包,64KB一个
- 第一个block传完后,重复7~9,传第二个block。每次传block,返回的DataNode的list不一定相同。
- client向NameNode给信息,传输完毕
下载:
- client向NameNode发起下载请求
- NameNode告诉client文件是否存在
- client向NameNode请求下载block
- NameNode向client返回DataNode的list
- client向DataNode请求建立通道
- DataNode向client回复应答成功
- DataNode向client传输block
- client向NameNode请求下载第二个block
网络拓扑-节点距离计算
- HDFS上传时,NameNode自动选择距离上传数据最近的DataNode
三、shell工具
1 | hadoop fs -put xxxxxx |
- Hadoop fs 命令分类
1 | 本地 ->> HDFS |
四、客户端操作
maven:管理jar、项目的工具。我们往项目里导入依赖,可能会出现jar包冲突。
要写API,大致如下
1 | public class HDFSClient{ |
五、NN和2NN的关系
- NN的元数据:放在内存里,因为快,因此内存一定要长期工作。
Redis | Hadoop(NN) |
---|---|
RDB | 类RDB:Fsimage,相当于内存的一个存档,记录内存的状态 |
AOF | 类AOF:edits.log,记录每一步操作 |
- 持久化使用Redis:RDB加载高效但生成慢、AOF生成快但加载慢
- NN的工作机制
- NN加载编辑日志和镜像文件到内存里,即edits_inprogress_001和fsimage
- client申请元数据的增删改请求
- NN记录操作日志、更新滚动日志
- 内存数据增删改
2NN
- 向NN请求需要CheckPoint,触发条件:定时到,Edits中的数据满了,NN启动时
- 请求执行CheckPoints
- NN将edits_inprogress_001改名为edits_001,并新建一个edits_inprogress_002
- NN将fsimage和edits_001拷贝给2NN
- 2NN加载fsimage和edits_001
- 2NN生成新的fsimage.chkpoint
- 2NN拷贝fsimage.chkpoint到NN
- NN将fsimage.chkpoint重命名为fsimage
2NN设定的时间为1小时
1 | hdfs-default.xml |
- fsimage和edits放在
hadoop/data/tmp/dfs/hanem/current
里面
1 | 查看fsimage和edits |
六、DataNode
- DataNode里存放着block
每个block都存放这数据、数据长度、校验和、时间戳
DataNode启动后向NameNode注册
- DataNode每周期上报所有块信息
- DN每3秒一次心跳:心跳返回带有NN给DN的命令,大概失联十分钟就认为这个DN坏了
数据完整性:crc校验和
如何加新机器,扩展集群,重复集群的方法
- 如何退役旧机器:白名单比黑名单严格
1 | 一定要在主机配置文件里面 |
- DN的多目录配置,注意,配置了两个文件。用于扩展DN的容量。在Linux下,新增一块硬盘,会挂在在某个文件下,这个和windows不一样。
1 | vim hdfs-site.xml |