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

Rug*_*man 11 python java streaming hadoop mapreduce

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

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

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

谢谢!

AMAC

aru*_*esh 4

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

  • 能够使用更强大的自定义输入格式。对于流作业,即使您使用可插入输入/输出(如此处提到的那样)您的映射器/化简器的键和值也仅限于文本/字符串。您需要花费一些 CPU 周期来转换为您所需的类型。
  • 我还听说 Hadoop 可以很聪明地在多个作业之间重用 JVM,这在流式传输时是不可能的(无法证实这一点)

什么时候用猪?

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

什么时候不使用猪?

  • 尽管pig非常擅长自行计算出多少个map/reduce以及何时生成map或reduce以及无数这样的事情,但如果您非常确定需要多少个map/reduce并且您有一些非常具体的计算您需要在 Map/reduce 函数中执行操作,并且您对性能非常具体,那么您应该考虑部署自己的 jar。此链接显示 Pig 在性能上可能落后于本机 hadoop M/R。您还可以考虑编写自己的 Pig UDF,它隔离一些计算密集型函数(甚至可能使用 JNI 来调用 UDF 中的一些本机 C/C++ 代码)

关于 IO 和 CPU 密集型作业的注意事项:

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