简介
由于hive本身的优化机制,一些简单的语句如select *,select 字段1,字段2 from table,hive不会启动MapReduce任务。但是有时候我们并不希望他这么做,比如:通过hiveserver2使用Java的jdbc发送select * from aaa,这个语句,当aaa这个表数据量超大的时候,比如我遇到的3000+的字段,5000万的数据量,程序就卡死了,查看hdp的后台页面,发现该hiveserver2的机器,CPU使用很高,并且已经几乎不会响应其他请求。原因就是因为hive的优化,使得没有进行MapReduce任务,而是在那个hiveserver2本地机器上启动fetch task,数据量巨大的时候,就可能使它崩溃了。
解决办法
现在我们采用的办法是,禁用掉hive的这些features,强制使用MapReduce执行语句,这样压力就不会丢给那一台hiveserver2机器,而是整个集群来承担。涉及的参数及含义如下:
为了不影响其他人使用hive,所以没有通过改hive配置文件的方式,而是在每一次会话中来设置参数,hiveserver2的jdbc,是可以设置这些参数的。
set hive.fetch.task.conversion=none
此参数可取3个值:
1. none : 禁用hive优化,所有语句都会启动MapReduce任务
2. minimal :select * 语句不会启动MapReduce任务, select col0, col1... 语句会启动MapReduce任务
3. more :select col0, col1... 语句也不会启动MapReduce任务
相关参考:
http://www.openkb.info/2015/01/how-to-enable-fetch-task-instead-of.html