在Hadoop中流式传输或自定义Jar

时间:2011-07-29 12:29:35

标签: java python streaming hadoop mapreduce

我正在使用Python编写的mapper和reducer在Hadoop(亚马逊的EMR)上运行流媒体作业。我想知道如果我在Java中实现相同的mapper和reducer(或使用Pig),我将体验到的速度提升。

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

我的工作是从Google Books NGgram数据集中读取NGram计数并计算汇总度量。似乎计算节点上的CPU利用率接近100%。 (我想听听你对CPU绑定或IO绑定工作的差异的意见。)

谢谢!

AMAC

1 个答案:

答案 0 :(得分:4)

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

  • 能够使用更强大的自定义输入格式。对于流式作业,即使您使用可插入的输入/输出(如前所述here),您也只能使用映射器/缩减器的键和值作为文本/字符串。您需要花费一些CPU周期来转换为所需的类型。
  • 我也听说Hadoop可以很聪明地在多个作业中重复使用JVM,这在流式传输时是不可能的(无法确认)

何时使用猪?

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

何时不使用猪?

  • 即使猪很擅长弄清楚有多少地图/减少以及何时产生地图或减少以及无数这样的事情,如果你确定有多少地图/减少你需要而你有一些您需要在Map / reduce函数中进行非常具体的计算,并且您对性能非常具体,那么您应该考虑部署自己的jar。这个link表明猪的性能可能落后于原生的hadoop M / R.您还可以查看编写自己的Pig UDFs,它隔离了一些计算密集型函数(甚至可能使用JNI来调用UDF中的一些本机C / C ++代码)。

有关IO和CPU绑定作业的说明:

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