【问题标题】:How to reduce number of mappers, when I am running hive query?当我运行 hive 查询时,如何减少映射器的数量?
【发布时间】:2016-07-19 12:53:32
【问题描述】:

我正在使用蜂巢,

我有 24 个 json 文件,总大小为 300MB(在一个文件夹中),所以我创建了一个外部表(即 table1)并将数据(即 24 个文件)加载到外部表中。

当我在该外部表(即 table1)上运行选择查询时,我观察到 3 个映射器和 1 个减速器正在运行。

之后我又创建了一个外部表(即 table2)。

我已经压缩了我的输入文件(包含 24 个文件的文件夹)。

示例:BZIP2

因此它压缩了数据,但创建了 24 个扩展名为“.BZiP2”的文件 (即..file1.bzp2,.....file24.bzp2)。

之后,我将压缩文件加载到我的外部表中。

现在,当我运行 select query 时,它需要 24 个映射器和 1 个减速器。与未压缩的数据(即文件)相比,观察到的 CPU 时间需要更多时间。

如果数据是压缩格式(即 table2 select query ),我如何减少映射器的数量?

如果数据是压缩格式(即 table2 选择查询),我如何减少 CPU 时间? CPU时间将如何影响性能?

【问题讨论】:

    标签: hadoop mapreduce hive cloudera hadoop-partitioning


    【解决方案1】:

    只有文件在同一个数据节点上时,映射器的数量才能少于文件的数量。如果文件位于不同的数据节点上,则映射器的数量永远不会少于文件的数量。连接所有 /some 文件并将它们放入您的表位置。使用 cat 命令连接非压缩文件。你有 24 个映射器,因为你有 24 个文件。参数 mapreduce.input.fileinputformat.split.minsize / maxsize 用于分割更大的文件。

    【讨论】:

    • 更多并行映射器 - 更高性能。但是如果映射器太多,比如数千个或更多——其中一些将不会执行(待定),它们将在队列中等待空闲槽。这就是性能可能会下降的原因
    • 24 个映射器对于大数据来说并不算多。这取决于您的集群/数据库大小,对于某些集群,24K 或更多映射器是可以的
    • 您好感谢您的回复,我已经创建了分区表年月日。实际上,我每小时获取数据,所以 24 小时,24 个文件(总大小为 1GB),然后我正在压缩并加载到 hive 外部表中。根据您上面的观点,现在我在昨天运行,所以我们有 24 个(压缩文件),所以当我们运行 24 个映射器时正在执行。假设将来如果我运行选择查询 1 个月,那么我的总输入文件将是 24*30=720 ,因此将执行 720 个映射器。
    • 所以我怀疑它将来可能会产生性能问题。我这里还有一个疑问是没有压缩的相同数据,如果我执行它只需要 6 个映射器,我不确定它是如何发生的?请让我知道如何处理这种情况,即我想在压缩数据的同时减少映射器的数量?
    • 可能您的一些未压缩文件位于同一节点上,并且映射器被重新用于读取少数文件。压缩文本文件需要单独的映射器,并且它们不可拆分。
    【解决方案2】:

    如果文件大小为200000字节,设置值为

    set mapreduce.input.fileinputformat.split.maxsize=100000;
    set mapreduce.input.fileinputformat.split.minsize=100000;
    

    将触发 200000/100000 = 2 映射器用于 map reduce 作业

    设置值

    set mapreduce.input.fileinputformat.split.maxsize=50000;
    set mapreduce.input.fileinputformat.split.minsize=50000;
    

    将为同一作业触发 200000/50000 = 4 映射器。

    阅读:

    splittable-gzip

    set-mappers-in-pig-hive-and-mapreduce

    how-to-control-the-number-of-mappers-required-for-a-hive-query

    【讨论】:

    • 您好,感谢您的回复,根据您的建议,我已设置“set mapreduce.input.fileinputformat.split.minsize=200000000; set mapreduce.input.fileinputformat.split.maxsize=500000000; "并且我执行选择查询仍然占用 24 个映射器。我有 24 个大小为 1GB 的小输入文件。
    • 是的,根据 leftjoin 的响应,它将为每个输入文件运行 1 个映射器。我误解了你的问题。
    • 看来你的答案对 MR 来说更正确。 TEZ 的工作方式不同:cwiki.apache.org/confluence/display/TEZ/…
    【解决方案3】:

    当 TEZ 是执行引擎时,为了在 Hive 查询中手动设置映射器的数量,配置 tez.grouping.split-count 可以由以下任一者使用:

    登录到 HIVE CLI 时设置它:set tez.grouping.split-count=4 将创建 4 个映射器 可以通过 Ambari 添加hive-site.xml 中的条目。如果通过 hive-site.xml 设置,则需要重新启动 HIVE。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      相关资源
      最近更新 更多