Я работаю над проектом, используя Hadoop, и, похоже, он использует Java и обеспечивает поддержку потоковой передачи для Python. Существует ли значительное влияние на выбор одного из них? Я достаточно рано в процессе, когда я могу идти в любом случае, если есть существенная разница в производительности, так или иначе.
Java vs Python на Hadoop
Ответ 1
Java менее динамична, чем Python, и больше усилий было добавлено в ее виртуальную машину, что делает ее более быстрым. Python также сдерживается его Global Interpreter Lock, что означает, что он не может вытолкнуть нити одного процесса на другое ядро.
Неважно, зависит ли это от какой-либо существенной разницы, от того, что вы намерены делать. Я подозреваю, что оба языка будут работать на вас.
Ответ 2
С Python вы, вероятно, будете развиваться быстрее, а с Java, безусловно, будет работать быстрее.
Google "benchmarksgame", если вы хотите увидеть очень точное сравнение скорости между всеми популярными языками, но если я правильно помню, вы говорите о 3-5 раз быстрее.
Тем не менее, в наши дни мало что связано с обработкой процессора, поэтому, если вы чувствуете, что с Python будете лучше развиваться, имейте это в виду!
В ответ на комментарий (как Java может быть быстрее, чем Python):
Все языки обрабатываются по-разному. Java является самым быстрым после C и С++ (который может быть таким же быстрым или до 5 раз быстрее, чем java, но, похоже, в среднем примерно в 2 раза быстрее). Остальные от 2-5 + раз медленнее. Python является одним из самых быстрых из них после Java. Я предполагаю, что С# примерно так же быстро, как и Java, или, может быть, быстрее, но в тестовых играх был только Mono (который был чуть медленнее), потому что они не запускают его в окнах.
Большинство из этих утверждений основаны на играх с компьютерными языками, которые, как правило, довольно справедливы, потому что сторонники/эксперты в каждой языковой настройке тест, написанный на их конкретном языке, чтобы обеспечить корректный код.
Например, this показывает все тесты с Java vs С++, и вы можете видеть, что диапазоны скоростей от примерно равны java, что на 3 раза медленнее ( первый столбец между 1 и 3), а java использует гораздо больше памяти!
Теперь эта страница показывает java vs python (с точки зрения Python). Таким образом, диапазон скоростей от python составляет 2x медленнее, чем Java до 174x медленнее, python обычно превосходит java в размере кода и использовании памяти.
Еще один интересный момент - тесты, которые выделяли много памяти, на самом деле Java выполнялись значительно лучше, чем Python в размере памяти. Я почти уверен, что java обычно теряет память из-за накладных расходов на VM, но как только это усугубляется, java, вероятно, более эффективен, чем большинство (опять же, кроме C).
Это Python 3, кстати, другая тестируемая платформа python (Just called Python) намного хуже.
Если вы действительно хотите знать, как это происходит быстрее, виртуальная машина удивительно умна. Он компилируется для машинного языка ПОСЛЕ запуска кода, поэтому он знает, какие наиболее вероятные пути кода и оптимизируются для них. Распределение памяти - это искусство - действительно полезно на языке OO. Он может выполнять некоторые удивительные оптимизации во время выполнения, которые не могут выполнять никакие не-VM-языки. Он может работать в небольшом объеме памяти при принуждении и является языком выбора для встроенных устройств вместе с C/С++.
Я работал над анализатором сигналов для Agilent (думаю, дорогой o-scope), где почти все (кроме выборки) было сделано на Java. Это включает в себя рисование экрана, включая трассировку (AWT) и взаимодействие с элементами управления.
В настоящее время я работаю над проектом для всех будущих кабельных коробок. Руководство вместе с большинством других приложений будет написано на Java.
Почему бы не быть быстрее, чем Python?
Ответ 3
Вы можете преобразовать преобразования Hadoop mapreduce либо как "потоковое", либо как "обычную банку". Если вы используете потоковое вещание, вы можете написать свой код на любом языке, который вам нравится, включая Python или С++. Ваш код будет просто считываться с STDIN и выводиться на STDOUT. Тем не менее, в версиях hadoop до 0,21 потоковая потоковая передача использовала только потоки текста, а не бинарные - для ваших процессов. Поэтому ваши файлы должны были быть текстовыми файлами, если вы не делаете какие-то фанки-преобразования. Но теперь появляется добавленный патч, который теперь позволяет использовать двоичные форматы с потоком хаопов.
Если вы используете "пользовательскую банку" (т.е. вы написали код mapreduce в Java или Scala с использованием библиотек hadoop), тогда у вас будет доступ к функциям, которые позволят вам вводить и выводить двоичные файлы (сериализовать в двоичном формате) от ваших потоковых процессов (и сохранить результаты на диск). Таким образом, будущие прогоны будут намного быстрее (в зависимости от того, насколько ваш двоичный формат меньше вашего текстового формата).
Итак, если ваше задание hadoop будет привязано к I/O, тогда подход "пользовательский jar" будет быстрее (поскольку и Java быстрее, как показали предыдущие плакаты, и чтение с диска также будет быстрее).
Но вы должны спросить себя, насколько ценно ваше время. Я нахожу себя гораздо более продуктивным с python и пишу map-reduce, который читает STDIN, и запись в STDOUT очень проста. Поэтому я лично рекомендую переходить на маршрут python - даже если вам придется составлять бинарный код. Так как hasoop 0.21 обрабатывает не-utf8 байтовые массивы, и поскольку для python существует двоичный (байтовый массив), альтернативный для использования в python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/) который показывает, что код python только примерно на 25% медленнее, чем java-код "custom jar", я бы определенно пошел по пути python.