Hadoop中的流式或自定义Jar
我在Hadoop上(使用亚马逊的EMR)运行一个流处理任务,任务中的映射器和归约器是用Python写的。我想知道如果我把同样的映射器和归约器用Java实现(或者用Pig),速度会有多大的提升。
特别是,我想听听大家从流处理迁移到自定义jar部署和/或Pig的经验,还有一些关于这些选项的基准比较文档。我找到这个问题,但里面的回答对我来说不够具体。我并不是想比较Java和Python,而是想比较在Hadoop中使用自定义jar部署和基于Python的流处理之间的差别。
我的任务是从Google Books NGram数据集中读取NGram计数,并计算汇总指标。看起来计算节点的CPU利用率接近100%。我也想听听你们对CPU密集型和IO密集型任务之间差异的看法。
谢谢!
Amaç
1 个回答
4
为什么要考虑使用自定义的jar包?
- 可以使用更强大的自定义输入格式。对于流式作业,即使你使用了可插拔的输入/输出(就像这里提到的那样),你仍然只能把键和值当作文本/字符串传给你的映射器或归约器。这意味着你需要花费一些计算资源来转换成你需要的类型。
- 我听说Hadoop在多个作业之间可以智能地重用JVM,但在流式作业中这可能就做不到了(我不能确认这一点)。
什么时候使用Pig?
- Pig Latin非常不错,它是一种比Java、Python或Perl更高级的数据流语言。你的Pig脚本通常会比用其他语言写的同样任务要小得多。
什么时候不使用Pig?
- 虽然Pig在自动判断需要多少个映射和归约、何时启动这些任务等方面做得很好,但如果你非常确定需要多少个映射和归约,并且在映射/归约函数中有一些非常具体的计算需求,同时对性能要求也很高,那么你应该考虑使用自己的jar包。这个链接显示,Pig在性能上可能会落后于原生的Hadoop M/R。你也可以考虑编写自己的PigUDFs,将一些计算密集的功能隔离出来(甚至可以使用JNI在UDF中调用一些本地的C/C++代码)。
关于IO和CPU密集型作业的说明:
- 从技术上讲,Hadoop和MapReduce的主要目的是并行处理计算密集型的功能,所以我假设你的映射和归约作业是计算密集型的。Hadoop系统在映射和归约阶段之间忙于IO操作,主要是在数据通过网络传输的时候。如果你有大量数据,但手动配置的映射和归约数量太少,导致数据溢出到磁盘(虽然配置太多任务会导致启动/停止JVM花费太多时间,以及产生太多小文件)。流式作业还会有额外的开销,因为需要启动一个Python/Perl虚拟机,并且数据在JVM和脚本虚拟机之间来回复制。