HDFS
HDFS的使用场景
适合一次写入,多次读出的场景,且不支持文件的修改。
HDFS优点和缺点
优点
- 高容错性
- 适合处理大数据
- 可构建在廉价机器上,并通过多副本机制提高可靠性
缺点
- 不适合低延时数据访问
- 无法高效的对大量小文件进行存储(小文件的寻址时间会超过读取时间,违反HDF的设计目标)
- 不支持并发写入,文件随机修改(仅支持数据的追加)
HDFS文件块的大小(重点)
HDFS中的文件是分块存储(Block),块的大小通过参数(dfs.blocksize)来控制
默认大小 128M(2.x)64M(1.x)
如何规定的默认大小(主要取决于磁盘传输速率)
-
寻址时间约10ms,
-
寻址时间为传输时间的1%时,则为最佳状态。
-
目前磁盘的传输速率普遍100MB/s
-
传输时间:10ms / 0.01 = 1s
-
block大小: 1s * 100MB/s = 100MB
常用命令
启动Hadoop集群
sbin/start-dfs.sh
sbin/start-yarn.sh
上传
-
-moveFromLocal 剪切粘贴
hadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
-
-copyFromLocal(-put) 复制粘贴
hadoop fs -copyFromLocal README.txt /
hadoop fs -put ./liubei.txt /user/atguigu/test/
-
-appendToFile 追加到一个文件(已经在HDFS中存在)的文件末尾
hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
下载
-
-copyToLocal(-get) 复制粘贴
hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./
hadoop fs -get /sanguo/shuguo/kongming.txt ./
-
-getmerge 合并下载多个文件(不会对HDFS中的文件进行合并)
hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
HDFS直接操作
-
-du 统计文件夹的大小信息
hadoop fs -du -h /user/atguigu/test
-
-setrep 设置HDFS中文件的副本数量
(最终副本量还是取决于节点数 这里只是改了设置只有节点数达到才生效)
hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
HDFS写数据流程
网络拓扑(节点距离计算)
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?(节点距离:两个节点到达最近的共同祖先的距离总和。)
拓扑排序
机架感知(副本存储节点选择)
副本节点选择
- 第一个副本:在Client所处的节点上,如果客户端在集群外,随机选一个
- 第二个副本:在另一个机架的随机一个节点
- 第三个副本:在第二个副本所在机架的随机节点
补充
-- Client为什么是以串行的方式建立通道?
-- 本质上就是为了降低client的IO开销
-- 数据传输的时候如何保证数据成功?(了解)
-- 采用了ack回执的策略保证了数据完整成功上传。
HDFS读数据流程
NameNode和SecondaryNameNode(重点)
NameNode的元数据存储
元数据存放在内存中,磁盘中备份元数据的FsImage,防止节点断电后数据丢失,引入Edits文件(只进行追加操作,效率高)每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits。断电后可以通过FsImage和Edits的合并,合成元数据。
但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。
NN和2NN工作机制
补充
谁负责对NN的元数据信息进行合并?
2NN主要负责对NN的元数据精心合并,当满足一定条件的下,2NN会检测本地时间,每隔一个小时会主动对NN的edits文件和fsimage文件进行一次合并。合并的时候,首先会通知NN,这时候NN就会停止对正在使用的edits文件的追加,同时会新建一个新的edits编辑日志文件,保证NN的正常工作。接下来 2NN会把NN本地的fsimage文件和edits编辑日志拉取2NN的本地,在内存中对二者进行合并,最后产生最新fsimage文件。把最新的fsimage文件再发送给NN的本地。注意还有一个情况,当NN的edits文件中的操作次数累计达到100万次,即便还没到1小时,2NN(每隔60秒会检测一次NN方的edits文件的操作次数)也会进行合并。2NN 也会自己把最新的fsimage文件备份一份。
DataNode(面试开发重点)
DataNode工作机制
掉线时限参数设置
- DataNode进程死亡或网络故障造成DataNode无法与NameNode通信
- NameNode不会立即把该节点判定为死亡,默认要经过10分钟+30秒
- 自定义时间为2*dfs.namenode.heartbeat.recheck-interval +10**dfs.heartbeat.interval
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
服役新数据节点
- 直接启动DataNode,即可关联到集群
hdfs --daemon start datanode
yarn --daemon start nodemanager
- 如果数据不均衡,可以用命令实现集群的再平衡
./start-balancer.sh
DataNode多目录配置
在hdfs-site.xml文件中添加如下内容
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>
图解HDFS数据原理
HDFS写数据原理
HDFS读数据原理
HDFS故障类型和其检测方法