Hive 常见问题 & 及处理方法

407 阅读5分钟

Hive 常见问题

Hive 离线任务运行过程中常见的问题,及排查过程。

1 任务运行慢

可能得原因:

  • Client、Map、Reduce、AM OOM
  • 读取数据量过大
  • 任务失败重试
  • Map 数量过多
  • ReduceTask 数据倾斜
  • MapTask 数据倾斜
  • Hdfs callQueue 打平,响应变慢
1.1 OOM

问题1:客户端报错报错 java.lang.OutOfMemoryError: Java heap space 分析:客户端在提交job前会获取数据文件的块信息、大小信息,确定文件如何进行切片,此过程消耗客户端的内存和cpu,当数据量过大时,如果本地jvm设置的比较小,会导致客户端内存溢出报错。
处理:可以设置如下参数调大客户端jvm: 

# 在shell环境下启动hive前设置
export HADOOP_CLIENT_OPTS=" -Xmx16g"  

问题2:map/reduce过程中报错:
报错1:java.lang.OutOfMemoryError: GC overhead limit exceeded
报错2:java.lang.OutOfMemoryError: Java heapspace
报错3:running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 12.7 GB of 9.3 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
1.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

3、可以调大资源申请量(注意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.3 任务失败重试

1、 到Hive任务Job页面,先查看失败的任务 image.png 2、 找到失败且运行时间较长的任务
运行时长短,忽略
image.png 3、运行时间长,重点关注

image.png

4、查看 nm syslog (MapReduce作业日志), reduce作业重点关注 shuffle 相关日志,寻找错误细节,本错误是任务遇到慢盘异常节点,任务失败重试,耗时增加了53分钟。

image.png

5、查看完整日志,发现都是在连接同一个节点时 对方节点返回500错误:


2024-07-28 02:34:59,230 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: Assigning xxxx:xxxx with 4 to fetcher#5
2024-07-28 02:34:59,230 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: assigned 4 of 4 to xxxx:xxxx to fetcher#5
2024-07-28 02:34:59,231 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.Fetcher: Setup to connect to xxxxwith 4 map outputs. url: xxxx/mapOutput?job=job_xxx&reduce=4844&map=xxx,xxx,xxx,xxx
2024-07-28 02:34:59,233 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.Fetcher: for url=xxxx/mapOutput?job=xxx&reduce=4844&map=xxx,xxx,xxx,xxx sent hash and received reply
2024-07-28 02:34:59,235 WARN [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.Fetcher: Invalid map id 
java.lang.IllegalArgumentException: TaskAttemptId string : TTP/1.1 500 Internal Server Error
Content-Type: text/plain; charset=UTF is not properly formed
	at org.apache.hadoop.mapreduce.TaskAttemptID.forName(TaskAttemptID.java:201)
	at org.apache.hadoop.mapreduce.task.reduce.Fetcher.copyMapOutput(Fetcher.java:514)
	at org.apache.hadoop.mapreduce.task.reduce.Fetcher.copyFromHost(Fetcher.java:365)
	at org.apache.hadoop.mapreduce.task.reduce.Fetcher.run(Fetcher.java:210)
2024-07-28 02:34:59,235 WARN [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.Fetcher: copyMapOutput failed for tasks [xxx, xxx, xxx, xxx]
2024-07-28 02:34:59,235 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: Reporting fetch failure for xxx to MRAppMaster.
2024-07-28 02:34:59,235 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: Reporting fetch failure for xxx to MRAppMaster.
2024-07-28 02:34:59,235 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: Reporting fetch failure for xxx to MRAppMaster.
2024-07-28 02:34:59,235 INFO [fetcher#5] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: Reporting fetch failure for xxx to MRAppMaster.

nm节点异常信息可通过:物理机监控和nm所在机器操作系统日志进行排查。

1.4 Map数据过多

map数主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小
如果读取的表中有太多小文件会导致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 任务报错

2.1 客户端报错:java.io.IOException:Split metadata size exceeded xxxxxxx
分析: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