强制 HiveServer2 运行 MapReduce 作业

Posted

技术标签:

【中文标题】强制 HiveServer2 运行 MapReduce 作业【英文标题】:Force HiveServer2 to run MapReduce job 【发布时间】:2019-05-17 19:28:13 【问题描述】:

我正在使用 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】:

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

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

如果你想禁用抓取任务转换,设置为无:

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

【讨论】:

以上是关于强制 HiveServer2 运行 MapReduce 作业的主要内容,如果未能解决你的问题,请参考以下文章

HiveServer2后台运行

Hiveserver2 未能在直线中打开新会话

hiveserver2 org.apache.thrift.transport.TTransportException 在不活动分钟后运行第二个查询时出错

连接hiveserver2-Hive用户配置

HiveServer2服务异常日志分析

扩展 Hue + HiveServer2 设置的可能方法