【问题标题】:Hadoop performanceHadoop 性能
【发布时间】:2012-02-21 20:41:23
【问题描述】:

我安装了 hadoop 1.0.0 并尝试了字数统计示例(单节点集群)。完成时间为 2m 48 秒。然后我尝试了标准的 linux 字数统计程序,它在同一组(180 kB 数据)上在 10 毫秒内运行。我做错了什么,还是 Hadoop 非常慢?

time hadoop jar /usr/share/hadoop/hadoop*examples*.jar wordcount someinput someoutput
12/01/29 23:04:41 INFO input.FileInputFormat: Total input paths to process : 30
12/01/29 23:04:41 INFO mapred.JobClient: Running job: job_201201292302_0001
12/01/29 23:04:42 INFO mapred.JobClient:  map 0% reduce 0%
12/01/29 23:05:05 INFO mapred.JobClient:  map 6% reduce 0%
12/01/29 23:05:15 INFO mapred.JobClient:  map 13% reduce 0%
12/01/29 23:05:25 INFO mapred.JobClient:  map 16% reduce 0%
12/01/29 23:05:27 INFO mapred.JobClient:  map 20% reduce 0%
12/01/29 23:05:28 INFO mapred.JobClient:  map 20% reduce 4%
12/01/29 23:05:34 INFO mapred.JobClient:  map 20% reduce 5%
12/01/29 23:05:35 INFO mapred.JobClient:  map 23% reduce 5%
12/01/29 23:05:36 INFO mapred.JobClient:  map 26% reduce 5%
12/01/29 23:05:41 INFO mapred.JobClient:  map 26% reduce 8%
12/01/29 23:05:44 INFO mapred.JobClient:  map 33% reduce 8%
12/01/29 23:05:53 INFO mapred.JobClient:  map 36% reduce 11%
12/01/29 23:05:54 INFO mapred.JobClient:  map 40% reduce 11%
12/01/29 23:05:56 INFO mapred.JobClient:  map 40% reduce 12%
12/01/29 23:06:01 INFO mapred.JobClient:  map 43% reduce 12%
12/01/29 23:06:02 INFO mapred.JobClient:  map 46% reduce 12%
12/01/29 23:06:06 INFO mapred.JobClient:  map 46% reduce 14%
12/01/29 23:06:09 INFO mapred.JobClient:  map 46% reduce 15%
12/01/29 23:06:11 INFO mapred.JobClient:  map 50% reduce 15%
12/01/29 23:06:12 INFO mapred.JobClient:  map 53% reduce 15%
12/01/29 23:06:20 INFO mapred.JobClient:  map 56% reduce 15%
12/01/29 23:06:21 INFO mapred.JobClient:  map 60% reduce 17%
12/01/29 23:06:28 INFO mapred.JobClient:  map 63% reduce 17%
12/01/29 23:06:29 INFO mapred.JobClient:  map 66% reduce 17%
12/01/29 23:06:30 INFO mapred.JobClient:  map 66% reduce 20%
12/01/29 23:06:36 INFO mapred.JobClient:  map 70% reduce 22%
12/01/29 23:06:37 INFO mapred.JobClient:  map 73% reduce 22%
12/01/29 23:06:45 INFO mapred.JobClient:  map 80% reduce 24%
12/01/29 23:06:51 INFO mapred.JobClient:  map 80% reduce 25%
12/01/29 23:06:54 INFO mapred.JobClient:  map 86% reduce 25%
12/01/29 23:06:55 INFO mapred.JobClient:  map 86% reduce 26%
12/01/29 23:07:02 INFO mapred.JobClient:  map 90% reduce 26%
12/01/29 23:07:03 INFO mapred.JobClient:  map 93% reduce 26%
12/01/29 23:07:07 INFO mapred.JobClient:  map 93% reduce 30%
12/01/29 23:07:09 INFO mapred.JobClient:  map 96% reduce 30%
12/01/29 23:07:10 INFO mapred.JobClient:  map 96% reduce 31%
12/01/29 23:07:12 INFO mapred.JobClient:  map 100% reduce 31%
12/01/29 23:07:22 INFO mapred.JobClient:  map 100% reduce 100%
12/01/29 23:07:28 INFO mapred.JobClient: Job complete: job_201201292302_0001
12/01/29 23:07:28 INFO mapred.JobClient: Counters: 29
12/01/29 23:07:28 INFO mapred.JobClient:   Job Counters 
12/01/29 23:07:28 INFO mapred.JobClient:     Launched reduce tasks=1
12/01/29 23:07:28 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=275346
12/01/29 23:07:28 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
12/01/29 23:07:28 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
12/01/29 23:07:28 INFO mapred.JobClient:     Launched map tasks=30
12/01/29 23:07:28 INFO mapred.JobClient:     Data-local map tasks=30
12/01/29 23:07:28 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=137186
12/01/29 23:07:28 INFO mapred.JobClient:   File Output Format Counters 
12/01/29 23:07:28 INFO mapred.JobClient:     Bytes Written=26287
12/01/29 23:07:28 INFO mapred.JobClient:   FileSystemCounters
12/01/29 23:07:28 INFO mapred.JobClient:     FILE_BYTES_READ=71510
12/01/29 23:07:28 INFO mapred.JobClient:     HDFS_BYTES_READ=89916
12/01/29 23:07:28 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=956282
12/01/29 23:07:28 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=26287
12/01/29 23:07:28 INFO mapred.JobClient:   File Input Format Counters 
12/01/29 23:07:28 INFO mapred.JobClient:     Bytes Read=85860
12/01/29 23:07:28 INFO mapred.JobClient:   Map-Reduce Framework
12/01/29 23:07:28 INFO mapred.JobClient:     Map output materialized bytes=71684
12/01/29 23:07:28 INFO mapred.JobClient:     Map input records=2574
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce shuffle bytes=71684
12/01/29 23:07:28 INFO mapred.JobClient:     Spilled Records=6696
12/01/29 23:07:28 INFO mapred.JobClient:     Map output bytes=118288
12/01/29 23:07:28 INFO mapred.JobClient:     CPU time spent (ms)=39330
12/01/29 23:07:28 INFO mapred.JobClient:     Total committed heap usage (bytes)=5029167104
12/01/29 23:07:28 INFO mapred.JobClient:     Combine input records=8233
12/01/29 23:07:28 INFO mapred.JobClient:     SPLIT_RAW_BYTES=4056
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce input records=3348
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce input groups=1265
12/01/29 23:07:28 INFO mapred.JobClient:     Combine output records=3348
12/01/29 23:07:28 INFO mapred.JobClient:     Physical memory (bytes) snapshot=4936278016
12/01/29 23:07:28 INFO mapred.JobClient:     Reduce output records=1265
12/01/29 23:07:28 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=26102546432
12/01/29 23:07:28 INFO mapred.JobClient:     Map output records=8233

real    2m48.886s
user    0m3.300s
sys 0m0.304s


time wc someinput/*
  178  1001  8674 someinput/capacity-scheduler.xml
  178  1001  8674 someinput/capacity-scheduler.xml.bak
    7     7   196 someinput/commons-logging.properties
    7     7   196 someinput/commons-logging.properties.bak
   24    35   535 someinput/configuration.xsl
   80   122  1968 someinput/core-site.xml
   80   122  1972 someinput/core-site.xml.bak
    1     0     1 someinput/dfs.exclude
    1     0     1 someinput/dfs.include
   12    36   327 someinput/fair-scheduler.xml
   45   192  2141 someinput/hadoop-env.sh
   45   192  2139 someinput/hadoop-env.sh.bak
   20   137   910 someinput/hadoop-metrics2.properties
   20   137   910 someinput/hadoop-metrics2.properties.bak
  118   582  4653 someinput/hadoop-policy.xml
  118   582  4653 someinput/hadoop-policy.xml.bak
  241   623  6616 someinput/hdfs-site.xml
  241   623  6630 someinput/hdfs-site.xml.bak
  171   417  6177 someinput/log4j.properties
  171   417  6177 someinput/log4j.properties.bak
    1     0     1 someinput/mapred.exclude
    1     0     1 someinput/mapred.include
   12    15   298 someinput/mapred-queue-acls.xml
   12    15   298 someinput/mapred-queue-acls.xml.bak
  338   897  9616 someinput/mapred-site.xml
  338   897  9630 someinput/mapred-site.xml.bak
    1     1    10 someinput/masters
    1     1    18 someinput/slaves
   57    89  1243 someinput/ssl-client.xml.example
   55    85  1195 someinput/ssl-server.xml.example
 2574  8233 85860 total

real    0m0.009s
user    0m0.004s
sys 0m0.000s

【问题讨论】:

标签: performance hadoop mapreduce


【解决方案1】:

即使 Hadoop 不适合这个小文件,我们仍然可以在一定程度上对其进行调整。文件大小为 180 kb。但是块的数量是 30。您必须减少 hdfs-site.xml 中的“dfs.block.size”。随着输入拆分更多,映射器的数量也更多,这在这种情况下是不必要的。 Hadoop 必须根据节点数量和输入数据进行调整。因此,您必须将“dfs.block.size”增加到 64MB,才能使用一个映射器执行此字数统计,这将显着提高性能。

【讨论】:

    【解决方案2】:

    嗯..这里有一个混乱,或者让我在这里制造一个混乱。

    假设您有一个问题可以在O(n) complexity 中解决,如果您应用 hadoop 会做什么让我们假设 K 台机器,那么它将复杂性降低 K 倍。因此,在您的情况下,任务应该执行得更快(hadoop 任务)。

    出了什么问题?????

    假设您有标准的 hadoop 安装和所有标准的 hadoop 配置,并且还假设您默认在本地模式下运行 hadoop。

    1) 您在单个节点上运行程序,因此不要期望运行时间少于标准程序。 (如果您使用多节点集群,情况会有所不同)

    现在问题来了,因为使用单机运行时间应该是一样的???

    答案是否定的,在 hadoop 中,数据首先由记录读取器读取,该记录读取器发出键值对,这些键值对传递给映射器,然后映射器处理并发出键值对(假设没有使用组合器),然后对数据进行排序和shuffle 然后它被传递到 reducer 阶段,然后写入 hdfs 完成。所以看到这里有更多的开销。由于这些原因,您会感觉到性能下降。

    你想看看 hadoop 能做什么。在 K 节点集群上运行相同的任务并获取 peta 字节的数据并运行单线程应用程序。我保证你会大吃一惊的。

    【讨论】:

      【解决方案3】:

      与您可以使用终端运行的本机应用程序相比,Hadoop 通常会产生开销。如果您将映射器的数量增加到 2 个,您肯定会获得更好的时间,您应该能够做到这一点。如果您的 wordcount 示例不支持设置映射器和缩减器,请尝试这个

      https://github.com/marek5050/Sparkie/tree/master/Java

      使用

      hadoop jar ./target/wordcount.jar -r 1 -m 4 <input> <output>
      

      Hadoop 的强大之处在于能够将工作分散到多个节点以处理 GB/TB 的数据,它通常不会比您的计算机在几分钟内能够完成的任何事情更有效率。

      【讨论】:

        【解决方案4】:

        正如 Dave 所说,Hadoop 针对处理大量数据进行了优化,而不是玩具示例 “唤醒大象”需要交税才能让事情顺利进行,当您在较小的场景中工作时不需要。 您可以查看"About the performance of Map Reduce Jobs" 了解正在发生的事情的一些详细信息

        【讨论】:

          【解决方案5】:

          除了其他答案之外,还有一个因素:
          您有 30 个文件要处理 - 所以有 30 个任务要执行。 1 个任务执行的 Hadoop MR 开销在 1 到 3 秒之间。如果您将数据合并到一个文件中 - 性能会大大提高,而您仍然会有作业启动开销。
          我认为本地原生程序总是会胜过 hadoop MR。 Hadoop 在构建时考虑了可扩展性和容错性 - 在许多情况下会影响性能。

          【讨论】:

            【解决方案6】:

            为了提高 Hadoop 性能:

            • 设置Mapper和Reducers的数量

              [通过查看程序的输出,我认为您已经使用了许多减速器和映射器。根据您的需要使用它。使用过多的 mapper 或 reducer 不会提高性能]

            • 使用更大的数据块。 (以 TB 为单位或至少以 GB 为单位)

              [在 Hadoop 中,有一些 块大小 64 mb。]

            • 将 Hadoop 设置到其他一些终端并尝试在多节点集群中运行。它将提高性能。

            Hadoop 是下一件大事。

            【讨论】:

              【解决方案7】:

              您的输入数据很小,因此您观察到 hadoop 需要很长时间。 hadoop 中的工作创建过程很繁重,因为它涉及很多事情。如果输入数据很大,那么您会看到 hadoop 比 wc 做得更好。

              【讨论】:

                【解决方案8】:

                这取决于很多因素,包括您的配置、您的机器、内存配置、JVM 设置等。您还需要减去 JVM 启动时间。

                它对我来说运行得更快。也就是说,在小型数据集上它当然会比专用 C 程序慢——考虑一下它在“幕后”所做的事情。

                对分布在数千个文件中的 TB 数据进行尝试,看看会发生什么。

                【讨论】:

                  猜你喜欢
                  • 2023-03-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-07-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-01-04
                  相关资源
                  最近更新 更多