MapReduce
Map:映射,多个,具体根据资源以及需求去设定,Reduce:聚和,生产上默认是一个。
MR2.x的架构设计(MR on Yarn流程、Mr提交job)
- Yarn:ResourceManager和NodeManager
- ResourceManager:Applications Manager(应用程序管理器)和Resource Scheduler(资源memory和cpu调度器)
- NodeManager中的红色框
container虚拟概念,属于NM节点上, 一个Application通常会被分解成多个任务并行执行,其中,每个任务要使用一定量的资源,这些资源被封装成container。详细说来,container不仅包含一个任务的资源说明,还包含很多其他信息,比如Container对应的节点、启动container所需的文件资源、环境变量和命令等信息,MR、Spark等技术的最小单元
map task和reduce Task是两种任务 - 用户向Yarn提交应用程序(job app application),jar文件、sql到ResourceManager的ApplicationsManager上面,其中包裹ApplicationMaster程序、启动ApplicationMaster命令等
- RM为该job分配第一个(hadoop02节点)container,运行job的ApplicationMaster
- ApplicationMaster向Applications Manager注册,这样就可以在RM WEB界面查询这个job的运行状态
- Application Master采用轮询的方式通过RPC协议向RM申请和领取资源
- Application Master拿到资源,就对应的与NodeManager通信,要求启动任务
- NodeManager为任务设置好运行环境(jar包等),将任务启动命令写在一个脚本里,并且通过该脚本启动任务即map task和reduce task
- 各个task通过rpc协议向Application Master汇报自己的状态和进度,以此让Application Master随时掌握各个task的运行状态,从而在task运行失败,重启任务
- 任务结束Application Master向Applications Manager注销且关闭自己
总结Yarn运行流程分为两步:1、启动Application Master,申请资源;2、运行任务,直到任务运行完成
具体详细的流程包含代码请参考:http://blog.itpub.net/30089851/viewspace-2095837/
Map Task的数量
[hadoop@hadoop01 hadoop]$ hdfs dfs -put 2.log /wordount/input
19/12/08 21:21:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@hadoop01 hadoop]$
[hadoop@hadoop01 hadoop]$
[hadoop@hadoop01 hadoop]$ hdfs dfs -ls /wordount/input
19/12/08 21:21:29 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r-- 1 hadoop supergroup 86 2019-11-30 20:39 /wordount/input/1.log
-rw-r--r-- 1 hadoop supergroup 20 2019-12-08 21:21 /wordount/input/2.log
[hadoop@hadoop01 hadoop]$
[hadoop@hadoop01 hadoop]$ hadoop jar ./share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.16.2.jar wordcount /wordount/input /wordount/output11
19/12/08 21:21:58 INFO input.FileInputFormat: Total input paths to process : 2
19/12/08 21:21:58 INFO mapreduce.JobSubmitter: number of splits:2
Job Counters
Launched map tasks=2
Launched reduce tasks=1
Map Task数量:
当文件的size小于block块的size(128M)的时候,maptask的数量和文件数量有关系;当文件的size大于block块的size的时候,maptask的数量和文件被切割为多少块有关;所以生产上控制一个文件的size要稍微小于一个blocksize,当blocksize为128M:的时候,文件的size设置在120M左右
比如:我们设定hdfs的块大小是64mb,如果我们输入有三个文件,大小分别是3mb、65mb和127mb,那么mapreduce会把3mb文件分为一个输入分片(input split),65mb则是两个输入分片(input split),而127mb也是两个输入分片(input split),这样就会有5个map任务执行,3mb的文件就会执行的很快,但是127mb的文件就会执行很慢,导致机器资源浪费。所以生产上要合并小文件,或者压缩文件,这个也是mapreduce优化计算的一个关键点。
压缩文件参考:
https://ruozedata.github.io/2018/04/18/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9%EF%BC%8C%E4%BD%A0%E4%BB%AC%E7%9C%9F%E7%9A%84%E4%BA%86%E8%A7%A3%E5%90%97%EF%BC%9F/
- 文件格式:txtfile,orc,parquet
Parquet是一个基于列式存储的文件格式,它将数据按列划分进行存储
Orc也是一个列式存储格式,产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度
Hive: orc/parquet + bzip2
Hbase: hfile + snappy