我正在使用hive-1.1.0。 通过Beeline向HiveServer2提交只读且不含谓词的查询将导致HiveServer2尝试从HDFS本身读取数据,而不会产生MapReduce作业:
SELECT * FROM my_table LIMIT 100;
对于非常大的数据集,这可能导致HiveServer2占用大量内存,从而导致长时间的垃圾回收暂停。添加“假”谓词将导致HiveServer2根据需要运行MapReduce作业;例如
SELECT * FROM my_table WHERE (my_id > 0 OR my_id <= 0) LIMIT 100;
我所说的“假”是指无关紧要的谓词。以上示例谓词将始终为真。 是否有一种设置可以强制HiveServer2始终运行MapReduce作业而不必添加虚假谓词?
我不是在说HiveServer2确定何时可以在本地运行MapReduce作业。我完全禁用了此功能:
> SET hive.exec.mode.local.auto;
+----------------------------------+--+
| set |
+----------------------------------+--+
| hive.exec.mode.local.auto=false |
+----------------------------------+--+
但是没有谓词的查询仍然会被HiveServer2完全读取,从而导致问题。
非常感谢任何指导。 谢谢!
答案 0 :(得分:0)
一些选择查询可以转换为单个 FETCH 任务,完全不需要 map-reduce。
此行为由 hive.fetch.task.conversion
配置参数控制。
可能的值为:none
、minimal
和 more
。
如果你想禁用 fetch 任务转换,请将其设置为 none:
set hive.fetch.task.conversion=none;
minimal
将触发 FETCH-only 任务
SELECT *, FILTER 对分区列(WHERE 和 HAVING 子句), 仅限限制。
more
将触发 FETCH-only 任务
仅选择任何类型的表达式,包括 UDF、FILTER、LIMIT (包括TABLESAMPLE、虚拟列)
还可以在此处阅读有关 hive.fetch.task.conversion.threshold
参数和更多详细信息:Hive Configuration Properties