2019/11/19 Caesar
前言
入门大数据技术,当选Hadoop。可以说Hadoop是大数据生态的基础,Hadoop是一套行业大数据标准开源文件,可以实现在分布式环境下提供海量数据的处理能力,我们就从Hadoop来开始学习大数据!
Hadoop是什么
Hadoop在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。
Hadoop组成
- HDFS : Hadoop Distributed File System 分布式文件系统
- YARN : Yet Another Resource Negotiator 资源管理调度系统
- Mapreduce :分布式计算框架
HDFS
1. HDFS架构
主从架构:
NameNode (名称节点):NameNode维护文件系统名称空间。对文件系统名称空间或其属性的任何更改均由NameNode记录。应用程序可以指定HDFS应该维护的文件副本的数量。文件的副本数称为该文件的复制因子。此信息由NameNode存储。NameNode是所有HDFS元数据的仲裁器和存储库。
DataNode (数据节点):DataNode是存储数据的集群节点。
2. HDFS如何实现数据容错
2.1 数据复制
HDFS将所有存储其中的文件分成若干个块,除最后一个块,其余块大小相等,默认为128M,可根据文件配置。复制文件的块的目的是为了容错,应用程序可以指定复制的副本数,即需要存储几份相同的数据。
NameNode决定所有块复制的细节。它定期从众多 DataNode 中接受心跳信号和 Block Report,其中 Block Report 包含 DataNode 上所有块的列表。图示如下:
2.2 机制感知策略(可略)
HDFS 通过机制感知策略,一种特定的算法来确定块的位置。
NameNode和JobTracker通过调用管理员配置模块中的APIresolve来获取集群里每个slave的机架id。该API将slave的DNS名称(或者IP地址)转换成机架id。使用哪个模块是通过配置项topology.node.switch.mapping.impl来指定的。模块的默认实现会调用topology.script.file.name配置项指定的一个的脚本/命令。 如果topology.script.file.name未被设置,对于所有传入的IP地址,模块会返回/default-rack作为机架id。在Map/Reduce部分还有一个额外的配置项mapred.cache.task.levels,该参数决定cache的级数(在网络拓扑中)。例如,如果默认值是2,会建立两级的cache- 一级针对主机(主机 -> 任务的映射)另一级针对机架(机架 -> 任务的映射)。
2.3 副本放置策略
HDFS 通过副本放置策略在集群上不同节点放置副本,副本数可通过配置文件更改,下面介绍大多数情况下采用的策略。
当复制因子为3时,HDFS的放置策略是将一个副本放置在本地机架的一个节点上,将另一个副本放置在本地机架的不同节点上,将最后一个副本放置在不同机架的不同节点上。如果复制因子大于3,则在确定每个机架的副本数量低于上限(基本上是(副本-1)/机架+ 2)以下的同时,随机确定第4个及以下副本的位置。使用此策略,文件的副本不会均匀分布在机架上。三分之一的副本位于一个节点上,三分之二的副本位于一个机架上,其余三分之一则均匀分布在其余机架上。由于NameNode不允许DataNode具有同一块的多个副本,因此创建的副本的最大数量是当时DataNode的总数。
2.4 安全模式
HDFS启动后,NameNode进入一个特殊的状态,称为安全模式。在安全模式下,NameNode不会发生数据块的复制,NameNode从DataNode接收心跳和Blockreport消息。Blockreport包含DataNode托管的数据块列表。每个Block都有指定的最小副本数。如果一个Block的副本数达到最小副本数,就被NameNode认为是已经安全复制的Block,即满足HDFS对于数据冗余容错的要求。经过一定百分比的Block被检查为安全复制的时间,再加上30S后,NameNode推出安全模式,至于那些没有达到最小副本数的Block,NameNode会将它们复制到其他DataNode。
3. HDFS元数据管理
3.1 NameNode
HDFS命名空间由NameNode存储,NameNode有两种重要的数据结构,分别是FsImage 和 EditLog。称为EditLog的事务日志来永久记录文件系统元数据发生的每个更改。例如,在HDFS中创建一个新文件将导致NameNode将一条记录插入到EditLog中。NameNode使用其本地主机OS文件系统中的文件来存储EditLog。整个文件系统名称空间(包括块到文件的映射和文件系统属性)存储在名为FsImage的文件中。FsImage也作为文件存储在NameNode的本地文件系统中。
3.2 SecondyNameNode
SecondyNameNode 是 NameNode 冷备,一般放在与 NameNode 不同位置的主机上。SecondyNameNode 主要有两个作用。一是在 NameNode 工作的时候, SecondyNameNode 通过对 NameNode 中 FsImage 和 EditLog 的操作来完成备份,提高 NameNode 的启动效率。二是在 NameNode宕掉的时候, 用来恢复数据,不过不能代替 NameNode 的作用,因为它没有元数据更新机制。
3.2.1 备份过程
FsImage 存储着块到文件的映射和文件系统属性,Edits 存储着文件系统元数据发生的每个更改。在 NameNode 中,随着运行时间持续, Edits 文件越来越大, 如果 NameNode 再次启动,会将记录在 Edits 文件的操作合并在 FsImage 文件中,并清空 Edits。但是因为 Edits 文件过大,启动效率低。所以 SecondyNameNode 会经常性将 FsImage 和 Edits 通过网络拷贝到当前节点进行数据合并,再拷贝回 NameNode,并清空 Edits。同时 SecondyNameNode 也保留了 元数据。触发拷贝可以是两个条件,一个是时间因素(超过默认时间触发),一个是 Edits 文件大小(超过大小触发)。
4. 文件读写
4.1 读文件
假设需求是在 HDFS 中下载文件至 Linux 本地,即读文件。客户端 Client 向 NameNode 发起读文件请求, NameNode 会做权限检查,确定 Client 是否有权限进行读文件,然后经过算法分析,获取文件的 Block 列表,列表包含内容为 各Block存储的最近的 DataNode,将列表返回给 Client。Client 获取到位置信息后,和对应的 DataNode 之间建立 pipeline 管道(水管),通过管道以 pakage 为单位将 Block 数据拷贝到 Client,然后由 Client 将各 Block 合并成一个最终的文件。
4.2 写文件
假设需求是往 HDFS 中上传文件,即写文件。客户端 Client 向 NameNode 发起写文件请求, NameNode 会做权限检查,确定 Client 是否有权限进行写文件, NameNode 通过检测
” DataNode 信息池“ 来获取压力不太大的 DataNode 列表,将列表返回给 Client。Client 获取到位置信息后,和最近的一个 DataNode 之间建立 pipeline 管道(水管),通过管道以 pakage 为单位将 Block 数据拷贝到此 DataNode,然后该 DataNode 再与下一个 DataNode 建立管道,以此类推,将
Block 数据传输下去,在 DataNode 之间有一种应答机制:ack应答机制,当 DataNode 成功保存数据后,向前一个 DataNode 报告传输成功,并关闭管道。最终 Client 成功地将数据写入若干个 DataNode中。