命令行工具可以比Hadoop集群快235倍 - Adam Drake


当我在浏览网页和赶上一些我定期访问的网站时,我发现了一篇来自Tom Hayden的很酷的文章,关于使用亚马逊弹性Map Reduce(EMR)和mrjob来计算他从millionbase档案馆下载的国际象棋游戏的一些输赢比率的统计数据,并且总体上对EMR感到有趣。由于数据量只有大约1.75GB,包含大约200万个棋谱,我对使用Hadoop来完成这个任务持怀疑态度,但我可以理解他使用mrjob和EMR来学习和娱乐的目的。因为这个问题基本上只是看每个文件的结果行,并汇总不同的结果,所以似乎非常适合用shell命令进行流处理。我试了一下,对于同样的数据量,我能够用我的笔记本电脑在大约12秒内得到结果(处理速度大约为270MB/秒),而Hadoop的处理则需要大约26分钟(处理速度大约为1.14MB/秒)。

在报告了用集群中的7台c1.medium机器处理数据所需的时间为26分钟后,汤姆说:
这可能比在我的机器上串行运行要好,但可能还不如我在本地做一些巧妙的多线程应用好。

这绝对是正确的,尽管即使是串行处理也可能胜过26分钟。虽然汤姆做这个项目是为了好玩,但人们经常使用Hadoop和其他所谓的大数据(tm)工具来进行现实世界的处理和分析工作,而这些工作可以用更简单的工具和不同的技术来更快地完成。

一种特别未被使用的数据处理方法是使用标准的外壳工具和命令。这种方法的好处是巨大的,因为用shell命令创建一个数据管道意味着所有的处理步骤都可以并行完成。这基本上就像在你的本地机器上拥有你自己的风暴集群。甚至连Spouts、Bolts和Sinks的概念也转移到shell管道和它们之间的命令。你可以很容易地用基本命令构建一个流处理管道,与许多现代大数据(TM)工具相比,它将具有非常好的性能。

另外一点是批处理与流分析方法。汤姆在文章的开头提到,在加载10000个游戏并在本地进行分析后,他的内存有点不足了。这是因为所有的游戏数据都被加载到RAM中进行分析。然而,考虑一下这个问题,可以用流式分析轻松解决,基本上不需要任何内存。我们将创建的流处理管道将比Hadoop的实现快235倍以上,并且几乎不使用任何内存。
....

 
这条命令语句是:

find . -type f -name '*.pgn' -print0 | xargs -0 -n4 -P4 mawk '/Result/ { split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++ } END { print white+black+draw, white, black, draw }' | mawk '{games += $1; white += $2; black += $3; draw += $4; } END { print games, white, black, draw }'

这条find | xargs mawk | mawk管道让我们的运行时间缩短到大约 12 秒,或大约 270MB/秒,这比 Hadoop 实现快了大约 235 倍。
 
结论
希望这说明了一些关于使用和滥用 Hadoop 等工具进行数据处理任务的要点,这些任务可以通过简单的 shell 命令和工具在单台机器上更好地完成。如果您有大量数据或确实需要分布式处理,那么可能需要像 Hadoop 这样的工具,但这些天我经常看到使用 Hadoop 的地方传统的关系数据库或其他解决方案在性能方面要好得多,实施成本和持续维护。

点击标头见原文