我在 Hadoop(在 Amazon 的 EMR 上)中运行一个流式处理作业,其中的映射器和缩减器是用 Python 编写的。我想知道如果我在 Java(或使用 Pig)中实现相同的映射器和缩减器,我会体验到速度提升。

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

我的工作是从 Google Books NGgram 数据集中读取 NGram 计数并计算聚合度量。计算节点上的 CPU 利用率似乎接近 100%。 (我也想听听您对 CPU 绑定(bind)作业和 IO 绑定(bind)作业的区别的看法)。

谢谢!

阿玛克

请您参考如下方法:

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

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

什么时候用 pig ?

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

什么时候不使用 pig ?

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

关于 IO 和 CPU 绑定(bind)作业的注释:

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


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!