Потоковая передача или настраиваемый Jar в Hadoop

Я выполняю потоковое задание в Hadoop (на Amazon EMR) с картографом и редуктором, написанным на Python. Я хочу знать о приросте скорости, который я получу, если реализую тот же преобразователь и редуктор на Java (или использую Pig).

В частности, я ищу опыт людей по переходу с потоковой передачи на настраиваемые развертывания jar и/или Pig, а также документы, содержащие эталонные сравнения этих вариантов. Я нашел этот вопрос, но ответы недостаточно конкретны для меня. Я ищу не сравнения между Java и Python, а сравнения между пользовательским развертыванием jar в Hadoop и потоковой передачей на основе Python.

Моя работа заключается в считывании количества NGram из набора данных NGgram в Google Книгах и вычислении совокупных показателей. Похоже, что загрузка ЦП на вычислительных узлах близка к 100%. (Я также хотел бы услышать ваше мнение о различиях между заданиями, связанными с процессором и вводом-выводом).

Спасибо!

Амач


person Ruggiero Spearman    schedule 29.07.2011    source источник


Ответы (1)


Зачем рассматривать возможность развертывания пользовательских jar-файлов?

  • Возможность использовать более мощные пользовательские форматы ввода. Для потоковых заданий, даже если вы используете подключаемый ввод/вывод, как указано здесь, вы ограничены ключом и значением вашего преобразователя/редьюсера, являющегося текстом/строкой. Вам нужно будет потратить некоторое количество циклов ЦП, чтобы преобразовать в требуемый тип.
  • Я также слышал, что Hadoop может разумно использовать JVM для нескольких заданий, что невозможно при потоковой передаче (не могу подтвердить это).

Когда использовать свинью?

  • Pig Latin довольно крут и представляет собой язык потока данных гораздо более высокого уровня, чем java/python или perl. Ваши сценарии Pig БУДУТ намного меньше, чем эквивалентная задача, написанная на любом из других языков.

Когда НЕ использовать свинью?

  • Несмотря на то, что pig довольно хорошо вычисляет, сколько карт/уменьшений и когда создавать карту или уменьшение и множество других вещей, если вы абсолютно уверены, сколько карт/уменьшений вам нужно, и у вас есть очень специфические вычисления вам нужно сделать в своих функциях Map/reduce, и вы очень конкретно относитесь к производительности, тогда вам следует рассмотреть возможность развертывания собственных jar-файлов. Эта ссылка показывает, что производительность pig может отставать от собственного Hadoop M/R. Вы также можете попробовать написать свои собственные UDF для Pig, которые изолируют некоторые вычислять интенсивную функцию (и, возможно, даже использовать JNI для вызова некоторого собственного кода C/C++ в UDF)

Примечание о заданиях, связанных с вводом-выводом и процессором:

  • С технической точки зрения, весь смысл hadoop и уменьшения карты заключается в том, чтобы распараллелить функции с интенсивными вычислениями, поэтому я бы предположил, что ваши задания по карте и сокращению требуют интенсивных вычислений. Подсистема Hadoop занята выполнением операций ввода-вывода только в промежутке между фазами сопоставления и сокращения, когда данные отправляются по сети. Кроме того, если у вас большой объем данных, и вы вручную настроили слишком мало карт и сокращений, что приводит к сбросу данных на диск (хотя слишком много задач приведет к тому, что слишком много времени будет потрачено на запуск / остановку JVM и слишком много маленьких файлов). Потоковое задание также будет иметь дополнительные накладные расходы, связанные с запуском виртуальной машины Python/Perl и копированием данных туда и обратно между JVM и виртуальной машиной сценариев.
person arun_suresh    schedule 31.07.2011
comment
Спасибо! Поскольку у меня уже есть требования к вводу/выводу простого текста, пользовательские форматы ввода не имеют отношения к моему случаю. Оценка Свиньи говорит мне, что я лучше буду держаться от нее подальше. У меня уже есть реализации Python. Мои сценарии сильно загружают процессор. Они просто читают со стандартного ввода, обрабатывают числа и выводят результат. Но я не уверен, означает ли это, что моя работа в Hadoop в целом может считаться связанной с процессором. В любом случае, что я действительно хотел спросить, так это взаимодействие между тем, связано ли задание с процессором или вводом-выводом, и реализовано ли оно как пользовательское jar или потоковое задание. - person Ruggiero Spearman; 31.07.2011
comment
Учитывая тот факт, что ваши задачи Maps и Reduce будут выполняться на собственной JVM, а также тот факт, что обычно функции map и Reduce привязаны к ЦП, эти отдельные задачи Hadoop будут привязаны к ЦП. Координирующая JVM для задания Hadoop, скорее всего, потребует интенсивного ввода-вывода, поскольку она занята ожиданием ответа от отдельных задач, отправляющих данные на уровень карты и сокращения. - person arun_suresh; 31.07.2011
comment
На самом деле, я только что понял, JVM, на которых выполняются задачи map и reduce, также обрабатывают некоторые операции ввода-вывода (потоковая передача на входе из HDFS и запись вывода в HDFS). Поскольку Hadoop гарантирует, что функция карты выполняется близко к тому месту, где находятся данные, это, как правило, довольно быстро (это не относится к функции сокращения). - person arun_suresh; 31.07.2011