Hadoop分布式文件系统
<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!-- [endif]--><!-- [if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="1033"/> </xml><![endif]--><!-- [if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]-->
一、 Hadoop 系统简介
Apache Hadoop 是一个用 java 语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,它可以让应用程序支持上千个节点和 PB 级别的数据。它由两大核心技术: HDFS 及 MapReduce 。
Hadoop 分布式文件系统 (HDFS) 是一个设计为用在普通硬件设备上的分布式文件系统。它与现有的分布式文件系统有很多近似的地方,但又和这些文件系统有很明显的不同。 HDFS 是高容错的,设计为部署在廉价硬件上的。 HDFS 对应用程序的数据提供高吞吐量,而且适用于那些大数据集应用程序。 HDFS 开放了一些 POSIX 的必须接口,容许流式访问文件系统的数据。 HDFS 最初是为了 Apache 的 Nutch 网络搜索引擎项目的下层构件而设计的。
MapReduce 从它名字上来看就大致可以看出个缘由,两个动词 Map 和 Reduce , “Map (展开) ” 就是将一个任务分解成为多个任务, “Reduce” 就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。
二、 Hadoop 系统体系结构
根据第一部分的 Hadoop 系统简介部分介绍, HDFS 作为 Hadoop 项目的一个核心技术,是分布式计算的存储基石。 Hadoop 的分布式文件系统和其他分布式文件系统有很多类似的特质也采用了主 / 从结构。它的体系结构如下图所示:
HDFS 的体系结构
l NameNode :名字结点(管理结点)一个集群有一个名字结点,也就是主控制服务器,负责管理文件系统的名字空间、集群配置信息并协调客户对文件的访问。
l DataNode :数据结点,有一堆数据结点,一般一个物理结点上部署一个,负责它们所在的物理结点上的存储管理。 HDFS 开放文件系统的名字空间以便让用户数据存储的文件中。内部,一个文件被分割为一个或者多个数据块,这些数据块存储在一组数据结点中。名字结点执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,还决定数据块从数据结点的映射。数据结点负责提供客户的读写请求。数据结点还依照名字结点的指令执行数据块的创建、删除复制工作。
l Client :客户端结点,用于具体操作的结点,对于用户访问的服务来说是完全透明的。
MapReduce 是 Google 提出的一个软件架构,用于大规模数据集(大于 1TB )的并行运算。概念 "Map (映射) " 和 "Reduce (化简) " ,简单的一句话解释 MapReduce 就是 “ 任务的分解与结果的汇总 ” 。
MapReduce 的体系结构
l Map (映射) 函数,用来把一组键值对映射成一组新的键值对;
l Reduce (化简) 函数,用来保证所有映射的键值对中的每一个共享相同的键组。
在 Map 前还可能会对输入的数据有 Split (分割)的过程,保证任务并行效率,在 Map 之后还会有 Shuffle (混合)的过程,对于提高 Reduce 的效率以及减小数据传输的压力有很大的帮助。
通过上述两种核心技术的体系结构,可以分析出 Hadoop 也是采用了主 / 从结构进行设计。它的结构示意图如下所示:
Hadoop 结构示意图
l Master ,主要负责 NameNode 及 JobTracker 的工作。 NameNode 用于管理各个数据结点, JobTracker 的主要职责就是启动、跟踪和调度各个 Slave 的任务执行。
l Slave ,主要负责 DataNode 及 TaskTracker 的工作。 DataNode 用于存储具体的数据及负责数据间的复制, TaskTracker 根据应用要求来结合本地数据执行 Map 任务以及 Reduce 任务。
三、 HDFS 的设计特点
l Block 的放置:默认不配置。一个Block 会有三份备份,一份放在NameNode 指定的DataNode ,另一份放在 与指定DataNode 非同一Rack 上的DataNode ,最后一份放在与指定DataNode 同一Rack 上的DataNode 上。备份是为了数据安全,考虑同一Rack 的失败情况以及不同Rack 之间数据拷贝性能问题就采用这种配置方式。
l 心跳检测DataNode 的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。
l 数据复制(场景为DataNode 失败、需要平衡DataNode 的存储利用率和需要平衡DataNode 数据交互压力等情况):这里先说一下,使用 HDFS 的balancer 命令,可以配置一个Threshold 来平衡每一个DataNode 磁盘利用率。例如设置了Threshold 为10% ,那么 执行balancer 命令的时候,首先统计所有DataNode 的磁盘利用率的均值,然后判断如果某一个DataNode 的磁盘利用率超过这个均值 Threshold 以上,那么将会把这个DataNode 的block 转移到磁盘利用率低的DataNode ,这对于新节点的加入来说十分有用。
l 数据交验:采用CRC32 作数据交验。在文件Block 写入的时候除了写入数据还会写入检验信息,在读取的时候需要检验后再读入。
l NameNode 是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端文件系统中。
l 数据管道性的写入:当客户端要写入文件到DataNode 上,首先客户端读取一个Block 然后写到第一个DataNode 上,然后由第一个 DataNode 传递到备份的DataNode 上,一直到所有需要写入这个Block 的NataNode 都成功写入,客户端才会继续开始写下一个 Block 。
l 安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode 上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
四、 HDFS 愿景与目标
l 硬件错误 : 硬件错误是正常的,而不是异常。 HDFS 实例由成百上千个服务器组成,每个都存储着文件系统的一部分数据。事实上,这就会有大量的组件,而每个组件出故障的可能性都很大,这意味着 HDFS 总有一些组件是不能工作的。因此,检测错误并快速自动恢复就成了 HDFS 的核心设计目标。
l 流式数据访问 : 运行在 HDFS 上的应用程序需要流式的访问它们的数据集,它们也不是通常运行在普通文件系统上的普通应用程序。 HDFS 为了那些批量处理而设计的,而不是为普通用户的交互使用。强调的是数据访问的高吞吐量而不是数据访问的低反应时间。 POSIX 强加的很多硬性需求是 HDFS 上应用程序所不需要的, 这些 POSIX 语义在一些关键环境下被用来提高数据的吞吐频率。
l 大数据集 : 运行在 HDFS 上的应用程序使用大数据集。 HDFS 一个典型的文件可能是几 GB 的或者几 TB 的。因此, HDFS 适用于大文件。这将提供高集成带宽,并在一几集群中提供上百个结点。一个实例可能支持上千万个文件。
l 简单一致性模型 :HDFS 的应用程序需要对文件实行一次性写,多次读的访问模式。文件一旦建立后写入,文件就不需要再更改了。这样的假定简化了数据一致性问题并使高数据吞吐量成为可能。 MapReduce 程序或者网络爬虫程序就很适合使用这样的模型。当然未来计划支持增量写。
l 移动计算环境比移动数据划算 : 如果就在数据的旁边就执行对这些数据的操作,那么程序所使用的设备就会很高效。这当文件相当巨大的时候就尤其正确。这可以减少网络的拥塞和提高系统的吞吐量。这个假设还意味着,常常是把计算迁移到数据存储的近处更好,而不是把数据传输到程序运行的地方。 HDFS 提供了程序接口以便把他们自己移动到数据存储的地方执行。
l 跨硬件和软件平台的移动 :HDFS 设计为容易的从一个平台移动到另一个平台。这有助于 HDFS 被采用作为一个大程序集合的工作平台。
五、选择 Hadoop 理由
l 可扩展性:不论是存储的可扩展还是计算的可扩展都是 Hadoop 的设计根本。
l 经济性:框架可以运行在任何普通的 PC 上。
l 可靠性:分布式文件系统的备份恢复机制以及 MapReduce 的任务监控保证了分布式处理的可靠性。
l 高效性:分布式文件系统的高效数据交互实现以及 MapReduce 结合 Local Data 处理的模式,为高效处理海量的信息作了基础准备。
<!-- [if !mso]>
<mce:style><!--
v/:* {behavior:url(#default#VML);}
o/:* {behavior:url(#default#VML);}
w/:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
-->
<!-- [endif]--><!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<mce:style><!--
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
-->
<!-- [endif]--><!-- [if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1036" fillcolor="none [4]"
strokecolor="none [1]">
<v:fill color="none [4]" color2="none [0]"/>
<v:stroke color="none [1]"/>
<v:shadow color="none [2]"/>
<o:colormru v:ext="edit" colors="#6e815b,#7ea5d0,#46acae,#c00,black,#eaeaea,silver,#ddd"/>
<o:colormenu v:ext="edit" fillcolor="none [1]" strokecolor="none [1]"
shadowcolor="none [1]"/>
</o:shapedefaults></xml><![endif]--><!-- [if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->