hive查询count(*)出错tez.runtime.io.sort.mb及其解决办法

【运行环境】

hadoop-2.7.3  hive-1.2.1  Tez-0.7.0

有关Apache Tez的简介:

Tez is the next generation Hadoop Query Processing framework written on top of YARN. 它是一款基于YARN的新一代数据处理和分析框架,亮点:支持DAG调度作业,它能把多个有依赖的作业转换成一个作业,所以能大幅提升DAG性能,从而提升M-R查询性能。这一点可以从我下面的作业截图看出,count(*)查询9千万条数据在12秒内就得出结果


【报错现象】

在hive shell中通过tez查询count(*)时发生错误IllegalArgumentException:tez.runtime.io.sort.mb 报错信息摘要:

TaskAttempt 3 failed, info=[Error: Failure while running task:java.lang.IllegalArgumentException: tez.runtime.io.sort.mb 1351 should be larger than 0 and should be less than the available task memory (MB):526


【报错原因】

tez.runtime.io.sort.mb设置的值超出了当前任务可用的内存大小时,就会发生此错误


【解决】

查看Ambari页面中Tez的配置项tez.runtime.io.sort.mb的值是1351MB,而报错信息中说的是1351Mb超过了当前任务可用的内存526Mb,

所以解决方案有两种——

(1)要么在hive shell(或者其他的hive客户端)中设置一个值,使其小于526Mb即可,请看截图

hive查询count(*)出错tez.runtime.io.sort.mb及其解决办法

(2)要么调低tez.runtime.io.sort.mb配置项的值,使其小于526Mb;请看截图

hive查询count(*)出错tez.runtime.io.sort.mb及其解决办法

然后重跑一次count(*)就好了。