2011-07-29 23 views
10

我正在使用Python编写的映射器和简化器在Hadoop(在Amazon的EMR上)中运行流式作业。如果我在Java中实现相同的映射器和简化器(或使用Pig),我想知道速度增益。Hadoop中的流式传输或自定义Jar

特别是,我正在寻找人们从流式传输到定制jar部署和/或Pig以及包含这些选项基准比较的文档的体验。我发现这个question,但答案不够具体。我不想在Java和Python之间进行比较,而是在Hadoop中的自定义jar部署和基于Python的流之间进行比较。

我的工作是阅读NGram从Google图书NGgram数据集计算和计算聚合度量。看起来计算节点上的CPU利用率接近100%。 (我希望听到您对CPU限制或IO限制作业的差异的意见)。

谢谢!

Amaç

回答

4

为什么要考虑部署自定义罐子?

  • 能够使用更强大的自定义输入格式。对于流式作业,即使您使用可插拔输入/输出(如here),您仅限于作为文本/字符串的映射器/缩放器的键和值。您需要花费一些CPU周期来转换为您所需的类型。
  • 香港专业教育学院还听说的Hadoop能够智能地重复使用跨多个职位的JVM流时不会成为可能(不能确认这一点)

当使用猪?

  • Pig Latin非常酷,是比java/python或perl更高级的数据流语言。你的猪脚本往往比编写任何其他语言的同等任务要小得多

什么时候不使用猪?

  • 尽管猪是相当不错的,在自身找出多少地图/减少以及何时产生一个地图或减少与这样的事情万千,如果你死了知道有多少地图/减少需要和你需要在你的Map/reduce函数中做一些非常具体的计算,并且你对性能非常具体,那么你应该考虑部署你自己的jar。这link表明,猪可以滞后本机hadoop M/R的表现。你也可以看看编写自己的猪UDFs其隔离一些计算密集型功能(甚至可能使用JNI调用一些本地C/C++的UDF中的代码)的IO和CPU绑定作业

的注:

  • 从技术上讲,hadoop和map reduce的全部重点是并行化计算密集型功能,所以我认为你的map和reduce jobs是计算密集型的。当数据通过网络发送时,Hadoop子系统忙于做IO的唯一时间是在映射和缩减阶段之间。另外,如果您有大量数据,并且手动配置了太少的映射并减少了导致磁盘溢出的问题(尽管太多任务会导致启动/停止JVM和太多小文件花费太多时间)。流式作业还会产生额外的开销,即启动Python/Perl VM并在JVM和脚本VM之间来回复制数据。
+0

谢谢!由于我已经有纯文本输入/输出要求,所以自定义输入格式与我的情况无关。 猪的评价告诉我,我宁愿远离它。我已经有了Python实现。 我的脚本是CPU密集型的。他们只是从标准输入中读取数据,进行一些数字运算,然后输出结果。但我不确定这是否意味着我的Hadoop作业整体可以被视为CPU限制。无论如何,我真正想问的是作业是CPU限制还是IO限制,以及它是作为自定义jar还是流式作业实现的。 –

+0

考虑到您的Maps和Reduce任务将在其自己的JVM上运行,以及通常map和reduce函数受CPU限制的事实,这些单独的Hadoop任务将受CPU限制。 Hadoop作业的协调JVM很可能是IO密集型的,因为它忙于等待来自将任务发送到map和reduce层的单个任务的响应。 –

+0

实际上,我刚刚意识到,map和reduce任务运行的JVM也处理一些IO(从HDFS输入流并将输出写入HDFS)。由于hadoop确保map函数接近数据的位置,所以通常非常快(对于reduce函数,这是不正确的)。 –