强制HiveServer2运行MapReduce作业

时间:2019-05-17 19:28:14

标签: hadoop hive mapreduce hiveql beeline

我正在使用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完全读取,从而导致问题。

非常感谢任何指导。 谢谢!

1 个答案:

答案 0 :(得分:0)

一些选择查询可以转换为单个 FETCH 任务,完全不需要 map-reduce。

此行为由 hive.fetch.task.conversion 配置参数控制。 可能的值为:noneminimalmore

如果你想禁用 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