当前位置:  开发笔记 > 编程语言 > 正文

Hadoop上的Java与Python

如何解决《Hadoop上的Java与Python》经验,为你挑选了3个好方法。

我正在使用Hadoop开发一个项目,它似乎本身就包含了Java并为Python提供了流媒体支持.选择一个而不是另一个会对性能产生重大影响吗?在这个过程中,如果某种方式存在显着的性能差异,我可以采用任何一种方式.



1> Bill K..:

使用Python,您可能会更快地开发,并且Java肯定会运行得更快.

谷歌"基准游戏",如果你想看到所有流行语言之间的一些非常准确的速度比较,但如果我没记错的话,你说的速度要快3-5倍.

也就是说,现在处理器很少有东西,所以如果你觉得你用Python开发得更好,那就去吧!


回复评论(java如何比Python更快):

所有语言的处理方式都不同 Java是C&C++之后最快的(它可以比java快,或者比java快5倍,但似乎平均快2倍左右).其余的是2-5 +慢.Python是继Java之后的速度之一.我猜测C#的速度和Java一样快,或者更快,但基准游戏只有Mono(这有点慢),因为它们不会在Windows上运行它.

这些声明中的大多数是基于计算机语言基准测试游戏,这种游戏往往非常公平,因为每种语言的专家都会调整用他们特定语言编写的测试,以确保代码具有良好的针对性.

例如,这显示了使用Java与c ++的所有测试,您可以看到速度范围大约等于java慢3倍(第一列介于1和3之间),而java使用更多内存!

现在这个页面显示了java vs python(从Python的角度来看).所以速度范围从python比Java慢2倍到慢174倍,python一般比代码大小和内存使用情况更好.

另一个有趣的地方 - 分配了大量内存的测试,Java实际上在内存大小上的表现也明显优于Python.我很确定java通常会因为VM的开销而丢失内存,但是一旦出现这种情况,java可能比大多数更有效(除了C之外).

顺便说一句,这是Python 3,另一个经过测试的python平台(简称Python)更糟糕.

如果你真的想知道它是如何更快,那么VM非常聪明.它在运行代码后编译为机器语言,因此它知道最可能的代码路径是什么并为它们进行优化.内存分配是一门艺术 - 在OO语言中非常有用.它可以执行一些令人惊讶的运行时优化,而非VM语言无法做到这一点.它在被迫时可以在相当小的内存空间中运行,并且是嵌入式设备和C/C++的首选语言.

我在安捷伦的一个信号分析仪(想想昂贵的o-scope)上工作,几乎整个事情(除了采样)都是用Java完成的.这包括绘制包括轨迹(AWT)和与控件交互的屏幕.

目前我正在为所有未来的有线电视盒子开展一个项目.该指南以及大多数其他应用程序将使用Java编写.

为什么它不比Python快?



2> David Crawsh..:

Java没有Python那么动态,并且已经为其VM添加了更多的努力,使其成为一种更快的语言.Python也被其Global Interpreter Lock阻止,这意味着它不能将单个进程的线程推送到不同的核心.

这是否会产生重大影响取决于您打算做什么.我怀疑这两种语言都适合你.


由于GIL只是多线程应用程序的限制,这与在Hadoop上运行的Python有什么关系?每个Hadoop节点都不会启动单独的Python进程,从而避免多线程和GIL吗?
但是,python确实为多个内核提供了非常好的多进程支持
多核处理内容可以与并行python模块一起使用,该模块还允许您将进程推送到集群中的其他计算机.非常简洁.

3> John Prior..:

您可以将Hadoop mapreduce转换编写为"流式"或"自定义jar".如果使用流式传输,则可以使用任何您喜欢的语言编写代码,包括Python或C++.您的代码将从STDIN读取并输出到STDOUT.但是,在0.21之前的hadoop版本中,hadoop流只用于将文本 - 而非二进制 - 流式传输到您的进程.因此,您的文件必须是文本文件,除非您自己进行一些时髦的编码转换.但现在看来已经添加了补丁,现在允许使用带有hadoop流的二进制格式.

如果您使用"自定义jar"(即您使用hadoop库在Java或Scala中编写mapreduce代码),那么您将可以访问允许您从流处理输入和输出二进制(二进制序列化)的函数(并将结果保存到磁盘).因此,未来的运行速度会快得多(取决于二进制格式小于文本格式的程度).

因此,如果您的hadoop作业将受到I/O限制,那么"自定义jar"方法将更快(因为两个Java都比以前的海报显示更快,并且从磁盘读取也会更快).

但你必须问自己,你的时间有多宝贵.我发现自己在使用python时效率更高,并且编写map-reduce来读取STDIN并写入STDOUT非常简单.所以我个人会建议你去python路线 - 即使你必须自己想出二进制编码的东西.因为hadoop 0.21处理非utf8字节数组,并且因为有一个二进制(字节数组)替代用于python(http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/),这显示python代码仅比"自定义jar"java代码慢约25%,我肯定会去python路由.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有