写在前面
大家好,这里是立志于在有生之年看到并参与通用人工智能开发工作的Nobody,由于最近在公司要经常性地接触大数据工具,所以打算开一个大专栏对大数据工具进行学习总结整理。之前我们过完了MySQL的基础部分和进阶部分,我们现在来到了大数据工具的Hadoop。
以下为该部分的前置博客
一、MapReduce
-
圆周率计算:hadoop官方给出了一个用蒙特卡洛方法计算圆周率的MR程序,我们可以先试一下,执行以下命令运行,当然要先启动hadoop集群
# 提交命令 cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/ [hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar pi 10 50参数含义:
-
第一个参数:pi表示执行圆周率计算任务
-
第二个参数:用于指定map阶段运行的任务次数,并发度
-
第三个参数:用于指定每个map任务取样的个数
-
-
wordcount单词统计:统计文档中每个单词出现的次数
原始文本数据如下
实现思路
* map阶段:把输入的数据经过切割,全部标记1,因此输出就是<单词,1>
* shuffle阶段:经过MR程序内部自带默认的排序分组功能,把key相同的单词作为一组数据构成新的kv对
* reduce阶段:处理shuffle完的一组数据,改组数据就是该单词所有的键值对,对所有的1进行累加求和,就是单词的总次数
<!---->
# 提交命令
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
[hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar wordcount /input /out
-
Map阶段执行流程:
wordcount执行流程如下
mapreduce整体执行流程如下
-
整体执行流程
- 第一阶段:把输入目录下文件按照一定标准逐个进行逻辑切片,形成切片规划。默认size为128M
- 第二阶段:对切片中的数据按照一定的规则读取解析返回键值对。
- 第三阶段:调用Mapper类中的map方法处理数据
- 第四阶段:按照一定的规则对Map输出的键值对进行分区。默认不分区
- 第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序,默认根据key字典序排序
- 第六阶段:对所有溢出文件进行最终的merge合并,称为一个文件
-
Reduce阶段执行流程
- 第一阶段:ReduceTask主动从MapTask复制拉取属于需要自己处理的数据
- 第二阶段:把拉取来的数据,全部进行合并merge,即把分散的数据合并成一个大的数据,再对合并后的数据排序
- 第三阶段:对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中
-
Shuffle机制:一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称为shuffle
- Map端:
- collect阶段:将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区
- spill阶段:当内存中的数据量达到一定的阈值时,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会有
- merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件
- Reduce端
- Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据
- Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作
- Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部排序,ReduceTask只需保证Copy的数据的最终整体有效性即可
- Map端:
二、YARN
-
资源管理、任务调度:YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度
- 资源管理:集群的硬件资源,比如内存、CPU等
- 调度平台:多个程序同时申请计算资源如何分配,调度的规则
-
架构图
以下为官方给出的YARN架构图
- 集群物理层面
- ResourceManager:集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限。接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源
- NodeManager:从角色,一台机器上一个,负责管理本机器上的计算资源。根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况
- APP层面
- ApplicationMaster(App Mstr):应用程序的老大,负责程序内部各阶段的资源申请,监督程序的执行情况
- Client
- Container容器(资源的抽象)
- 集群物理层面
-
程序提交YARN集群
-
当用户向YARN提交一个应用程序后,YARN将分两个阶段运行该程序
- 第一个阶段:客户端申请资源启动运行本次程序的ApplicationMaster
- 第二个阶段:由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成
-
第一步:用户通过客户端向YARN中ResourceManager提交应用程序
-
第二步:ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster
-
第三步:ApplicationMaster启动成功后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManager查看应用程序的运行状态
-
第四步:AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态
-
第五步:一旦AM申请到资源后,便与对应的NodeManager通信,要求它启动任务
-
第六步:NM为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
-
第七步:各个任务通过某个RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向AM查询应用程序的当前运行状态
-
第八步:应用程序运行完成后,AM向RM注销并关闭自己
-
-
资源调度器scheduler和调度策略