Hadoop上的Java与Python对比

51 投票
3 回答
40951 浏览
提问于 2025-04-15 14:37

我正在做一个使用Hadoop的项目,发现它主要是用Java写的,同时也支持Python的流式处理。请问选择Java还是Python会对性能有很大影响吗?我现在还处于项目初期,如果有明显的性能差异,我可以根据情况选择其中一种语言。

3 个回答

14

你可以用两种方式来写Hadoop的mapreduce转换,一种是“流式处理”,另一种是“自定义jar”。如果你选择流式处理,你可以用任何你喜欢的编程语言来写代码,比如Python或C++。你的代码会从标准输入(STDIN)读取数据,然后输出到标准输出(STDOUT)。不过,在0.21版本之前的Hadoop中,流式处理只能处理文本数据,而不能处理二进制数据。因此,你的文件必须是文本文件,除非你自己做一些复杂的编码转换。但现在似乎有一个补丁已经添加进来,允许在流式处理中使用二进制格式。

如果你使用“自定义jar”(也就是说,你用Java或Scala编写了mapreduce代码,并使用了Hadoop的库),那么你就可以使用一些功能,允许你从流式处理的过程中输入和输出二进制数据(以二进制格式序列化),并将结果保存到磁盘上。因此,未来的运行会更快(这取决于你的二进制格式比文本格式小多少)。

所以,如果你的Hadoop任务主要是输入输出(I/O)密集型的,那么“自定义jar”的方法会更快(因为Java的速度更快,正如之前的帖子所示,读取磁盘的速度也会更快)。

但你得问问自己,时间对你来说有多重要。我发现用Python编程时,我的工作效率更高,写一个从STDIN读取并输出到STDOUT的map-reduce代码非常简单。因此,我个人会推荐使用Python的方式——即使你需要自己搞定二进制编码的事情。因为Hadoop 0.21可以处理非UTF-8的字节数组,并且Python有一个二进制(字节数组)替代方案可以使用(http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/),这个方案显示Python代码的速度只比“自定义jar”的Java代码慢大约25%,所以我绝对会选择Python的方式。

24

用Python编程,你可能会开发得更快;而用Java的话,程序运行得肯定会更快。

如果你想看看各种流行编程语言之间的速度比较,可以在网上搜索“benchmarksgame”。我记得大概Java比Python快3到5倍。

不过现在很多事情都不太依赖处理器,所以如果你觉得用Python开发更顺手,那就尽管用吧!


针对评论(怎么Java会比Python快)的回复:

每种语言的处理方式都不一样。Java的速度在所有语言中仅次于C和C++(C和C++可能和Java一样快,或者快5倍,但平均大概快2倍)。其他语言的速度通常慢2到5倍以上。Python在Java之后也是比较快的。我猜C#的速度和Java差不多,甚至可能更快,但benchmarksgame只测试了Mono(稍微慢一点),因为他们不在Windows上运行。

大多数这些说法都是基于计算机语言基准测试游戏,这个测试相对公平,因为每种语言的支持者和专家会调整测试代码,以确保代码能够充分发挥语言的优势。

比如说,这个链接展示了Java和C++的所有测试,你可以看到速度从差不多到Java慢3倍(第一列的值在1到3之间),而且Java使用的内存更多!

现在这个页面展示了Java和Python的比较(从Python的角度)。所以速度的差距在Python比Java慢2倍到慢174倍之间,不过在代码大小和内存使用上,Python通常比Java表现得更好。

还有一个有趣的点是——在需要分配大量内存的测试中,Java在内存使用上实际上比Python表现得更好。我很确定Java通常因为虚拟机的开销而在内存使用上处于劣势,但一旦这个因素排除,Java可能比大多数语言更高效(当然,C语言除外)。

顺便说一下,这里说的是Python 3,另一个测试的Python平台(就叫Python)表现得要差得多。

如果你真的想知道它是怎么更快的,虚拟机非常聪明。它在运行代码后再编译成机器语言,所以它知道最可能的代码路径并为这些路径进行优化。内存分配是一门艺术——在面向对象的语言中尤其重要。它可以进行一些其他语言无法做到的惊人运行时优化。当被迫时,它也能在相对较小的内存占用下运行,并且是嵌入式设备的首选语言之一,和C/C++一起。

我曾经为Agilent(想象一下昂贵的示波器)做过一个信号分析器,几乎整个项目(除了采样部分)都是用Java完成的。这包括绘制屏幕和跟踪(AWT)以及与控制界面的交互。

目前我正在为未来的有线电视机顶盒做一个项目。指南和大多数其他应用程序将会用Java编写。

为什么它不会比Python快呢?

15

Java的灵活性不如Python,但它的虚拟机(VM)做得更好,所以运行速度更快。Python有一个叫做全局解释器锁的东西,这个锁限制了它在同一个进程中不能把多个线程分配到不同的处理器核心上。

这两种语言的差别是否重要,主要看你打算做什么。我觉得这两种语言对你来说都能用得上。

撰写回答