2009-09-26 3 views
51

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

+0

В этом году была сессия Hadoop в DEFCON. Они показали, что Python делает это на удивление хорошо, но, похоже, выполняет задачу, связанную с I/O. Я понимаю, что интеграция с Python включает в себя запуск отдельного процесса и передачу данных в виде текста. В зависимости от задачи это может быть или не быть проблемой. –

+0

Если процесс обработки карты/сокращения может занять много времени для обработки ключа, тогда потоковая передача может иметь некоторые другие проблемы. Настраиваемый Java-преобразователь/редуктор может посылать heartbeat, чтобы уведомить jobtracker, но потоковый преобразователь/редуктор не имеет такой возможности. – phsiao

+5

Обычно это зависит от того, связана ли ваша задача с IO или CPU. IMO в задачах, связанных с IO, не имеет большого значения, какой язык вы будете использовать. Но для задач с привязкой к ЦП, если вы хотите получить всю мощность, которую вы можете получить для Java, если вы можете сэкономить несколько процентов энергии для ускорения разработки, перейдите на Python. – wlk

ответ

13

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

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

+6

python, однако, имеет очень приятную многопроцессорную поддержку для нескольких ядер – cobbal

+0

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

+2

Многоядерный процесс может использоваться с параллельным модулем python, который также позволяет выталкивать процессы на другие компьютеры в кластере. Очень аккуратно и легко. – whatnick

24

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

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

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


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

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

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

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

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

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

Это, кстати, Python 3, другая тестируемая платформа python (Just called Python) намного хуже.

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

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

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

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

+0

Как Java может быть быстрее, чем Python? есть ли какая-нибудь выдержка из этого? Благодарю. –

+0

Не отрываясь от вашего резюме, имейте в виду, что многие из программ Java, возможно, были преобразованы для использования quadcore - так же посмотрите на измерения одного ядра - http://shootout.alioth.debian.org/u32/index. php – igouy

+0

Интересно. Я посмотрел на самую худшую программу java (дерево) и заметил, что она не многопоточная, но вы правы - многие другие языки делают удивительное шоу в однопоточном режиме. Бесплатный Паскаль ??? Ада ??? Хммм –

14

Вы можете написать преобразования преобразования Hadoop как «потоковые», так и «пользовательские банки». Если вы используете потоковое вещание, вы можете написать свой код на любом языке, который вам нравится, включая Python или C++. Ваш код будет просто считываться с STDIN и выводиться на STDOUT. Тем не менее, в версиях hadoop до 0,21 потоковая потоковая передача использовала только потоки текста, а не бинарные - для ваших процессов. Поэтому ваши файлы должны были быть текстовыми файлами, если вы не делаете какие-то фанки-преобразования. Но теперь, похоже, добавлен patch, который теперь позволяет использовать двоичные форматы с потоком хаопов.

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

Так что, если ваша работа hadoop будет привязана к вводу/выводу, то подход «custom jar» будет быстрее (поскольку и Java быстрее, как показали предыдущие плакаты, и чтение с диска также будет быстрее).

Но вы должны спросить себя, насколько ценным является ваше время. Я нахожу себя гораздо более продуктивным с python и пишу map-reduce, который читает STDIN, и запись в STDOUT очень проста. Поэтому я лично рекомендую переходить на маршрут python - даже если вам придется составлять бинарный код. Так как hasoop 0.21 обрабатывает не-utf8 байт-массивы, а так как существует двоичный (байтовый массив), альтернативный использованию для python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), который показывает, что код python только примерно на 25% медленнее, чем java-код «custom jar», I определенно будет идти по пути python.