运行 简单的 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
。这种方法的显着缺点是:
- 查询结果可能与原始查询的结果不同
- 给集群带来无意义的计算负载
在使用 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 任务中执行
它提示我以下两个选项:
- 将hive.fetch.task.conversion.threshold设置为较低的值,例如512 MB
- 将hive.fetch.task.conversion设置为“none”
出于某种原因,降低阈值并没有改变我的情况,所以我支持第二个选项:对于临时查询来说似乎没问题。
有关这些设置的更多详细信息,请参阅 Cloudera forum and Hive wiki。
只需在查询前添加 set hive.execution.engine=mr;
,它将强制 Hive 使用 MR。
MR 上有 Hive 2.1.1,table test_table
存储为序列文件和以下临时查询:
select t.*
from test_table t
where t.test_column = 100
尽管可以在不启动 MR(获取任务)的情况下执行此查询,但有时扫描 HDFS 文件需要更长的时间,而不是触发单个映射作业。
当我想强制执行 MR 时,我使查询更复杂:例如,使用 distinct
。这种方法的显着缺点是:
- 查询结果可能与原始查询的结果不同
- 给集群带来无意义的计算负载
在使用 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 任务中执行
它提示我以下两个选项:
- 将hive.fetch.task.conversion.threshold设置为较低的值,例如512 MB
- 将hive.fetch.task.conversion设置为“none”
出于某种原因,降低阈值并没有改变我的情况,所以我支持第二个选项:对于临时查询来说似乎没问题。
有关这些设置的更多详细信息,请参阅 Cloudera forum and Hive wiki。
只需在查询前添加 set hive.execution.engine=mr;
,它将强制 Hive 使用 MR。