Hadoop基础(一) 基本概念

概念

Hadoop 是 Apache 旗下一个开发和运行处理大数据的软件平台,允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。多运用于互联网和金融领域。

 

三个核心组件

  1. HDFS(分布式文件系统):解决海量数据存储
  2. YARN(作业调度和集群资源管理框架):解决资源和任务调度
  3. MapReduce(分布式运算编程框架):解决海量数据计算

YARN:在 Hadoop2.x 中出现,Hadoop1.x 中 YARN 的功能由 MapReduce 实现。YARN 的出现使得 MapReduce 可以更加专注于计算本身,使 Hadoop 除了 MapReduce 之外还可以支持其他的编程框架。

 

四大特性优点

  • 扩容能力:Hadoop 在计算机集群间分发数据并完成计算任务,集群可以方便的扩展节点。
  • 成本低:Hadoop 用廉价的机器组成服务器集群来分发和处理数据,不依赖高端设备,降低成本。
  • 高效率:Hadoop 可以在集群中并行处理数据,处理速度非常快。(1 小时计算,50 分钟读取)
  • 可靠性:数据有多个备份,任务失败后能够自动重新部署。

 

HDFS

HDFS 全称是 Hadoop Distributed File System,即 Hadoop 分布式文件系统。

传统存储模式的缺陷:

  1. 单台服务器的存储、性能瓶颈
  2. 大文件上传下载的耗时巨大

针对上述问题 HDFS 给出的解决方案:

  1. 用横向扩展(集群)代替服务器的纵向扩展
  2. 将大文件切割为小块,达到并行操作

随之而来的问题:

  • 大文件切块存储后,获取文件的成本变高
  • 需要有一个文件记录切割后的文件块位置,存在单点故障
  • 将块文件备份存储,会出现备份数据冗余

设计目标

  1. 硬件故障是常态,故障检测和快速自动恢复是 HDFS 的核心架构目标。
  2. 以流式读取数据,适合批量处理,牺牲用户交互。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
  3. 设计成支持大文件(GB、TB 级别)。
  4. write-one-read-many 访问模型。一旦创建、写入之后就不能再修改。
  5. 传统场景下,代码不动,数据动;大数据场景下,数据不动,代码动。将计算移动到数据附近,而非将数据移动到应用所在。

重要特性

  1. master/slave 架构:一般一个 HDFS 集群由一个 NameNode 和 多个 DataNode 组成。NameNode 是 HDFS 集群主节点,DataNode 是 HDFS 集群从节点。
  2. 分块存储:HDFS 中的文件在物理上是分块存储的,块(block)的大小可以配置,默认大小是 128 MB。
  3. 命名空间(Namespace):命名空间由 NameNode 维护,支持传统的层次型文件组织结构(目录树)。HDFS 给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,不需要关心底层如何分块存储。
  4. 元数据:目录树 + 块位置信息(块 ID 以及块所在的 DataNode 服务器)称之为元数据,元数据由 NameNode 负责管理。
  5. 数据存储:文件块的具体存储管理由各个 DataNode 节点承担,DataNode 需要定时向 NameNode 汇报持有的块信息。
  6. 副本机制:由于 Hadoop 集群采用相对廉价的服务器搭建,硬件故障是常态。因此所有的文件块都有副本,默认使用三副本,即同一文件块一共只有 3 份。
  7. 一次写入、多次读出:不支持文件修改,适合做大数据分析的底层存储服务。

NameNode 概述

  • NameNode 是 HDFS 的核心,也是 master/slave 架构中的 master。
  • NameNode 仅存储HDFS 的元数据,并跟踪整个集群中的文件。文件数据本身实际存储在 DataNodes 中。(类似于 Git 中的 TreeObject 和 BlobObject)
  • NameNode 知道 HDFS 中任意给定文件的块列表及其位置,使用此信息 NameNode 知道如何用块构建文件。
  • NameNode 不会持久化存储每个文件的各个块所在的 DataNode 位置信息,这些信息在系统启动时从数据节点重建。
  • NameNode 是 Hadoop 集群中的单点故障。如果 NameNode 宕机,那么整个集群就瘫痪了。
  • NameNode 所在的机器通常会配置有大量的内存。整个 HDFS 可存储的文件数受限于 NameNode 的内存大小。

NameNode 结构图:

DataNode 概述

  • DataNode 负责将实际数据存储在 HDFS 中,也是 master/slave 架构中的 slave。
  • DataNode 需要和 NameNode 保持不断通信。
  • DataNode 启动时,需要将自己发布到 NameNode 并汇报自己持有的块列表。
  • 当某个 DataNode 关闭时,不会影响数据或集群的可用性。NameNode 会安排其他 DataNode 管理的块进行副本复制。
  • DataNode 所在的机器通常会配置有大量的硬盘空间。因为实际的数据存储在 DataNode 中。
  • DataNode 会定期向 NameNode 发送心跳(证明自己活着),默认是 3s。如果 NameNode 长时间没有接收到 DataNode 发送的心跳,就会认为该 DataNode 失效。
  • DataNode 持有的块列表也要定时向 NameNode 汇报,默认是 6h。

工作机制

NameNode 负责管理整个文件系统元数据,客户端请求访问 HDFS 都是通过向 NameNode 申请来进行。;DataNode 负责管理具体文件数据块存储;Secondary NameNode 协助 NameNode 进行元数据的备份。

HDFS 结构图:

写数据流程

1、Client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯,NameNode 检查目标文件是否己存在,父目录是否存在,返回是否可以上传。

2、Client 按 128MB 大小(默认大小,可配置)将文件切块,请求第一个 block 该传输到哪些 DataNode 服务器上。

3、NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的 DataNode 地址,如 A,B,C。注: Hadoop 在设计时考虑到数据的安全与高效,数据文件默认在 HDFS 上存放三份,存储策略为本地一份,同机架内其他某一节点上一份,不同机架内的某一节点上一份。

4、Client 请求向 3 个 DataNode 中的 A 上传数据(本质上是一个 RPC 调用,建立 pipeline),A 收到请求会继续调用 B,然后 B 调用 C,将整个 pipeline 建立完成,后逐级返回 Client。

5、Client 开始向 A 上传第一个 block(先从磁盘读取数据放到本地内存中),以 packet 为单位(默认 64 KB 大小),A 收到一个 packet 就会传给 B,B 传给 C;A 每传入一个 packet 会放入一个应答队列等待应答。

6、数据被分割成一个个 packet 数据包在 pipeline 上依次传输,在 pipeline 反方向上逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipeline ack 发送给 Client 。

7、当一个 block 传输完成后,Client 再次请求 NameNode 上传第二个 block 。

流程图如下:

读数据流程

1、Client 向 NameNode 发起 RPC 请求,来确定请求文件的 blcok 所在位置。

2、NameNode 会视情况返回文件的部分或者全部 block 列表。对于每个 block,NameNode 都会返回含有该 block 副本的 DataNode 地址。(NamdeNdde 只是返回 Client 请求文件的块的 DataNode 地址,而不是返回块的数据。)

3、这些返回的 DataNode 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序(排序两个规则:网络拓扑结果中距离 Client 近的 DataNode 排靠前;心跳机制中超时汇报的 DataNode 排靠后)。

4、Client 选取排序依靠前的 DataNode 来读取 block,如果客户端本身就是 DataNode,那么将从本地直接获取数据。

5、读取完一个 block 会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNdoe,然后再从下一个拥有该 block 副本的 DataNode 继续读取。(Client 是并行读取 block 信息,而非一块一块的读取。)

6、当读完列表的 block 后,若文件读取还没有结束,客户端会继续向 NameNode 获取下一批 block 列表。

7、最终读取的所有 block 会合并成一个完整的文件。

 

MapReduce

MapReduce 的思想核心是“分而治之”,它主要做了两件事情:“分”与“合”。

Map 负责“分”,即将复杂的任务分解成为若干个“简单的任务”来并行处理。这里进行拆分的前提是小任务可以并行计算,彼此之间没有依赖关系。Reduce 负责“合”,即对 Map 阶段的结果进行汇总。

举个例子,全国人口普查需要对全国的人口进行统计,那么就可以将全国人口统计分解为每个省/市/区的人口统计。省/市/区的人口统计之间没有依赖关系,可以并行处理。将各省/市/区的人口统计的结果汇总就可以得到全国的人口统计。

设计构思

MapReduce 是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在 Hadoop 集群上。

简单来说,MapReduce 框架帮我们完成了大部分的通用功能,例如如何读取数据、数据如何传输等等。开发者只需要专注于业务逻辑本身,大大降低了开发并行应用的门槛。

其设计构思体现在三个方面:

一、分而治之

对相互之间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治之的策略。需要的注意是,不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算。

二、构建抽象模型:Map 和 Reduce

MapReduce 定义了 Map 和 Reduce 两个抽象接口由用户去编程实现(处理的数据类型是 <key,value> 键值对)。

Map:对一组数据元素进行某种重复式的处理,(k1,v1) -> (k2,v2)。

Reduce:对 Map 的中间结果进行某种进一步的结果整理,(k2,v2) -> (k3,v3)。

三、统一架构,隐藏系统层细节

如果没有统一封装底层细节,那么开发者需要考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节。为此,MapReduce 隐藏了绝大多数系统层面的处理细节。通过抽象模型和计算框架把需要做什么(what)和具体怎么做(how)分开了,开发者只需要关心应用层的具体计算问题。

 

参考:

Hadoop的概念、版本、发展史

Hadoop生态圈:19个让大象飞起来的工具!

大数据|Hadoop简介及两大功能三大核心组件(二)

NAS SAN DAS都是些什么鬼【存储基本概念】

什么是RPC?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值