强制 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
配置参数控制。
可能的值为:none
、minimal
和 more
。
如果你想禁用抓取任务转换,设置为无:
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 org.apache.thrift.transport.TTransportException 在不活动分钟后运行第二个查询时出错