【问题标题】:how to increase the number of map tasks in hadoop and how to get total time taken by hadoop mapreduce job如何增加hadoop中map任务的数量以及如何获取hadoop mapreduce作业所花费的总时间
【发布时间】:2014-10-27 06:04:39
【问题描述】:

我有一个数据集,我试图在 hadoop 中进行分析。 据我所知,它在少量数据中运行平稳。

第一次查询:
我想在大数据上对此进行测试,并找出当文件大小增加时完成任务需要多长时间。 如何获得完成任务需要多少秒? 有没有命令行语法之类的?

第二次查询:
dfs.replication 设置为 1 个in hdfs-core.xml 文件。 它只是复制输入数据,还是对 map reduce 工作有一些影响?

第三个查询:
现在,我有一个单节点 hadoop 集群。如何知道它为给定的输入文件生成的映射器的确切数量以及如何更改编号。映射器? 实际上,我想获得完成不同编号下的任务所需的时间。映射器。

例如:我想先用10个mapper测试数据,然后用20个,以此类推,这样就可以得到不同编号下完成任务需要多少时间。映射器。

【问题讨论】:

    标签: java hadoop mapreduce hdfs hadoop2


    【解决方案1】:

    第三次查询:

    您可以随意调整块大小。

    如果你没有在 hadoop 1.x 中配置块大小,默认为 64 MB

    Hadoop 2.x 128 MB

    假设如果块大小为 64 MB,则您有 1 GB 的文件,因此默认情况下,如果您为输入拆分大小配置了任何内容,那么您的输入拆分大小将等同于块大小,因此每个 64 MB 的 16 个拆分将是那里有 1 GB,每个拆分对应的 1 个映射器意味着 16 个映射器将被调用 1 Gb 数据

    如果您将块大小更改为 128 mb,那么 8 映射器将类似地用于 256mb 块大小 4 和 512 mb 块大小 2 映射器将被使用。

    第二个查询: 复制因子可以提高你的 map -reduce 任务性能,因为如果数据被正确复制,那么任务跟踪器可以直接在块上运行,否则它将不得不从其他节点复制该块,这可能会占用网络带宽,从而降低性能。

    第一次查询:

    一旦任何作业在该作业结束时完成,它就会包含所有统计信息,例如使用了多少个映射器和多少个化简器、写入了多少字节以及执行了多长时间,并且它包含所有详细信息。

    【讨论】:

    • 如何配置输入分割大小?我的意思是如何增加块大小?
    • 你不需要为分割大小配置任何东西,它会根据块大小由fileinputformat自动计算,如果你想保持分割大小与块大小不同,那么你需要做一些配置,但不建议这样做会降低您的性能
    • 对于 hadoop 2.x,它是 128MB,然后我想如果我将它减少到 64 MB,那么将有 16 个拆分,因此 16 个映射器然后它将提高性能,因为 16 个映射器将并行工作而不是 8 个映射器。我对吗?还是我的概念错了?
    • 在小型集群(6-7 个节点)中,创建地图任务的开销相当大。所以 dfs.block.size 在这种情况下应该很大,但要小到可以利用所有集群资源。块大小应根据集群大小、映射任务复杂度、集群映射任务容量和输入文件的平均大小来设置。如果映射包含计算使得一个数据块比另一个块花费更多的时间,那么 dfs 块大小应该更小。
    【解决方案2】:

    第一次查询
    我不确定 cmd 语法,但您可以在作业完成后使用 java api 本身。例如:

    job.waitForCompletion(false);
    if(job.isSuccessful()){
       System.out.println("completionTime :" 
        + (job.getFinishTime() - job.getStartTime())/1000 + "s");
    }
    

    第二次查询
    会影响工作绩效。因为现在这项工作将无法利用本地化 复制因子为 3 时的数据量。必须将数据传输到可用插槽的 taskTracker,从而导致更多的网络 IO 和性能下降。

    第三次查询
    映射器的数量始终等于输入吐出的数量。正统的方法是编写一个自定义的InputFormat,它根据指定的标准拆分数据文件。假设你有一个 1GB 的文件并且你想要 5 个映射器,只需让 InputFormat 在 200MB 上进行拆分(这将消耗更多 在默认的 64 MB 块大小上超过 3 个块)。

    另一方面,使用默认 InputFormat 并在提交作业之前将文件手动拆分为所需的映射器数量。为此,约束是每个子文件的大小应小于或等于块大小。因此,对于 5 个映射器,您最多可以使用 5*64=320MB 文件大小。

    第三种更改块大小的方法可以解决问题而没有这些麻烦,但根本不推荐。因为它每次都需要重新启动集群。

    更新
    第三次查询最简单,也最可能是最好的解决方案是在每个作业基础上使用mapred.max.split.size 配置。要为 1GB 文件运行 5 个地图,在提交作业之前执行以下操作:

    conf.set("mapred.max.split.size", "209715200"); // 200*1024^2 bytes        
    

    很简单,哈。还有另一个属性mapred.min.split.size,我仍然对它的使用感到困惑。 This SE post 可以在这方面为您提供帮助。

    相反,您也可以在运行作业时利用-D 选项。例如:

    hadoop jar job.jar com.test.Main -Dmapred.map.max.split.size=209715200
    

    注意:这些属性在 Hadoop 2.5.0 中被弃用。 Have a look if are using it

    【讨论】:

    • 如何定义我自己的自定义 InputFormat ,它有一个 InputSplit 方法但是如何使用呢?
    • 其实在搜索InputSplit时我得到了最好的解决方案。无需费心去扩展InputFormat & blah blah。也解开了我的一些误解。更新了答案,看看吧。
    【解决方案3】:

    @namanamu,
    查询 1
    如果您使用单独的驱动程序类,那么您可以使用 Java 计时器通过添加您的主代码来了解它所花费的时间在long start = System.currentTimeMillis();long stop = System.currentTimeMillis(); 之间,所用时间为(stop-start)/1000 秒。

    查询 3:当你通过命令行使用 hadoop jar myfile.jar 执行作业时,最后你会发现所有属性都像 no。映射器、归约器、输入组、归约组和所有其他信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多