Mapreduce 参数---mapred.map.child.java.opts

本文分析了HadoopJob集群Load过高的原因,发现是由于mapred.child.java.opts设置不当导致内存资源耗尽。文章介绍了如何合理设置此参数及mapreduce.map.memory.mb等相关参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现Hadoop Job集群的load非常高,最后发现是mapred.child.java.opts设置过大导致的,我们当初设置为-Xmx5120导致TaskTracker上内存资源耗尽,进而开始不断swap磁盘上数据,load升高 在执行一个Task的时候,首先会根据JobConf中设定的JVM参数写入一个taskjvm.sh文件中,然后调用Linux命令 bin/bash -c taskjvm.sh 来执行 task.

mapred.child.java.opts就是设定jvm的参数之一,在新版本中已经标准为过期,取而代之的是区分Map Task 和Reduce Task 的jvm opts , mapred.map.child.java.opts和mapred.reduce.child.java.opts(默认值为-Xmx200m)

当用户在不设置该值情况下,会以最大1G jvm heap size启动task,有可能导致OutOfMemory,所以最简单的做法就是设大参数,并且由于这个值不是final,所以用户可以在自己的mapred-site.xml中可以覆盖默认值mapreduce.admin.map.child.java.opts   mapreduce.admin.reduce.child.java.opts

 

mapred.child.java.opts设置成多大比较合适:

这个参数是配置每个map或reduce使用的内存数量,默认是200m,一般情况下,该值设置为 总内存/并发数量(=核数)

 

mapred.map.child.java.opts和mapreduce.map.memeory.mb的区别:

mapreduce.map.memory.mb是向RM申请的内存资源大小,这些资源可用用于各种程序语言编写的程序, mapred.map.child.java.opts 一般只用于配置JVM参数

### Hadoop Hive MapRedTask 执行时遇到 `GC overhead limit exceeded` 错误的解决方案 当Hive作业执行过程中出现`GC overhead limit exceeded`错误时,表明垃圾回收器花费了过多的时间来尝试释放内存中的对象,但只成功回收了一小部分可用空间。这通常发生在JVM试图运行大量短生命周期的对象或存在内存泄漏的情况下。 #### 增加 JVM 参数配置 调整MapReduce任务的JVM参数可以有效缓解此问题。具体来说: - 提高堆大小以容纳更多的临时对象,减少频繁触发年轻代收集的可能性。 ```sql SET mapreduce.map.memory.mb=8096; SET mapreduce.reduce.memory.mb=8096; SET mapred.child.java.opts=-Xmx8000m; SET mapreduce.map.java.opts=-Xmx8096m; SET mapreduce.reduce.java.opts=-Xmx8096m; ``` - 使用更高效的垃圾回收算法,比如CMS(Concurrent Mark Sweep),它可以在应用程序继续运行的同时清理不再使用的对象,从而降低暂停时间。 ```sql SET mapreduce.map.java.opts="-Xmx6144m -XX:+UseConcMarkSweepGC"; SET mapreduce.reduce.java.opts="-Xmx6144m -XX:+UseConcMarkSweepGC"; ``` 这些设置有助于提高单个Mapper/Reducer实例的最大允许内存用量,并指定更适合大数据集处理场景下的垃圾回收策略[^3]。 #### 数据分布优化 对于大规模数据集的操作,除了增加硬件资源外,还可以考虑改进SQL查询逻辑以及如何分配工作负载给不同的节点。例如,在插入语句中添加`CLUSTER BY`子句可以让输入记录按照特定列分组并均匀分布在多个reducer之间,进而减轻单一进程的压力。 ```sql INSERT INTO TABLE target_table PARTITION (partition_column) SELECT * FROM source_table CLUSTER BY partition_key; ``` 这种方法不仅能够平衡各阶段的工作负荷,还能促进更好的本地化读取模式,进一步提升整体性能表现[^2]。 #### 控制并发度 适当控制并发的任务数目也是解决问题的一个方向。如果一次性启动太多的小型任务可能会导致整个集群资源紧张甚至耗尽。因此可以根据实际情况调整Split的数量或者设定合理的最大并行度限制。 ```bash /usr/bin/sqoop import \ --connect jdbc:mysql://hadoop01:3306/scrm \ --username root \ --password 123456 \ --query "select *,date_format(create_date_time,'%Y-%m-%d') as dt from employee where 1=1 and \$CONDITIONS" \ --hcatalog-database ods_dim \ --hcatalog-table ods_dim_scrm_employee_i \ --split-by id \ -m N # 这里的N代表期望创建多少个mapper去完成这次import操作 ``` 通过上述措施应该能较好地应对因`GC overhead limit exceeded`引发的各种挑战[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值