reduce端优化
MapReduce 数据倾斜问题
1 )数据倾斜现象 数据频率倾斜 —— 某一个区域的数据量要远远大于其他区域。 数据大小倾斜 —— 部分记录的大小远远大于平均值。 2 )减少数据倾斜的方法 ( 1 )首先检查是否空值过多造成的数据倾斜 生产环境,可以直接过滤掉空值;如果想保留空值,就自定义分区,将空值加随机数打 散。最后再二次聚合。 ( 2 )能在 map 阶段提前处理,最好先在 Map 阶段处理。如: Combiner 、 MapJoin ( 3 )设置多个 reduce 个数 Hadoop-Yarn 生产经验 常用的调优参数 1 )调优参数列表 ( 1 ) Resourcemanager 相关 ( 1 ) Resourcemanager 相关 yarn.resourcemanager.scheduler.client.thread-count ResourceManager 处理调度 器请求的线程数量 yarn.resourcemanager.scheduler.class 配置调度器 (2) Nodemanager 相关 yarn.nodemanager.resource.memory-mb NodeManager 使用内存数 yarn.nodemanager.resource.system-reserved-memory-mb NodeManager 为系统保留 多少内存,和上一个参数二者取一即可 yarn.nodemanager.resource.cpu-vcores NodeManager 使用 CPU 核数 yarn.nodemanager.resource.count-logical-processors-as-cores 是否将虚拟核 数当作 CPU 核数 yarn.nodemanager.resource.pcores-vcores-multiplier 虚拟核数和物理核数乘数,例 如: 4 核 8 线程,该参数就应设为 2 yarn.nodemanager.resource.detect-hardware-capabilities 是否让 yarn 自己检测硬 件进行配置 yarn.nodemanager.pmem-check-enabled 是否开启物理内存检查限制 container yarn.nodemanager.vmem-check-enabled 是否开启虚拟内存检查限制 container yarn.nodemanager.vmem-pmem-ratio 虚拟内存物理内存比例 (3) Container 容器相关 yarn.scheduler.minimum-allocation-mb 容器最小内存 yarn.scheduler.maximum-allocation-mb 容器最大内存 yarn.scheduler.minimum-allocation-vcores 容器最小核数 yarn.scheduler.maximum-allocation-vcores 容器最大核数 Hadoop 综合调优 Hadoop 小文件优化方法 Hadoop 小文件弊端 HDFS 上每个文件都要在 NameNode 上创建对应的元数据,这个元数据的大小约为 150byte ,这样当小文件比较多的时候,就会产生很多的元数据文件, 一方面会大量占用 NameNode 的内存空间 , 另一方面就是元数据文件过多,使得寻址索引速度变慢。 小文件过多,在进行 MR 计算时,会生成过多切片,需要启动过多的 MapTask 。每个 MapTask 处理的数据量小, 导致 MapTask 的处理时间比启动时间还小,白白消耗资源。 1 )在数据采集的时候,就将小文件或小批数据合成大文件再上传 HDFS (数据源头) 2 ) Hadoop Archive (存储方向) 是一个高效的将小文件放入 HDFS 块中的文件存档工具,能够将多个小文件打包成一 个 HAR 文件,从而达到减少 NameNode 的内存使用 3 ) CombineTextInputFormat (计算方向) CombineTextInputFormat 用于将多个小文件在切片过程中生成一个单独的切片或者少 量的切片 4 )开启 uber 模式,实现 JVM 重用(计算方向) 默认情况下,每个 Task 任务都需要启动一个 JVM 来运行,如果 Task 任务计算的数据 量很小,我们可以让同一个 Job 的多个 Task 运行在一个 JVM 中,不必为每个 Task 都开启 一个 JVM 。( 1 )未开启 uber 模式,在 /input 路径上上传多个小文件并执行 wordcount 程序 [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2 (2)观察控制台 2021-02-14 16:13:50,607 INFO mapreduce.Job: Job job_1613281510851_0002 running in uber mode : false (3)观察
(4)开启 uber 模式,在 mapred-site.xml 中添加如下配置
(5)分发配置 [atguigu@hadoop102 hadoop]$ xsync mapred-site.xml (6)再次执行 wordcount 程序 [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2 (7)观察控制台 2021-02-14 16:28:36,198 INFO mapreduce.Job: Job job_1613281510851_0003 running in uber mode : true (8)观察
测试 MapReduce 计算性能 使用 Sort 程序评测 MapReduce ( 1 )使用 RandomWriter 来产生随机数,每个节点运行 10 个 Map 任务,每个 Map 产 生大约 1G 大小的二进制随机数 [atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples- 3.1.3.jar randomwriter random-data (2)执行 Sort 程序 [atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples- 3.1.3.jar sort random-data sorted-data (3)验证数据是否真正排好序了 [atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop- 3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client jobclient-3.1.3-tests.jar testmapredsort -sortInput random-data -sortOutput sorted-data 企业开发场景案例 需求 ( 1 )需求:从 1G 数据中,统计每个单词出现次数。服务器 3 台,每台配置 4G 内存, 4 核 CPU , 4 线程。 (2)需求分析: 1G / 128m = 8 个 MapTask ; 1 个 ReduceTask ; 1 个 mrAppMaster 平均每个节点运行 10 个 / 3 台 ≈ 3 个任务(4 3 3) HDFS 参数调优 ( 1 )修改: hadoop-env.sh
(2)修改 hdfs-site.xml
(2)分发配置 [atguigu@hadoop102 hadoop]$ xsync mapred-site.xml Yarn 参数调优 ( 1 )修改 yarn-site.xml 配置参数如下:
(2)分发配置 [atguigu@hadoop102 hadoop]$ xsync yarn-site.xml 执行程序 ( 1 )重启集群 [atguigu@hadoop102 hadoop-3.1.3]$ sbin/stop-yarn.sh [atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh (2)执行 WordCount 程序 [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output (3)观察 Yarn 任务执行页面 http://hadoop103:8088/cluster/apps



