Java vs Python на Hadoop


Я работаю над проектом с использованием Hadoop, и он, похоже, изначально включает Java и обеспечивает потоковую поддержку Python. Есть ли значительное влияние на производительность при выборе одного над другим? Я достаточно рано в процессе, где я могу пойти в любом случае, если есть значительная разница в производительности так или иначе.

3 53

3 ответа:

Java менее динамичен, чем Python, и больше усилий было вложено в его виртуальную машину, что делает его более быстрым языком. Python также сдерживается своей глобальной блокировкой интерпретатора, что означает, что он не может толкать потоки одного процесса на другое ядро.

имеет ли это какое-либо существенное значение, зависит от того, что вы собираетесь делать. Я подозреваю, что оба языка будут работать на вас.

с Python вы, вероятно, будете развиваться быстрее и с Java, безусловно, будет работать быстрее.

Google "benchmarksgame", если вы хотите увидеть некоторые очень точные сравнения скорости между всеми популярными языками, но если я правильно помню, вы говорите о 3-5x быстрее.

тем не менее, в наши дни мало что связано с процессором, поэтому, если вы чувствуете, что лучше развиваетесь с Python, имейте это!


в ответ на комментарий (как java может быть быстрее, чем Python):

все языки обрабатываются по-разному. Java-это самый быстрый после C & C++ (который может быть таким же быстрым или до 5 раз быстрее, чем java, но, похоже, в среднем в 2 раза быстрее). Остальные от 2-5+ раз медленнее. Python является одним из самых быстрых после Java. Я предполагаю, что C# примерно так же быстро, как Java или, может быть, быстрее, но у benchmarksgame был только Mono (который был немного медленнее), потому что они не запускают его в windows.

большинство этих утверждений основаны на элемент компьютерный язык контрольные игры что, как правило, довольно справедливо, потому что сторонники/эксперты на каждом языке настраивают тест, написанный на их конкретном языке, чтобы обеспечить правильность кода.

например, этой показывает все тесты с Java vs c++, и вы можете видеть, что диапазон скоростей примерно равен java, который в 3 раза медленнее (первый столбец находится между 1 и 3), а java использует гораздо больше памяти!

теперь на этой странице показывает java vs python (с точки зрения Python). Таким образом, скорость варьируется от python в 2 раза медленнее, чем Java, до 174x медленнее, python обычно превосходит java по размеру кода и использованию памяти.

еще один интересный момент здесь-тесты, которые выделили много памяти, Java на самом деле выполняется значительно лучше, чем Python в размере памяти, а также. Я уверен, что java обычно теряет память из-за накладных расходов виртуальной машины, но как только это произойдет, java, вероятно, больше эффективнее, чем большинство (опять же, за исключением C).

Это Python 3 кстати, другая протестированная платформа python (только что названная Python)была намного хуже.

Если вы действительно хотели знать как это быстрее, VM удивительно умный. Он компилируется на машинном языке после запуска кода, поэтому он знает, какие наиболее вероятные пути кода и оптимизирует для них. Выделение памяти-это искусство, действительно полезное в языке OO. Он может выполнять некоторые удивительные оптимизация времени выполнения, которую не может выполнить язык, отличный от VM. Он может работать в довольно небольшом объеме памяти, когда это необходимо, и является языком выбора для встроенных устройств вместе с C/C++.

Я работал над анализатором сигналов для Agilent (думаю, дорогой o-scope), где почти все (кроме выборки) было сделано на Java. Это включает в себя рисование экрана, включая трассировку (AWT) и взаимодействие с элементами управления.

В настоящее время я работаю над проектом для все будущие кабельные коробки. Руководство вместе с большинством других приложений будет написано на Java.

Почему бы ему не быть быстрее, чем Python?

вы можете написать преобразования Hadoop mapreduce либо как "потоковое", либо как "пользовательский jar". Если вы используете потоковую передачу, вы можете написать свой код на любом языке, включая Python или C++. Ваш код будет просто читать из STDIN и выводить в STDOUT. Однако в версиях hadoop до 0.21 потоковая передача hadoop использовалась только для потоковой передачи текста, а не двоичного кода, в ваши процессы. Поэтому ваши файлы должны быть текстовыми файлами, если вы сами не выполняете некоторые фанковые преобразования кодировки. Но теперь это появляется патч было добавлено, что теперь позволяет использовать двоичные форматы потоковой передачи Hadoop.

Если вы используете "пользовательский jar" (т. е. вы написали свой код mapreduce на Java или Scala с использованием библиотек hadoop), то у вас будет доступ к функциям, которые позволяют вам вводить и выводить двоичные файлы (сериализовать в двоичном формате) из ваших потоковых процессов (и сохранять результаты на диск). Таким образом, будущие запуски будут намного быстрее (в зависимости от того, насколько ваш двоичный формат меньше, чем ваш текстовый формат).

поэтому, если ваша работа hadoop будет связана с вводом/выводом, то подход "custom 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 только на 25% медленнее, чем код java "custom jar", я бы определенно пошел по маршруту python.