HDFS是hadoop的三驾马车之一,是一种大规模分布式文件存储系统。
使用HDFS存储的场景是:当数据集大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区,并存储到若干台独立的计算机上。
HDFS的设计特点:
• 超大文件
• 流式数据访问
• 低成本
• 数据一致性
• 高吞吐率
• 易扩展
• 高容错
下面我们解剖一下HDFS的设计实现,来分析HDFS是如何体现其特点的。
(说明:以下内容 基于 hadoop v2.7.7)
提醒:本次内容有点多,是后续hadoop学习的基础,是从原理上了解什么是大数据的基础,必须努力啃下这块无聊的硬骨头
如果觉得这篇文章对您有帮助,欢迎关注公众号 “学点儿编程”,公众号不断推送干货文章!
我们先了解一下HDFS的存储思路,方便理解HDFS的总体架构。
场景:一个大小为10GB的文件,是如何存储到HDFS中的
从HDFS的设计思路上,主要用于解决超大文件的存储(上面图中以存储10GB文件为例)
第一步:在存储前会先对待存储文件进行块切分,上面示例中每块大小是 128MB(每块大小可配置),总共需要切分80块。
第二步:NameNode会记录当前待存储文件的分块信息,并根据DataNode各个节点的存储情况,给出每个数据块的存储位置。
第三步:根据NameNode的分配策略,80个数据块分别存储到对应的DataNode节点,并向NameNode汇报存储结果。
说明:
(1)上面示意图只是描述了每个数据块1个副本的存储情况,生产环境中为提高数据的可用性,一般会设置1个以上的副本(默认是3份)。多副本存储思路和上面思路类似。
(2)有朋友估计在想,如果不够128MB的整数倍怎么办。
HDFS的处理思路是,最后一块仍然会作为一个独立的数据块,但磁盘的实际占用以最后一块实际大小为准。
(3)每个DataNode可指定1个或多个磁盘目录,当指定多个磁盘目录时,随着写入数据越来越多,容易出现各目录下数据不均衡的问题。为避免不均衡问题,可参考以下配置策略:
-
多目录配置方法
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
-
hadoop写入文件有两种策略:
1. 轮询方式(默认)
RoundRobinVolumeChoosingPolicy
2. 根据可用空间的大小来判断写入
AvailableSpaceVolumeChoosingPolicy
通过以下参数来设置使用哪种策略来写入(下面配置是采用策略2)
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property>
-
写入策略选择建议:
如果每个目录的大小是一样的,可使用默认策略;
如果各个目录大小不一致,避免小磁盘使用率过高,使用策略2。
了解了HDFS的存储思路后,下面咱们分析一下HDFS的总体架构