【问题标题】:Force HiveServer2 to run MapReduce job强制 HiveServer2 运行 MapReduce 作业
【发布时间】: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 读取,从而导致问题。

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

【问题讨论】:

    标签: hadoop hive mapreduce hiveql beeline


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多