问题:在运行hivesql的时候,可能会碰到错误代码:
FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask
环境:hive使用的MR引擎计算的。
原因:开启了hive的mapjoin,(设置参数数hive.auto.convert.join=true 默认开启)在map端就会进行表的join,
可以省略reduce阶段,时效更快,但是需要足够的内存,因为在map端join,需要其中一张表在每一个map中都有完整的数据,才能和另外一张表分布在map中的数据关联,如果内存不够,就会报这个错。
mapjoin的过程:
通过MapReduce Local Task,将小表读入内存,生成HashTableFiles上传至Distributed Cache中,这里会HashTableFiles进行压缩。MapReduce Job在Map阶段,每个Mapper从Distributed Cache读取HashTableFiles到内存中,顺序扫描大表,在Map阶段直接进行Join,将数据传递给下一个MapReduce任务。
Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。
解决措施:
1、在hivesql的时候指定 hive.auto.convert.join=false
2、修改配置文件hive_conf.xml
<property>
<name>hive.auto.convert.join</name>
<value>false</value>//true修改为false
<description>Enables the optimization about converting common join into mapjoin</description>
</property>
mapjoin的使用方法以及注意事项参考链接:
https://blog.csdn.net/sinat_37574187/article/details/120444216