Hadoop-HDFS
-
背景
-
管理分布式文件的一个系统
-
适合一次写入多次读取的情况
-
-
优点
-
高容错性
-
存储多个副本
-
可以利用副本进行数据恢复
-
-
适合处理大数据
-
数据规模可以随着结点数量增加处理的规模
-
文件规模同上
-
-
可以构建在廉价的服务器上
-
-
缺点
-
不适合低延时数据的访问
-
无法高效对大量小文件进行存储
-
存储大量小文件会占用大量NameNode空间存储目录信息
-
小文件读取时寻址时间会超过读取时间,有违背hdfs设计的初衷
-
-
不支持并发写入、文件随机修改
-
一个文件只能有一个写入,不支持多个线程同时写
-
仅支持数据追加,不支持文件的随机修改
-
-
-
基本组成
-
NameNode
-
管理HDFS的命名空间
-
配置副本策略
-
管理block的映射信息
-
处理客户端的读写请求
-
-
DataNode
-
存储实际的数据块
-
执行数据块的读写操作
-
-
client
-
文件切分
-
与NameNode进行数据交互,获取文件的位置信息
-
与DataNode进行交互,读取或者写入数据
-
client提供一些命令来管理HDFS,比如NameNode格式化
-
client可以通过一些命令来访问HDFS,比如对HDFS增删改查操作
-
-
secondary NameNode
-
并非NameNode的热备份,当NameNode挂掉的时候,其并不能马上替换NameNode并提供服务
-
辅助NameNode,分担其工作量,比如定期合并fsimage和edits
-
紧急情况下可辅助恢复NameNode
-
-
-
HDFS的块
-
2.x之前64M
-
2.x之后128M
-
决定块大小的因素
-
磁盘传输的效率,现在市面上的传输效率大概为100M/s,向计算机的整数取整则为128M
-
HDFS设置太小会增加寻址时间,可能会导致程序一直在寻找块的开始位置
-
-
-
hdfs的shell指令
-
在操作hdfs系统上hadoop fs 和hdfs dfs 效果一样
-
上传
-
hdfs dfs -put 本地路径 hdfs路径
-
hdfs dfs -copyFromLocal 本地路径 hdfs路径
- 拷贝本地文件到hdfs上
-
hdfs dfs -moveFromLocal 本地路径 hdfs路径
- 把本地文件剪切到hdfs上
-
hdfs dfs -appendTofile 本地路径 hdfs路径
-
-
下载
-
hdfs dfs -copyToLocal hdfs路径 本地路径
- 下载hdfs上的文件
-
hdfs dfs -get hdfs路径 本地路径
- 下载hdfs上的文件
-
hdfs dfs -getmerge hdfs路径 本地路径
- 合并下载的多个文件
-
-
一些常用操作
-
-ls
- hdfs dfs -ls hdfs上的路径
-
-mkdir
- hdfs dfs -mkdir /hdfs上的路径
-
-cat
- hdfs dfs -cat /hdfs上的路径
-
-chagrp、-chmod、-chown(修改所属组,修改权限,修改所需组和所有者)
-
hdfs dfs -chmod 777 /hdfs的文件路径
-
hdfs dfs -chown 用户名:所属组 /hdfs上的路径
-
hdfs dfs -chgrp 所属组名称或者路径 /hdfs上的路径
-
-
-cp
-
hdfs dfs -cp /hdfs上的路径 /hdfs的路径
-
hdfs dfs -cp /hdfs上的路径 /本地路径(最好写绝对路径,相对路径也可以)
-
-
-tail
- hdfs dfs -tail /hdfs上的路径
-
-rm
-
hdfs dfs -rm 【-r】 【-f】/hdfs上的路径
-
-r是递归
-
-f是删除文件,不是文件夹
-
-
-
-rmdir
- hdfs dfs -rmdir /hdfs上的路径
-
-du
-
hdfs dfs -du 【-s】 【-h】 /hdfs上的路径
-
-s是将所有文件大小求和后输出
-
-h是将文件存储单位由字节转换为最合适查看的单位(比如128M,64KB等等)
-
-
-
-setrep
-
-
-
客户端上的操作
-
环境配置
-
下载所需依赖
-
将依赖添加到环境变量中
-
创建Maven工程
- 添加依赖和日志
-
-
利用hdfs的API进行文件的上传、下载、删除、移动等操作
- 待添加
-
-
HDFS的数据流
-
文件写入
-
简述一下,
-
客户端,即上传者,对NameNode发起传输请求,NameNode接收后返回一个允许的信号
-
客户端发送第一个文件(大于块的则需要请求第二次,重复当前所需所有步骤,因为hdfs上数据的传输 都是按照块进行的)请求获取存储的DataNode
-
NameNode返回存储数据和数据副本的DataNode结点是那些
-
客户端向最近的数据结点发送连接请求
- 这个最近的距离是有限制的,和副本保存机制相关
-
数据结点进行应答
- 最近的数据结点如果能够存储则响应,否则就让他去请求其他结点,
-
对数据进行传输
-
注意此处只传输了一次,没有多次传输,因为备份的问题不归客户端考虑,备份是由hdfs进行考虑的
-
数据传输到第一个结点后,剩余的数据备份就交给获得了数据的结点进行操作,(如果数据结点宕机则寻找下一结点)具体描述如下
-
假设备份为三,存储在h1,h2,h3 上,当前h1获得了数据
-
h1会和h2建立数据通信,类似于客户端与H1建立通信一样
-
然后h2完成后,交给h2去和h3 进行通信数据备份
-
-
-
-
网络拓扑节点距离的计算
- 迪杰特斯拉拓扑算法
- 通俗点讲就是必须经过的路线距离,不能凭空穿越,要有连接
- 迪杰特斯拉拓扑算法
-
副本结点的选择
-
hadoop3.x
-
第一个是放在客户端所处结点上,如果客户端在结点外,则随机选择一个结点存储
-
第二个副本放在另一个同一集群不同机架的服务器上的结点
-
第三个副本放在和第二个副本同一机架上的不同结点上
-
-
hadoop2.x
-
第一个是放在客户端所处结点上,如果客户端在结点外,则随机选择一个结点存储
-
第二个副本放在另一个同一集群不同机架的服务器上的结点
-
第三个副本放在和第一个副本同一机架上的不同结点上
-
-
-
文件读取
-
简述
-
客户端发送请求下载的请求
-
NameNode查找客户端请求下载的数据的元数据信息,查找到则返回元数据信息给客户端
-
客户端按照NameNode返回的元数据信息去DataNode上寻找数据块,同时发送下载数据的请求,和通道建立请求(不需要考虑其他副本所在结点是否需要请求,除非当前结点宕机,才会和其他结点请求)
-
数据块所在的DataNode响应客户端的请求,完成数据通道建立(如果请求下载的文件大于块大小,即由多块组成,则在当前数据块下载完成后,在请求下一块的下载,不用再和NameNode通信,因为之前NameNode已经将元数据返回,直接和下一个DataNode请求就好)
-
-
-
-
NameNode和SecondaryNameNode工作机制
-
NameNode中的内容是在内存和磁盘都存在的,只是磁盘上的内容会滞后,而NameNode几乎没有多余的容量去进行磁盘的写入
-
因此磁盘的写入由secondaryNameNode进行,磁盘上写入的数据存储在fsimage中
-
NameNode工作机制
-
简述
-
NameNode启动后
- (不是第一次,第一次格式化启动后会建立data和logs文件夹,建立fsimage和edits文件)
-
加载edits文件和fsimage文件
-
当元数据收到修改请求(增删改。。。),会对该操作进行记录,记录到日志文件edits中
-
然后更新元数据
-
-
-
secondaryNameNode工作机制
-
NameNode的冷备份
-
简述
-
随时和NameNode进行监听,checkpoint(检查点)
-
checkpoint触发条件
-
定时触发
-
edits中的数据满了(达到一定阈值)
-
-
-
触发checkpoint后,滚动NameNode中的edits _log文件,拷贝到secondaryNameNode,同时也将fsimage拷贝到secondaryNameNode,将edits和fsimage合并,同时生成新的fsimage,将新的fsimage拷贝到NameNode中
- 解释:滚动edits_log是将原来的edits_log进行拷贝,同时改名方便后续合并和拷贝,实际上NameNode上还有一个edits_log在记录操作日志
-
-
-
查看fsimage文件
-
oiv
-
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后输出的路径
-
文件类型一般是xml
-
-
-
查看edits文件
-
oev
-
hdfs ove -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
-
文件类型一般是xml
-
-
-
checkpoint
-
在NameNode和secondaryNameNode中有个关键的连接点checkpoint
-
其操作指令数量阈值为100W条
-
时间阈值为1小时,到时间就上传
-
-
-
DataNode
-
工作机制
-
每个DataNode在加入集群时都需要向NameNode报备注册
-
注册成功后NameNode会返回一个信号
-
此后,DataNode每隔一个周期(一小时)都需要向NameNode发送一次所拥有块的信息,同时每3秒发送一次心跳,告知NameNode存活
- 注意心跳不同于前面的信息告知
-
当DataNode超过一定时间(10分钟+30秒)未向NameNode发送心跳,NameNode则会认为该DataNode死亡,该节点不可用
-
-
数据完整性
-
数据校验
- 各种算法
-
在读取文件时,会对文件进行校验和计算,如果校验发现文件受损,则读取其他模块的副本
-
-
新DataNode服役
-
在不考虑安全的情况下
- 可以直接加入NameNode集群(配置文件中有NameNode信息)
-
在设置黑白名单后
-
白名单中的数据结点可以正常加入NameNode
-
不在白名单中的数据结点会被退出
-
白名单的设置
-
修改配置文件hdfs-site.xml
-
新建白名单文件
-
重启NameNode和刷新NameNode
-
-
-
在黑名单中的结点会被强制退出(退役)
-
黑名单的设置
-
修改配置文件hdfs-site.xml
-
新建黑名单文件
-
重启NameNode并刷新NameNode
-
-
-
-
-
DataNode多级目录
-
多级目录不是副本
-
过程
- 配置hdfs-site.xml文件
-
-