当前位置: 首页 > news >正文

生产环境中MapReduce的最佳实践

目录

 MapReduce跑的慢的原因

 MapReduce常用调优参数

1. MapTask相关参数

2. ReduceTask相关参数

3. 总体调优参数

4. 其他重要参数

调优策略

 MapReduce数据倾斜问题

1. 数据预处理

2. 自定义Partitioner

3. 调整Reduce任务数

4. 小文件问题处理

5. 二次排序

6. 使用桶表

7. 使用随机前缀

8. 参数调优

实施步骤


 MapReduce跑的慢的原因

MapReduce程序效率的瓶颈在于两点:

1)计算机性能

CPU、内存、磁盘、网络

2I/O操作优化

(1)数据倾斜

(2)Map运行时间太长,导致Reduce等待过久

(3)小文件过多

 MapReduce常用调优参数

1. MapTask相关参数

  • mapreduce.task.io.sort.mb: 设置Map端排序的内存大小,默认为100MB。增加此值可以减少溢写磁盘的次数,但需要根据集群内存情况调整。
  • mapreduce.map.sort.spill.percent: Map端溢写阈值,默认为0.80。当Map端缓存区达到该比例时会触发溢写操作。
  • mapreduce.map.memory.mb: 每个MapTask分配的最大内存,默认根据集群配置。
  • mapreduce.map.java.opts: 设置MapTask JVM的启动参数,可以用来调整JVM的堆内存大小等。

2. ReduceTask相关参数

  • mapreduce.reduce.memory.mb: 每个ReduceTask分配的最大内存,默认根据集群配置。
  • mapreduce.reduce.java.opts: 设置ReduceTask JVM的启动参数,同样可以用来调整JVM的堆内存大小等。
  • mapreduce.job.reduces: 设置ReduceTask的数量,合理设置可以平衡负载和任务执行效率。
  • mapreduce.reduce.shuffle.parallelcopies: 控制Reduce端同时进行的合并操作数量。

3. 总体调优参数

  • mapreduce.job.reduce.slowstart.completedmaps: 控制ReduceTask开始执行前等待MapTask完成的比例,默认为0.05,即5%。
  • yarn.nodemanager.vmem-pmem-ratio: 虚拟内存与物理内存的比例,用于计算每个容器所需的虚拟内存大小。
  • yarn.scheduler.maximum-allocation-mb: YARN调度器为任务分配的最大内存。
  • yarn.scheduler.minimum-allocation-mb: YARN调度器为任务分配的最小内存。

4. 其他重要参数

  • mapreduce.input.fileinputformat.split.minsize: 输入文件的最小切片大小。
  • mapreduce.input.fileinputformat.split.maxsize: 输入文件的最大切片大小。
  • mapreduce.job.cache.files: 添加到Job的缓存文件列表。
  • mapreduce.job.cache.archives: 添加到Job的缓存归档文件列表。

调优策略

  • 资源分配: 根据集群资源和作业需求合理分配MapTask和ReduceTask的资源。
  • 并发度: 适当增加并发度可以加快作业执行速度。
  • 数据分区: 合理的数据分区可以减少网络传输量。
  • 压缩: 对中间结果进行压缩可以减少I/O开销。

 MapReduce数据倾斜问题

1)数据倾斜现象

数据频率倾斜——某一个区域的数据量要远远大于其他区域。

数据大小倾斜——部分记录的大小远远大于平均值。

2)减少数据倾斜的方法

1. 数据预处理

  • 数据过滤: 在Map阶段通过过滤掉一些不必要的数据,减少处理的数据量。
  • 数据采样: 对输入数据进行采样分析,了解数据分布特性,从而更合理地进行后续处理。

2. 自定义Partitioner

  • 重新设计Partitioner: 通过自定义Partitioner算法,使数据更均匀地分配给各个Reduce任务。
  • 使用哈希函数: 使用哈希函数将key映射到特定的Reduce任务上,避免所有相同key的数据都发送到同一个Reduce任务。

3. 调整Reduce任务数

  • 增加Reduce任务数: 通过增加Reduce任务的数量来分散数据处理的压力。
  • 动态调整: 根据数据分布的实际情况动态调整Reduce任务的数量。

4. 小文件问题处理

  • CombineTextInputFormat: 使用CombineTextInputFormat作为InputFormat,它可以合并小文件,减少Map任务的数量。
  • Combiner: 在Map阶段使用Combiner对数据进行局部聚合,减少中间数据量。

5. 二次排序

  • 优化Map输出: 在Map阶段优化输出格式,例如使用缓冲区来收集和排序数据,减少数据倾斜。
  • Buffering: 在Map阶段设置合理的buffer size来控制数据溢写的时间点。

6. 使用桶表

  • 构建桶表: 如果数据分布不均是由于key的分布不均引起的,可以考虑先创建一个“桶表”,将数据按照某种规则预先分配到不同的“桶”中。

7. 使用随机前缀

  • 添加随机前缀: 对于一些特别热门的key,可以在key前面加上随机前缀,这样即使原本相同的key也会被分配到不同的Reduce任务上。

8. 参数调优

  • 调整MapReduce的参数: 如mapreduce.task.io.sort.mb(Map端排序内存大小),mapreduce.job.reduces(Reduce任务数量)等,以适应不同数据集的特点。

实施步骤

  1. 分析数据分布: 使用工具或脚本分析输入数据的分布情况,找出可能导致倾斜的关键因素。
  2. 评估方案: 根据分析结果评估哪种方案更适合当前的情况。
  3. 实施和测试: 实施所选方案,并在测试环境中验证其效果。
  4. 监控和调整: 在生产环境中持续监控MapReduce作业的性能,并根据实际情况进行调整。

相关文章:

  • 微信小程序在不同移动设备上的差异导致原因
  • Startup-SBOM:一款针对RPM和APT数据库的逆向安全工具
  • Jenkins使用Publish Over SSH插件远程部署程序到阿里云服务器
  • vue3+ts+vite+pinia+element-plus搭建一个项目
  • 使用Docker-compose一键部署Wordpress平台
  • Bean对象生命周期流程图
  • Compose(2)声明式UI
  • 简简单单用用perf
  • Shell运算符
  • CDD数据库文件制作(五)——服务配置(0x19_DTC Code)
  • 基于深度学习的图像特征优化识别复杂环境中的果蔬【多种模型切换】
  • leetcode 41-50(2024.08.19)
  • 深度学习-----------------------含并行连结的网络GoogLeNet
  • 【大数据算法】开篇:一文掌握大数据概述、特点及应用等。
  • 程序员如何学习开源项目
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • flask接收请求并推入栈
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Javascript编码规范
  • JavaScript函数式编程(一)
  • js递归,无限分级树形折叠菜单
  • React+TypeScript入门
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • ubuntu 下nginx安装 并支持https协议
  • 程序员最讨厌的9句话,你可有补充?
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 开源地图数据可视化库——mapnik
  • 前端面试之CSS3新特性
  • 如何在 Tornado 中实现 Middleware
  • 深度学习中的信息论知识详解
  • 微信小程序设置上一页数据
  • 小程序 setData 学问多
  • 运行时添加log4j2的appender
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #{} 和 ${}区别
  • #14vue3生成表单并跳转到外部地址的方式
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)logging(日志模块)
  • (solr系列:一)使用tomcat部署solr服务
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (计算机网络)物理层
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .aanva
  • .Net Core 微服务之Consul(三)-KV存储分布式锁