【问题标题】:How does Hive decide when to use map reduce and when not to?Hive 如何决定何时使用 map reduce 何时不使用?
【发布时间】:2011-11-19 22:55:23
【问题描述】:

举个简单的例子,

select * from tablename;

不启动 map reduce,而

select count(*) from tablename;

确实如此。决定何时使用 map reduce(通过 hive)的一般原则是什么?

【问题讨论】:

    标签: hadoop mapreduce hive


    【解决方案1】:

    一般来说,任何类型的聚合,例如 min/max/count 都需要 MapReduce 作业。这可能无法为您解释一切。

    Hive 具有许多 RDBMS 的风格,有一个 EXPLAIN 关键字,它将概述如何将 Hive 查询转换为 MapReduce 作业。尝试对您的两个示例查询运行解释,看看它在幕后试图做什么。

    【讨论】:

      【解决方案2】:

      从表名中选择 *;

      只是从 HDFS 中的文件中读取原始数据,因此在没有 MapReduce 的情况下要快得多。

      【讨论】:

      • 但是对于一个大文件,它必须从所有节点并行读取。 Hive 在没有 MR 的情况下能做到吗?
      【解决方案3】:

      这是一种优化技术,hive.fetch.task.conversion 属性可以 (FETCH) 任务最小化 mapreduce 开销的延迟。

      在执行 SELECT、LIMIT、FETCH 查询时,此属性会跳过 mapreduce 并使用 FETCH 任务。

      此属性可以有 3 个值 - noneminimal(默认值)和 more

      【讨论】:

        【解决方案4】:

        每当我们触发像 select * from tablename 这样的查询时,Hive 都会读取数据文件并获取整个数据而不进行任何聚合(最小/最大/计数等)。 )。它会调用 FetchTask 而不是 ma​​preduce 任务。

        这也是 Hive 中的一种优化技术。 hive.fetch.task.conversion 属性可以(即 FETCH 任务)最小化 map-reduce 开销的延迟。

        这就像我们正在读取一个 hadoop 文件:hadoop fs -cat 文件名

        但如果我们使用 select colNames from tablename,它需要一个 map-reduce 作业,因为它需要通过从加载的文件中解析每行的“列”来提取它。

        【讨论】:

        • 对于较新版本的 hive,第二部分不再适用..select column from tablename 不会在 minimalmore 设置为 hive.fetch.task.conversion 时运行 MR
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-04
        • 2011-07-01
        相关资源
        最近更新 更多