【问题标题】:Not getting performance with MapReduce使用 MapReduce 无法获得性能
【发布时间】:2012-12-04 07:11:18
【问题描述】:

     我是 Map-reduce 的新手,我正在使用 Hadoop 管道。

    我有一个包含记录数的输入文件,每行一个。我编写了一个简单的程序来打印其中三个单词很常见的那些行。在 map 函数中,我将单词作为键并将记录作为值发出,并在 reduce 函数中比较了这些记录。

     然后我将 Hadoop 的性能与简单的 C++ 程序进行了比较,在该程序中,我从文件中读取记录并将其拆分成单词并将数据加载到地图中。 Map 包含作为键的单词和作为值的记录。加载所有数据后,我比较了这些数据。
     但我发现,与普通 C++ 程序相比,Hadoop Map-reduce 执行相同任务需要很长时间。当我在 hadoop 上运行我的程序时,大约需要 37 分钟,而简单的 C++ 程序只需要大约 5 分钟。

     请有人帮我弄清楚我是否在某个地方做错了?我们的应用需要性能。

【问题讨论】:

  • 我同意 Gruzman 的回答,但您也应该尝试在 map 函数中进行单词/记录比较。这可以最大限度地减少从 map 传输到 reduce 时的网络流量,这通常是瓶颈。我希望这可以缩短运行时间,提供更真实的比较(假设您没有将 reducer 也用作组合器)。

标签: hadoop


【解决方案1】:

这里有几点需要说明:
Hadoop 不是高性能的——它是可扩展的。本地程序在小数据集上做同样的事情总是会优于 hadoop。因此,只有当您想在机器上的集群上运行并享受 Hadoop 的并行处理时,它的使用才有意义。
Hadoop 流在性能方面也不是最好的,因为每行都有任务切换。在很多情况下,用 Java 编写的原生 hadoop 程序会有更好的性能

【讨论】:

  • 那么并行处理和使用机器集群有什么用呢?
  • 今天假设您的本地版本运行速度快了 6 倍。假设您使用了所有 CPU。因此,从 6 台机器的集群中,您将处于收支平衡。实际上,当您拥有大量数据并希望并行处理时,hadoop 是有意义的。
  • 感谢您的回复。我还需要知道 map 函数的输出存储在哪里?我们能知道那个输出的位置吗?
  • 存储在HDFS上,运行作业时设置
  • 其实我只需要知道map函数的输出和位置。它存储在 HDFS 上,但我可以知道位置并在作业完成后获取该数据吗?
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2011-11-29
相关资源
最近更新 更多