一、概述

Hadoop作为分布式存储,分布式计算的大数据生态系统,涵盖了从数据源到数据采集,数据存储,数据计算,数据分析,数据应用的各个场景,学习大数据的架构,了解各个组件对地工作原理和运行机制非常关键。

Hadoop生态系统

hadoop生态组件主要包括 hadoop生态系统组件_hadoop

以下将从以下几个有代表性的组件分布介绍工作原理及运行的机制。

hadoop生态组件主要包括 hadoop生态系统组件_mapreduce_02

二、HDFS组件

HDFS(Hadoop Distributed, Filesystem)大数据分布式的文件存储系统。

2.1概述

Hadoop作为分布式存储分布式计算的典范,其也经历了三个发展阶段:

第一阶段,集中存,集中算;对于集中算,遇到机器性能的瓶颈。

第二阶段,集中存,分开算;分布式计算,需要将任务做拆分到多台服务器,这时候会需要网络速度的瓶颈;

第三阶段,分开存,分开算;因分布都是采用了廉价的机器进行分布式的存储,将一个大的任务进行拆分,分开计算也解决了集中计算的痛点。

2.2 HDFS 分布式存储系统

背景:在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。

定义:统一管理分布在集群上的文件系统称为分布式文件系统 。

特点:Hadoop 非常适于存储大型数据 (比如 TB 和 PB), 其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统

2.3 应用场景

适合的场景

1)存储非常大的文件:这里非常大指的是几百M,G,或者TB级别,需要高吞吐量,对延时没有要求

2)采用流式的数据访问方式:即一次写入,多次读取,数据集经常从数据源生成或者拷贝一次,然后再其上做很多分析工作。

3)运行于商业硬件上:Hadoop不需要特别贵的机器,可运行在普通廉价的机器,可以节约成本

4)需要高容错性;

5)为数据存储提供所需的扩展能力

hadoop生态组件主要包括 hadoop生态系统组件_hadoop_03

不适合的场景


1) 不适合低延时数据访问, 比如毫秒级的存储数据,是做不到的


2)  无法高效的对大量小文件进行存储


  - 存储大量小文件的话,它会占用 NameNode 大量的内存来存储文件目录和块信息。这样是不可取的,


因为 NameNode 的内存总是有限的;


  - 小文件存储的寻址时间会超过读取时间,它违反了 HDFS 的设计目标。


3)  不支持并发写入、文件随机修改


  - 一个文件只能有一个写,不允许多个线程同时写;


  - 仅支持数据append (追加),不支持文件的随机修改


2.4组成架构

hadoop生态组件主要包括 hadoop生态系统组件_hadoop生态组件主要包括_04

hadoop生态组件主要包括 hadoop生态系统组件_HDFS_05

 

 


1、NameNode nn ):就是 Master ,它是一个 主管、管理者。


1 )管理 HDFS 的名称空间;


2 )配置副本策略;


3 )管理数据块( Block )映射信息;


4 )处理客户端读写请求。



2、 DataNode :就是 Slave NameNode 下达命 令, DataNode 执行实际的操作。


1 )存储实际的数据块;


2 )执行数据块的读 / 写操作



3、 Client :就是客户端。


1 )文件切分。文件上传 HDFS 的时候, Client 将文件切分成一个一个的 Block ,然后进行上传;


2 )与 NameNode 交互,获取文件的位置信息;


3 )与 DataNode 交互,读取或者写入数据;


4 ) Client 提供一些命令来管理 HDFS ,比如 NameNode 格式化;


5 ) Client 可以通过一些命令来访问 HDFS ,比如对 HDFS 增删查改操作;


4、 Secondary NameNode 并非 NameNode 的热备。当 NameNode 挂掉的时候,它并不能马上替换 NameNode


提供服务。


1 )辅助 NameNode ,分担其工作量,比如定期合并 Fsimage 和 Edits ,并推送给 NameNode ;


2 )在紧急情况下,可辅助恢复 NameNode


2.5 Block块的存放方式及介绍


所有的文件都是 block 的方式存放在 HDFS 文件系统当中 , 作用如下:


1. 一个文件有可能大于集群中任意一个磁盘,引入块机制 , 可以很好的解决这个问题


2. 使用块作为文件存储的逻辑单位可以简化存储子系统


3. 块非常适合用于数据备份进而提供数据容错能力。


在 Hadoop1.x 当中 , 文件的 block 块默认大小是 64M, hadoop2/3.x 当中 , 文件的 block 块大小默认是 128M, block 块的大小可以通过 hdfs-site.xml 当中的配置文件进行指定


hadoop生态组件主要包括 hadoop生态系统组件_hdfs_06


Block大小设置的原理:


1. 如果寻址时间约为 10ms ,即查找到目标 block 的时 间为10ms 。


2. 寻址时间为传输时间的 1% 时,则为最佳状态


(专家)因此,传输时间=10ms/0.01=1000ms=1s


3. 而目前磁盘的传输速率普遍为 100MB/s 。


4. block 大小 =1s*100MB/s=100MB


 

思考:为什么块的大小不能设置太小,也不能设置太大?


1 ) HDFS 的块设置 太小,会增加寻址时间 ,程序一直在找块的开始位置;


2 )如果块设置的 太大 ,从 磁盘传输数据的时间 会明显 大于定位这个块开始位置所需的时间 。导致程序 在处理这块数据时,会非常慢。


总结: HDFS 块的大小设置主要取决于磁盘传输速率


2.6 HDFS文件副本与机架感知


副本机制与机架感知:


HDFS 分布式文件系统的内部有一个 副本存放策略 :以默认的副 本数=3 为例:


1. 第一个副本在 Client 所处的节点上。如果客户端在集群外,随机选一个。


2. 第二个副本在另一个机架的随机一个节点


3. 第三个副本在第二个副本所在机架的随机节点


hadoop生态组件主要包括 hadoop生态系统组件_HDFS_07


2.7  HDFS安全模式

安全模式是 hadoop 的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时候,会首先进 入安全模式。当系统处于安全模式时会检查数据块的完整性。


假设我们设置的副本数(即参数dfs.replication )是 3 ,那么在 datanode 上就应该有 3 个副本存在,假设只 存在2 个副本,那么比例就是 2/3=0.666 。 hdfs 默认的副本率 0.999 。我们的副本率 0.666 明显小于 0.999 , 因此系统会自动的复制副本到其他dataNode ,使得副本率不小于 0.999 。如果系统中有 5 个副本,超过我 们设定的3 个副本,那么系统也会删除多于的 2 个副本。


在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在当整个系统达到安 全标准时,HDFS 自动离开安全模式。


 


三、HDFS进阶理论

hadoop生态组件主要包括 hadoop生态系统组件_hadoop生态组件主要包括_08

3.1 Hadoop写数据流程

hadoop生态组件主要包括 hadoop生态系统组件_mapreduce_09

Metadata 元数据,最小的数据单位,这里主要是数据名称,类型,大小,数据副本,数据地址,拥有者信息等。

 3.2 Hadoop读数据流程

hadoop生态组件主要包括 hadoop生态系统组件_hadoop_10

3.3 NameNode工作机制

hadoop生态组件主要包括 hadoop生态系统组件_mapreduce_11


1、 第一阶段: NameNode 启动


1 )第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载辑日志和镜像文件到内存。


2 )客户端对元数据进行增删改的请求。


3 ) NameNode 记录操作日志,更新滚动日志。


4 ) NameNode 在内存中对元数据进行增删改。



2)第二阶段:Secondary NameNode 工作


1 ) Secondary NameNode 询问 NameNode 是否需要 CheckPoint 。直接带回 NameNode 是否检查结果。


2 ) Secondary NameNode 请求执行 CheckPoint 。


3 ) NameNode 滚动正在写的 Edits 日志。


4 )将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode 。


5 ) Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。


6 )生成新的镜像文件 fsimage.chkpoint 。


7 )拷贝 fsimage.chkpoint 到 NameNode 。


8 ) NameNode 将 fsimage.chkpoint 重新命名成 fsimage 。


 

3.4 Fsimage和Edits概念


NameNode 被格式化之后,将在 $HADOOP_HOME/data/tmp/dfs/name/current 目录中产生如下文件


1 ) Fsimage 文件: HDFS 文件系统元数据的一个永久性的检查点,其中包含 HDFS 文件系统的所有目录和文


件 inode 的序列化信息。


fsimage_0000000000000000000


fsimage_0000000000000000000.md5


seen_txid


VERSION


2 ) Edits 文件:存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记


录到 Edits 文件中。


3 ) seen_txid 文件保存的是一个数字,就是最后一个 edits_ 的数字


4 )每次 NameNode 启动的时候都会将 Fsimage 文件读入内存,加载 Edits 里面的更新操作,保证内存中的元


数据信息是最新的、同步的,可以看成 NameNode 启动的时候就将 Fsimage 和 Edits 文件进行了合并。


3.5 DataNode工作机制

hadoop生态组件主要包括 hadoop生态系统组件_hadoop_12


1 )一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包


括数据块的长度,块数据的校验和,以及时间戳。


2 ) DataNode 启动后向 NameNode 注册,通过后,周期性( 6 小时)的向 NameNode 上报所有的块信息。


3 )心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台 机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,


则认为该节点不可用。


4 )集群运行中可以安全加入和退出一些机器。


3.6 数据完整性


DataNode 节点保证数据完整性的方法:


1 )当 DataNode 读取 Block 的时候,它会计算 CheckSum 。


2 )如果计算后的 CheckSum ,与 Block 创建时值不一样,说明 Block 已经损坏。


3 ) Client 读取其他 DataNode 上的 Block 。


4 )常见的校验算法 crc ( 32 ), md5 ( 128 ), sha1 ( 160 )


5 ) DataNode 在其文件创建后周期验证 CheckSum 。


3.7 DataNode掉线时参数设置


1)DataNode 进程死亡或者网络故障造成 DataNode 无法与 NameNode 通信


2)NameNode 不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超


时时长。


3)HDFS 默认的超时时长为 10 分钟 +30 秒。


4) 如果定义超时时间为 TimeOut ,则超时时长的计算公式为: TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。


5)而默认的 dfs.namenode.heartbeat.recheck-interval 大小为 5 分钟, dfs.heartbeat.interval默认为 3 秒