使用的hive,表中的数据非常少,使用select * from table where id=1,运行没有问题。
select count(1) from table where id=1,出现错误
error while processing statement failed exception excution error return code2 from org.apache.hadoop.hive.ql.exec.mr.MapredTask
思考过程:
排查1:
这里是由于count以及带有where的条件,都会走MapReduce,所以如果where可以,那么count肯定是没有问题的。
这里这个一条排除
排查2
那么接下到底是什么原因,只能查看详细日志了
上面看了日志,说是内存溢出,因此查看内存。有10G
看来不是内存的问题。
排查3
数据量非常少,会不会被认为小作业,也就是Uber运行模式。
cloudera我们禁用Uber模式:
或则如果原生的,我们同样可以通过配置禁用
<!--开启uber模式-->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>false</value>
</property>
问题解决,原因是因为让我们数据量非常小的时候,hadoop启用了Uber模式,内存配置不合适造成我们内存溢出。这样关闭Uber问题解决。
#############################
uber运行模式详解:
Uber运行模式对小作业进行优化,不会给每个任务分别申请分配Container资源,这些小任务将统一在一个Container中按照先执行map任务后执行reduce任务的顺序串行执行。那么什么样的任务,mapreduce框架会认为它是小任务呢?
map任务的数量不大于mapreduce.job.ubertask.maxmaps参数(默认值是9)的值;
reduce任务的数量不大于mapreduce.job.ubertask.maxreduces参数(默认值是1)的值;
输入文件大小不大于mapreduce.job.ubertask.maxbytes参数(默认为1个Block的字节大小)的值;
map任务和reduce任务需要的资源量不能大于MRAppMaster(mapreduce作业的ApplicationMaster)可用的资源总量;也就是说yarn.app.mapreduce.am.resource.mb必须大于mapreduce.map.memory.mb和mapreduce.reduce.memory.mb以及yarn.app .mapreduce.am.resource.cpu-vcores必须大于mapreduce.map.cpu.vcores和mapreduce.reduce.cpu.vcores以启用ubertask。