运行 简单的 Hive 查询时如何强制执行 MR?

How to force MR execution when running simple Hive query?

MR 上有 Hive 2.1.1,table test_table 存储为序列文件和以下临时查询:

select t.*
  from test_table t
 where t.test_column = 100

尽管可以在不启动 MR(获取任务)的情况下执行此查询,但有时扫描 HDFS 文件需要更长的时间,而不是触发单个映射作业。

当我想强制执行 MR 时,我使查询更复杂:例如,使用 distinct。这种方法的显着缺点是:

  1. 查询结果可能与原始查询的结果不同
  2. 给集群带来无意义的计算负载

在使用 Hive-on-MR 时是否有推荐的强制执行 MR 的方法?

Hive 执行器根据以下设置(使用默认值)决定执行 map 任务还是 fetch 任务:

  • hive.fetch.task.conversion("more") — MR任务转换为fetch任务的策略
  • hive.fetch.task.conversion.threshold (1 GB) — 可以提供给获取任务的输入数据的最大大小
  • hive.fetch.task.aggr (false) — 当设置为 true 时,像 select count(*) from src 这样的查询也可以在 fetch 任务中执行

它提示我以下两个选项:

  1. hive.fetch.task.conversion.threshold设置为较低的值,例如512 MB
  2. hive.fetch.task.conversion设置为“none”

出于某种原因,降低阈值并没有改变我的情况,所以我支持第二个选项:对于临时查询来说似乎没问题。

有关这些设置的更多详细信息,请参阅 Cloudera forum and Hive wiki

只需在查询前添加 set hive.execution.engine=mr;,它将强制 Hive 使用 MR。