一、概述
Hadoop作为分布式存储,分布式计算的大数据生态系统,涵盖了从数据源到数据采集,数据存储,数据计算,数据分析,数据应用的各个场景,学习大数据的架构,了解各个组件对地工作原理和运行机制非常关键。
Hadoop生态系统以下将从以下几个有代表性的组件分布介绍工作原理及运行的机制。
二、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)为数据存储提供所需的扩展能力
不适合的场景
1) 不适合低延时数据访问, 比如毫秒级的存储数据,是做不到的
2) 无法高效的对大量小文件进行存储 。
- 存储大量小文件的话,它会占用 NameNode 大量的内存来存储文件目录和块信息。这样是不可取的,
因为 NameNode 的内存总是有限的;
- 小文件存储的寻址时间会超过读取时间,它违反了 HDFS 的设计目标。
3) 不支持并发写入、文件随机修改 。
- 一个文件只能有一个写,不允许多个线程同时写;
- 仅支持数据append (追加),不支持文件的随机修改
2.4组成架构
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 当中的配置文件进行指定
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. 第三个副本在第二个副本所在机架的随机节点
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进阶理论
3.1 Hadoop写数据流程
Metadata 元数据,最小的数据单位,这里主要是数据名称,类型,大小,数据副本,数据地址,拥有者信息等。
3.2 Hadoop读数据流程
3.3 NameNode工作机制
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工作机制
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 秒