到目前为止,我一直在使用Pig或Java for Map Reduce专门针对Hadoop集群运行作业。我最近尝试通过Hadoop流式传输使用Python Map Reduce,这也非常酷。所有这些对我来说都很有意义,但是当我想要使用一个实现时,我有点朦胧。另一个。 Java map reduce,我基本上只在我需要速度时使用,但是什么时候我会想要使用像Python流一样的东西,而不是只用PIG / Hive中更少,更容易理解的行写出相同的东西?简而言之,每个人的利弊是什么?
答案 0 :(得分:3)
我将分别与Java与Python相关,然后分别与MR与Hive / Pig相关 - 因为我将其视为两个不同的问题
Hadoop是围绕java构建的,它的许多功能都是通过Java API提供的,Hadoop主要可以使用java类进行扩展。
Hadoop有能力处理用其他语言创建的MR作业 - 它被称为流式处理。这个模型只允许我们定义mapper和reducer以及java中没有的一些限制。同时 - 输入/输出格式和其他插件必须写为java类
所以我将决策定义如下:
a)使用Java,除非你有严格的代码库,否则你需要在你的MR工作中重新开始。
b)当你需要创建一些简单的临时工作时,考虑使用python。
关于Pig / Hive - 它也是更高级别的以Java为中心的系统。 Hive可以在没有任何编程的情况下使用,但可以使用java进行扩展。猪从一开始就需要java。我认为这些系统在可以应用的情况下几乎总是优于MR作业。通常这些是处理类似SQL的情况。
流媒体与本机Java之间的性能考虑因素。
通过其输入流将流输入输入到映射器。这是进程间通信,在java的情况下,与记录阅读器和映射器之间的进程间数据传递相比,本质上效率较低。
我可以从上面得出以下结论:
a)如果进行了一些轻量级处理(比如查找子字符串,计算......),这种开销可能会很大,而java解决方案会更有效率。
b)在某些繁重处理的情况下,可以更有效地在某些非Java语言中实现 - 基于流的解决方案可以有一些优势。
Pig / Hive性能考虑因素。
Pig / Hive都实现了SQL处理的原语。换句话说 - 它们在RDBMS世界中实现执行计划的元素。这些实现很好并且调整得很好。在同一时间,Hive(我知道的更好)是解释器。它不执行代码生成 - 它在预构建的MR作业中集成执行计划。这意味着,如果你有复杂的条件,并且会专门为它们编写代码 - 那么它就有可能比Hive更好 - 代表编译器与interpeter的性能优势。
答案 1 :(得分:2)
关于Java与Pig - 我在大多数情况下使用pig(以及Java UDF)以获得灵活性,并让其他人(猪)找出将作业分成地图的最佳方法,并减少,合并器等。
当我绝对想要控制工作的每个方面时,我使用Java。
关于python(或其他langs)的使用,如果开发人员对这些其他语言更熟悉,我会使用它。请注意,您还可以mix pig and streaming
答案 2 :(得分:1)
有 Scala ,您可以在其中为作业编写更简单的代码。例如,请查看:https://github.com/NICTA/scoobi
对于内存或CPU密集程度较高的任务,您可能会有一些动力使用 C ++ 。您可以阅读Hypertable撰写的有关其C ++决策的内容:http://code.google.com/p/hypertable/wiki/WhyWeChoseCppOverJava
Java在序列化方面也存在问题,因为它为从输入流中读取的任何对象创建了一个Object。您需要注意不要使用Java Serialization,因为您有Java实现。