hive oom问题和解决办法

问题一、OOM问题

1. 客户端报错报错 java.lang.OutOfMemoryError: Java heap space 
分析:客户端在提交job前会获取数据文件的块信息、大小信息,确定文件如何进行切片,此过程消耗客户端的内存和cpu,
  当数据量过大时,如果本地jvm设置的比较小,会导致客户端内存溢出报错
处理:可以设置如下参数调大客户端jvm: 
     (1)在python脚本中添加 os.environ["HADOOP_CLIENT_OPTS"]="-Xmx16g"
     (2)在shell环境下启动hive前设置 export HADOOP_CLIENT_OPTS=" -Xmx16g"
     (3)在 数据查询/自助提数 中不支持设置。

2. map/reduce过程中报错:
第一种报错:“java.lang.OutOfMemoryError: GC overhead limit exceeded“
第二种报错:“java.lang.OutOfMemoryError: Java heapspace”
第三种报错:“running beyondphysical memory limits.Current usage: 4.3 GB of 4.3 GBphysical memory used; 7.4 GB of 13.2 GB virtual memory used. Killing container”。
分析:这三种报错是由于map task或reduce task在container中运行时处理数据需要的内存资源与申请分配到的资源不匹配造成,
处理:这时可以在原资源基础上调大对应的map和reduce申请资源的参数以及对应jvm参数:
  set mapreduce.map.memory.mb=6144;
  set mapreduce.map.java.opts=-Xmx4608M;(根据需要更改具体值,但这对参数的比例是1:0.75)
  set mapreduce.reduce.memory.mb = 8192;
  set mapreduce.reduce.java.opts = -Xmx6144M;(根据需要更改具体值,但这对参数的比例是1:0.75)
  同时也可以提升vcore的数量,加快container的计算,降低oom的几率
  set mapreduce.map.cpu.vcores = 4
  set mapreduce.reduce.cpu.vcores = 8

3. MRAppMaster报错java.lang.OutOfMemoryError thrown from theUncaughtExceptionHandler
分析:如果job输入的数据很大,导致产生了大量的Mapper和Reducer,MRAppMaster压力很大,最终导致MRAppMaster内存不足
处理:这时可以适当调大am的相关内存参数:
  set yarn.app.mapreduce.am.command-opts=-Xmx4608M
  set yarn.app.mapreduce.am.resource.mb=8192
  set yarn.app.mapreduce.am.resource.cpu-vcores=10


问题二、客户端报错:java.io.IOException:Split metadata size exceeded 10000000
分析:hadoop参数重mapreduce.job.split.metainfo.maxsize 参数默认设置10M,
     job.splitmetainfo该文件记录split的元数据信息,如input文件过多,记录的文件结构信息超出默认设置就会报错;输入文件包括大量小文件或者文件目录,造成Splitmetainfo文件超过默认上限。这个机制也是hadoop集群要求文件大小不能过小或目录过多,避免namenode出现元数据加载处理瓶颈。如block默认128M,则文件应大于这个,尽量合并小文件。
处理:可临时调整参数忽略此校验:set mapreduce.job.split.metainfo.maxsize=-1
  或者将此值设置的更大:set mapreduce.job.split.metainfo.maxsize=20000000


问题三、因map数超阈值被kill,可根据集群预置调整map数,如
map数主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小
1. 如果读取的表中有太多小文件会导致map数过多,可以通过设置以下参数在map执行前合并小文件,以降低map数:
 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
 set hive.hadoop.supports.splittable.combineinputformat = true;
 set mapreduce.input.fileinputformat.split.maxsize = 256000000;
 set mapreduce.input.fileinputformat.split.minsize.per.node=256000000;
 set mapreduce.input.fileinputformat.split.minsize.per.rack=256000000;

2. 对于数据量过大的问题
    (1)如果文本类型文件,如txt、orc数据量太大,可以通过调整每个map处理的数据量来降低map数
  set mapreduce.input.fileinputformat.split.maxsize = 256000000;
  set mapreduce.input.fileinputformat.split.minsize = 256000000;
 (2)如果是lzo格式表,可以设置跳过文件索引
   set hive.lzo.use.index=false; 
     这时需搭配调高map的内存以及vcore数量
      set mapreduce.map.memory.mb=6144;(根据需要根据文件大小设置)
    set mapreduce.map.java.opts=-Xmx4608M;(这对参数的比例是1:0.75)
    set yarn.app.mapreduce.am.resource.cpu-vcores=10

注:如果因为数据量太大导致map和reduce运行缓慢,可以调大资源申请量(注意map和reduce对应的一对参数的设置比例为1:0.75)
// MAP YARN 申请内存
set mapreduce.map.memory.mb=6144;
// MAP JVM 内存
set mapreduce.map.java.opts=-Xmx4608M;(根据需要更改具体值)

// REDUCE YARN 申请内存
set mapreduce.reduce.memory.mb=8192;
// REDUCE JVM 内存
set mapreduce.reduce.java.opts=-Xmx4096M;(根据需要更改具体值)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值