Каковы плюсы и минусы работы в Hadoop с использованием разных языков? - PullRequest
6 голосов
/ 05 марта 2012

До сих пор я использовал Pig или Java для Map Reduce исключительно для запуска заданий на кластере Hadoop.Недавно я попробовал использовать Python Map Reduce с помощью потоковой передачи Hadoop, и это было довольно круто.Все это имеет смысл для меня, но я немного сомневаюсь, когда захочу использовать одну реализацию против другой.Сокращение Java-карты, я использую в основном исключительно тогда, когда мне нужна скорость, но когда я захочу использовать что-то вроде потоковой передачи Python вместо того, чтобы просто записывать то же самое в меньшем количестве более понятных строк в PIG / Hive?Короче, каковы плюсы и минусы каждому?

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Я буду отдельно относиться к Java против Python, а затем отдельно относиться к MR против Hive / Pig - так как я рассматриваю это как две разные проблемы
Hadoop построен на Java и многие его возможности доступны через Java API, а Hadoop в основном можно расширить с помощью классов Java.

Hadoop do имеет возможность работать с заданиями MR, созданными на других языках - это называется потоковой передачей. Эта модель позволяет нам определять маппер и редуктор только с некоторыми ограничениями, отсутствующими в Java. В то же время - форматы ввода / вывода и другие плагины должны быть написаны как java классы
Поэтому я бы определил принятие решений следующим образом: а) Используйте Java, если у вас нет серьезной кодовой базы, которую вы должны использовать в работе MR. б) Подумайте об использовании python, когда вам нужно создать несколько простых специальных заданий.

Что касается свиньи / улья - это также java-ориентированные системы более высокого уровня. Hive может использоваться без какого-либо программирования, но он может быть расширен с помощью Java. Свинья требует Java с самого начала. Я думаю, что эти системы почти всегда предпочтительнее, чем MR, в тех случаях, когда их можно применять. Обычно это случаи, когда обработка выполняется как SQL.

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

Особенности производительности свиней / улья.
Pig / Hive оба реализуют примитивы обработки SQL. Другими словами - они реализуют элементы плана выполнения в мире РСУБД. Эти реализации хороши и хорошо настроены. В то же время Hive (что-то, что я знаю лучше) является переводчиком. Он не выполняет генерацию кода - он интрепрпретит план выполнения в предварительно построенных заданиях MR. Это означает, что если у вас есть сложные условия sompe и вы напишете код специально для них - у вас есть все шансы сделать это намного лучше, чем у Hive, что представляет преимущество в производительности компилятора по сравнению с интерпретатором.

2 голосов
/ 06 марта 2012

Относительно Java против Pig - в большинстве случаев я бы использовал pig (наряду с Java UDF) для гибкости и для того, чтобы позволить кому-то еще (pig) выяснить, какой лучший способ разделить работу на карты и уменьшить их,объединители и т. д.

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

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

1 голос
/ 06 марта 2012

Существует Scala , где вы можете написать гораздо более простой код для ваших рабочих мест. Например, проверить: https://github.com/NICTA/scoobi

Возможно, у вас есть стимул использовать C ++ для задач, которые требуют больше памяти или ресурсов процессора. Вы можете прочитать, что Hypertable написал о своем решении C ++: http://code.google.com/p/hypertable/wiki/WhyWeChoseCppOverJava

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

...