我正在使用hive-1.1.0。通过只读且不包含 predicate 的beeline向hiveserver2提交查询将导致hiveserver2尝试从hdfs本身读取数据,而不生成mapreduce作业:
SELECT * FROM my_table LIMIT 100;
对于非常大的数据集,这可能会导致hiveserver2占用大量内存,从而导致长时间的垃圾收集暂停。添加一个“假” predicate 将导致hiveserver2根据需要运行mapreduce作业;例如
SELECT * FROM my_table WHERE (my_id > 0 OR my_id <= 0) LIMIT 100;
所谓“假”,我指的是一个无关紧要的 predicate ;上面的示例 predicate 将始终为true。是否有强制hiveserver2始终运行mapreduce作业而不必添加虚假 predicate 的设置?
我不是说hiveserver2何时确定它可以在本地运行mapreduce作业;我完全丧失了这种能力:
> SET hive.exec.mode.local.auto;
+----------------------------------+--+
| set |
+----------------------------------+--+
| hive.exec.mode.local.auto=false |
+----------------------------------+--+
但是没有 predicate 的查询仍然完全由hiveserver2读取,从而导致问题。
非常感谢您的指导。谢谢!
1条答案
按热度按时间x0fgdtte1#
一些select查询可以转换为单个fetch任务,而无需map reduce。
此行为由控制
hive.fetch.task.conversion
配置参数。可能的值为:none
,minimal
以及more
.如果要禁用获取任务转换,请将其设置为“无”: