从0开始学大数据总结笔记:1、Hadoop大数据原理与架构

Hadoop大数据原理与架构

1、
移动计算不移动数据原则:

使用 HDFS 分布式文件存储系统,将文件分成很多块(Block),以块为单位存储在集群的服务器上
每台服务器原本都不带有程序,但是调度服务器为处理服务器分发任务之后,处理服务器就执行任务并检查是否有该程序,
没有就下载,下载之后从指定路径中读取数据进行处理,处理好之后统一存放处理结果

Hadoop 主要是由三部分组成,分布式文件系统 HDFS、分布式计算框架 MapReduce,分布式集群资源调度框架 Yarn。

2、
HDFS:
将 RAID 的设计理念扩大到整个分布式服务器集群,就产生了分布式文件系统
1)RAID(独立磁盘冗余阵列)
2)分布式文件系统

HDFS 的关键组件有两个,一个是 DataNode,一个是 NameNode:

NameNode 负责整个分布式文件系统的元数据(MetaData)管理,
也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色
NameNode 采用主从热备

DataNode 负责文件数据的存储和读写操作,HDFS 将文件数据分割成若干数据块(Block),
每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中
DataNode 通过心跳和 NameNode 保持通信,DataNode 超时未发送心跳,NameNode
认为这个 DataNode 已经宕机失效,立即查找这个 DataNode 上存储的数据块有哪些,
每个数据块在集群里有多个备份

MapReduce 对输入数据进行分片读取,通常一个分片就是一个数据块,每个数据块分配一个计算进程,
可以同时启动很多进程对一个 HDFS 文件的多个数据块进行并发访问,从而实现数据的高速访问

保证系统可用性的策略有冗余备份、失效转移和降级限流

3、
MapReduce 既是一个编程模型,又是一个计算框架
只包含 Map 和 Reduce 两个过程,map 的主要输入是一对 <Key, Value> 值,
经过 map 计算后输出一对 <Key, Value> 值;然后将相同 Key 合并,形成 <Key, Value 集合 >;
再将这个 <Key, Value 集合 > 输入 reduce,经过计算输出零个或多个 <Key, Value> 对

MapReduce 计算框架会将这些 <word , 1> 收集起来,将相同的 word 放在一起,
形成 <word , <1,1,1,1,1,1,1…>> 这样的 <Key, Value 集合 > 数据,然后将其输入给 reduce 函数。
reduce 的输入参数 Values 就是由很多个 1 组成的集合,而 Key 就是具体的单词 word。
reduce 函数的计算过程是,将这个集合里的 1 求和,再将单词(word)和这个和(sum)组成一个 ,也就是输出。

但是这样一个 MapReduce 程序要想在分布式环境中执行,还需要一个计算框架,
调度执行这个 MapReduce 程序,使它在分布式的集群中并行运行,而这个计算框架也叫 MapReduce。
MapReduce 编程模型将大数据计算过程切分为 Map 和 Reduce 两个阶段,先复习一下,在 Map 阶段为每个数据块分配一个 Map 计算任务,
然后将所有 map 输出的 Key 进行合并,相同的 Key 及其对应的 Value 发送给同一个 Reduce 任务去处理

MapReduce 运行过程涉及三类关键进程:

  1. 大数据应用进程。这类进程是启动 MapReduce 程序的主入口,
    主要是指定 Map 和 Reduce 类、输入输出文件路径等,并提交作业给 Hadoop 集群,
    也就是下面提到的 JobTracker 进程。这是由用户启动的 MapReduce 程序进程。
    2.JobTracker 进程。这类进程根据要处理的输入数据量,
    命令TaskTracker 进程启动相应数量的 Map 和 Reduce 进程任务,
    并管理整个作业生命周期的任务调度和监控。这是 Hadoop 集群的常驻进程,
    JobTracker 进程在整个 Hadoop 集群全局唯一。
    3.TaskTracker 进程。这个进程负责启动和管理 Map 进程以及 Reduce 进程。
    因为需要每个数据块都有对应的 map 函数,
    TaskTracker 进程通常和 HDFS 的 DataNode 进程启动在同一个服务器。
    Hadoop 集群中绝大多数服务器同时运行 DataNode 进程和 TaskTracker 进程

MapReduce 的主服务器就是 JobTracker,从服务器就是 TaskTracker
MapReduce 的启动和运行机制:

MapReduce

  1. 应用进程 JobClient 将用户作业 JAR 包存储在 HDFS 中,将来这些 JAR 包会分发给 Hadoop 集群中的服务器执行 MapReduce 计算。2. 应用程序提交 job 作业给 JobTracker。3.JobTracker 根据作业调度策略创建 JobInProcess 树,每个作业都会有一个自己的 JobInProcess 树。4.JobInProcess 根据输入数据分片数目(通常情况就是数据块的数目)和设置的 Reduce 数目创建相应数量的 TaskInProcess。5.TaskTracker 进程和 JobTracker 进程进行定时通信。6. 如果 TaskTracker 有空闲的计算资源(有空闲 CPU 核心),JobTracker 就会给它分配任务。分配任务的时候会根据 TaskTracker 的服务器名字匹配在同一台机器上的数据块计算任务给它,使启动的计算任务正好处理本机上的数据,以实现我们一开始就提到的“移动计算比移动数据更划算”。7.TaskTracker 收到任务后根据任务类型(是 Map 还是 Reduce)和任务参数(作业 JAR 包路径、输入数据文件路径、要处理的数据在文件中的起始位置和偏移量、数据块多个备份的 DataNode 主机名等),启动相应的 Map 或者 Reduce 进程。8.Map 或者 Reduce 进程启动后,检查本地是否有要执行任务的 JAR 包文件,如果没有,就去 HDFS 上下载,然后加载 Map 或者 Reduce 代码开始执行。9. 如果是 Map 进程,从 HDFS 读取数据(通常要读取的数据块正好存储在本机);如果是 Reduce 进程,将结果数据写出到 HDFS。

shuffle:
分布式计算需要将不同服务器上的相关数据合并到一起进行下一步计算,这就是 shuffle:
每个 Map 任务的计算结果都会写入到本地文件系统,等 Map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在 Map 任务进程调用一个 Partitioner 接口,对 Map 产生的每个 进行 Reduce 分区选择,然后通过 HTTP 通信发送给对应的 Reduce 进程。Partitioner 用 Key 的哈希值对 Reduce 任务数量取模,相同的 Key 一定会落在相同的 Reduce 任务 ID 上。从这样不管 Map 位于哪个服务器节点,相同的 Key 一定会被发送给相同的 Reduce 进程。Reduce 任务进程对收到的 进行排序和合并,相同的 Key 放在一起,组成一个 传递给 Reduce 执行。
问:为什么mapper计算完的结果要放到硬盘呢?那再发送到reducer不是还有个读取再发送的过程吗?这中间不就有一个重复的写和读的过程吗?
答:主要为了可靠性,spark就不写硬盘,所以快。
注:当某个key聚集了大量数据:数据倾斜,会导致任务失败。
文章头说的:移动计算主要是map阶段,reduce阶段数据还是要移动数据合并关联,不然很多计算无法完成。
排序贯穿于Map任务和Reduce任务,是MapReduce非常重要的一环,排序操作属于MapReduce计算框架的默认行为
主要用到了两种排序方法:快速排序和归并排序:
三次排序:在这3次排序中第一次是在map输出到达缓存阈值,从缓冲区做的排序,使用的算法是快速排序,第二次排序是Map任务完成之前 ,多个第一步溢出写成的文件进行合并并排序和第三次shuffle阶段多个Map任务的输出文件合并排序使用的是归并排序。
排序详情见:https://blog.csdn.net/u013080251/article/details/60146294
4、Yarm
在 MapReduce 应用程序的启动过程中,最重要的就是要把 MapReduce 程序分发到大数据集群的服务器上,在 Hadoop 1 中,这个过程主要是通过 TaskTracker 和 JobTracker 通信来完成。缺点:服务器集群资源调度管理和 MapReduce 执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如 Spark 或者 Storm,就无法统一使用集群中的资源了。解决:将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。
在这里插入图片描述
Yarn 包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。
ResourceManager 进程负责整个集群的资源调度管理,通常部署在独立的服务器上;NodeManager 进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的 DataNode 进程一起出现。
资源管理器又包括两个主要组件:调度器和应用程序管理器。
调度器其实就是一个资源分配算法,我们可以写自己的资源分配算法
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。
Yarn 进行资源分配的单位是容器(Container)容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。
应用程序启动后需要在集群中运行一个 ApplicationMaster,ApplicationMaster 也需要运行在容器里面。每个应用程序启动后都会先启动自己的 ApplicationMaster,由 ApplicationMaster 根据应用程序的资源需求进一步向 ResourceManager 进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。

Yarn 的整个工作流程。

  1. 我们向 Yarn 提交应用程序,包括 MapReduce ApplicationMaster、我们的 MapReduce 程序,以及 MapReduce Application 启动命令。2.ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster。3.MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。4.MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。5.Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster 通信,汇报自己的运行状态,如果运行结束,MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源。

MapReduce 如果想在 Yarn 上运行,就需要开发遵循 Yarn 规范的 MapReduce ApplicationMaster,相应地,其他大数据计算框架也可以开发遵循 Yarn 规范的 ApplicationMaster,这样在一个 Yarn 集群中就可以同时并发执行各种不同的大数据计算框架,实现资源的统一调度管理。

为什么 HDFS 是系统,而 MapReduce 和 Yarn 则是框架?框架在架构设计上遵循一个重要的设计原则叫“依赖倒转原则”:
依赖倒置原则理解:
依赖倒转原则是高层模块不能依赖低层模块,它们应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。
依赖倒置原则的理解见:https://blog.csdn.net/qililong88/article/details/105123865
资源调度和计算调度的区别是什么?
作者回复: 资源调度如Yarn,管理的是集群中的计算资源,如CPU、内存的分配和回收。
计算调度应该是计算任务调度,如map和reduce的任务或者spark的任务,应该在哪个container启动,启动前后顺序管理等。

附:单机安装伪hadoop集群
见:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值