使用各种语言在Hadoop中运行作业的优缺点是什么?

使用各种语言在Hadoop中运行作业的优缺点是什么?,hadoop,mapreduce,apache-pig,Hadoop,Mapreduce,Apache Pig,到目前为止,我一直在使用Pig或Java for Map Reduce专门针对Hadoop集群运行作业。我最近尝试通过Hadoop流使用Python Map Reduce,这也很酷。所有这些对我来说都是有意义的,但我不太清楚什么时候我会想用一个实现来代替另一个实现。Java map reduce,我基本上只在需要速度的时候使用它,但是什么时候我会想使用Python流媒体之类的东西,而不是在PIG/Hive中用更少、更容易理解的行写出同样的东西呢?简而言之,每种方法的优缺点是什么?我将分别介绍Ja

到目前为止,我一直在使用Pig或Java for Map Reduce专门针对Hadoop集群运行作业。我最近尝试通过Hadoop流使用Python Map Reduce,这也很酷。所有这些对我来说都是有意义的,但我不太清楚什么时候我会想用一个实现来代替另一个实现。Java map reduce,我基本上只在需要速度的时候使用它,但是什么时候我会想使用Python流媒体之类的东西,而不是在PIG/Hive中用更少、更容易理解的行写出同样的东西呢?简而言之,每种方法的优缺点是什么?

我将分别介绍Java和Python,然后分别介绍MR和Hive/Pig,因为我认为这是两个不同的问题
Hadoop是围绕java构建的,它的许多功能都可以通过JavaAPI获得,Hadoop大部分可以使用java类进行扩展

Hadoop确实能够与用其他语言创建的MR jobs协同工作,这称为流媒体。这个模型只允许我们定义mapper和reducer,而java中没有一些限制。同时,输入/输出格式和其他插件必须作为java类编写
因此,我将决策定义如下: a) 使用Java,除非您有严重的代码库,否则您需要继续您的MR工作。 b)当需要创建一些简单的临时作业时,考虑使用Python。

关于Pig/Hive,它也是更高级别的以java为中心的系统。Hive完全不需要任何编程就可以使用,但它可以使用java进行扩展。Pig从一开始就需要java。我认为,在可以应用的情况下,这种系统几乎总是比乔布斯先生更可取。通常情况下,处理类似于SQL

流媒体与本机Java之间的性能考虑
流式处理通过映射器的输入流将输入馈送到映射器。在java中,进程间通信的效率比在记录读取器和映射器之间传递进程内数据的效率低
从上面我可以得出以下结论: a) 在一些简单处理的情况下(比如寻找子字符串、计数……),这种开销可能非常大,java解决方案将更加高效
b) 对于一些繁重的处理,这可能会在一些非java语言中更有效地实现——基于流的解决方案可能有一些优势


猪/蜂箱性能注意事项
Pig/Hive都实现了SQL处理的原语。换句话说,它们在RDBMS世界中实现执行计划的元素。这些实现都很好,并且经过了很好的调整。同时,Hive(我更了解)是一个解释器。它不生成代码-它在预构建的MR作业中集成执行计划。这意味着,如果您有一些复杂的条件,并且将专门为它们编写代码,那么它就有可能比Hive做得更好,这代表了编译器和interpeter的性能优势。

关于Java和Pig,我会在大多数情况下使用Pig(以及Java UDF),以获得灵活性并让其他人(Pig)使用为了找出将作业拆分为映射和减少、合并器等的最佳方法

当我绝对想要控制工作的每一个方面时,我使用Java


关于python(或其他语言)的使用,如果开发人员对这些其他语言更熟悉,我会使用它。请注意,您还可以有Scala,您可以在这里为您的工作编写更简单的代码。例如,请查看:

您可能会有一些动机使用C++执行内存或CPU密集型任务。你可以阅读Hypertable写的关于C++的决定:


Java在序列化方面也有问题,因为它为从输入流读取的任何对象创建对象。您需要小心不要仅仅因为有Java实现就使用Java序列化。

谢谢!这太棒了!你有没有可能再写一些关于速度比较的文章?我找不到太多用于流媒体的东西。我认为更多关于这方面的信息将使这成为一个完美的答案!你是说流媒体和普通java MR jobs之间的速度比较,还是java与Hive/Pig之间的速度比较?java MR v.s.脚本语言MR over streaming v.s.Pig引入的开销将非常有趣。如果你否决并投票关闭,为什么不添加评论并说明原因,这样我就不会做任何你认为我将来做错的事了?是与本次讨论相关的主题。