《Hadoop与大数据挖掘》一2.1.2 Hadoop存储—HDFS

  1. 云栖社区>
  2. 华章计算机>
  3. 博客>
  4. 正文

《Hadoop与大数据挖掘》一2.1.2 Hadoop存储—HDFS

华章计算机 2017-06-26 08:57:00 浏览1272

本节书摘来华章计算机《Hadoop与大数据挖掘》一书中的第2章 ,第2.1.2节,张良均 樊 哲 位文超 刘名军 许国杰 周 龙 焦正升 著 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.1.2 Hadoop存储—HDFS

Hadoop的存储系统是HDFS(Hadoop Distributed File System)分布式文件系统,对外部客户端而言,HDFS就像一个传统的分级文件系统,可以进行创建、删除、移动或重命名文件或文件夹等操作,与Linux文件系统类似。
但是,Hadoop HDFS的架构是基于一组特定的节点构建的(见图2-2),这些节点包括名称节点(NameNode,仅一个),它在 HDFS 内部提供元数据服务;第二名称节点(Secondary NameNode),名称节点的帮助节点,主要是为了整合元数据操作(注意不是名称节点的备份);数据节点(DataNode),它为HDFS提供存储块。由于仅有一个NameNode,因此这是HDFS的一个缺点(单点失败,在Hadoop2.X后有较大改善)。

image


存储在HDFS中的文件被分成块,然后这些块被复制到多个数据节点中(DataNode),这与传统的RAID架构大不相同。块的大小(通常为128MB)和复制的块数量在创建文件时由客户机决定。名称节点可以控制所有文件操作。HDFS内部的所有通信都基于标准的TCP/IP协议。
关于各个组件的具体描述如下所示:
(1)名称节点(NameNode)
它是一个通常在HDFS架构中单独机器上运行的组件,负责管理文件系统名称空间和控制外部客户机的访问。NameNode决定是否将文件映射到DataNode上的复制块上。对于最常见的3个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。
(2)数据节点(DataNode)
数据节点也是一个通常在HDFS架构中的单独机器上运行的组件。Hadoop集群包含一个NameNode和大量DataNode。数据节点通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。
数据节点响应来自HDFS客户机的读写请求。它们还响应来自NameNode的创建、删除和复制块的命令。名称节点依赖来自每个数据节点的定期心跳(heartbeat)消息。每条消息都包含一个块报告,名称节点可以根据这个报告验证块映射和其他文件系统元数据。如果数据节点不能发送心跳消息,名称节点将采取修复措施,重新复制在该节点上丢失的块。
(3)第二名称节点(Secondary NameNode)
第二名称节点的作用在于为HDFS中的名称节点提供一个Checkpoint,它只是名称节点的一个助手节点,这也是它在社区内被认为是Checkpoint Node的原因。
如图2-3所示,只有在NameNode重启时,edits才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在生产环境集群中的NameNode是很少重启的,这意味着当NameNode运行很长时间后,edits文件会变得很大。而当NameNode宕机时,edits就会丢失很多改动,如何解决这个问题呢?

fsimage是Namenode启动时对整个文件系统的快照;edits是在Namenode启动后对文件系统的改动序列。

如图2-4所示,Secondary NameNode会定时到NameNode去获取名称节点的edits,并及时更新到自己fsimage上。这样,如果NameNode宕机,我们也可以使用Secondary-Namenode的信息来恢复NameNode。并且,如果SecondaryNameNode新的fsimage文件达到一定阈值,它就会将其拷贝回名称节点上,这样NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

image


举个数据上传的例子来深入理解下HDFS内部是怎么做的,如图2-5所示。

image


文件在客户端时会被分块,这里可以看到文件被分为5个块,分别是:A、B、C、D、E。同时为了负载均衡,所以每个节点有3个块。下面来看看具体步骤:
1)客户端将要上传的文件按128MB的大小分块。
2)客户端向名称节点发送写数据请求。
3)名称节点记录各个DataNode信息,并返回可用的DataNode列表。
4)客户端直接向DataNode发送分割后的文件块,发送过程以流式写入。
5)写入完成后,DataNode向NameNode发送消息,更新元数据。
这里需要注意:
1)写1T文件,需要3T的存储,3T的网络流量。
2)在执行读或写的过程中,NameNode和DataNode通过HeartBeat进行保存通信,确定DataNode活着。如果发现DataNode死掉了,就将死掉的DataNode上的数据,放到其他节点去,读取时,读其他节点。
3)宕掉一个节点没关系,还有其他节点可以备份;甚至,宕掉某一个机架也没关系;其他机架上也有备份。