Связывание нескольких заданий MapReduce в Hadoop - PullRequest
118 голосов
/ 23 марта 2010

Во многих реальных ситуациях, когда вы применяете MapReduce, окончательные алгоритмы заканчиваются несколькими шагами MapReduce.

т.е. Map1, Reduce1, Map2, Reduce2 и т. Д.

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

Промежуточные данные - это то, что вы (в общем) не хотите хранить после успешного завершения конвейера. Кроме того, поскольку эти промежуточные данные, как правило, представляют собой некоторую структуру данных (например, «карту» или «набор»), вы не хотите прилагать слишком много усилий для написания и чтения этих пар ключ-значение.

Каков рекомендуемый способ сделать это в Hadoop?

Есть ли (простой) пример, показывающий, как правильно обрабатывать эти промежуточные данные, включая последующую очистку?

Ответы [ 13 ]

1 голос
/ 14 ноября 2012

Я думаю, что oozie помогает последующим работам получать входные данные непосредственно от предыдущей работы.Это позволяет избежать операции ввода-вывода, выполняемой с помощью jobcontrol.

1 голос
/ 26 мая 2011

Хотя существуют сложные серверные механизмы рабочих процессов Hadoop, например oozie, у меня есть простая библиотека Java, которая позволяет выполнять несколько заданий Hadoop в качестве рабочего процесса. Конфигурация задания и рабочий процесс, определяющий зависимость между заданиями, настраиваются в файле JSON. Все настраивается извне и не требует каких-либо изменений в существующей карте, что делает реализацию частью рабочего процесса.

Подробности можно найти здесь. Исходный код и jar доступны в github.

http://pkghosh.wordpress.com/2011/05/22/hadoop-orchestration/

Pranab

0 голосов
/ 02 марта 2018

Как вы упомянули в своем требовании, что вы хотите, чтобы o / p MRJob1 был i / p MRJob2 и т. Д., Вы можете рассмотреть возможность использования рабочего процесса oozie для этого варианта использования.Также вы можете записать свои промежуточные данные в HDFS, так как они будут использованы в следующем MRJob.И после завершения работы вы можете очистить промежуточные данные.

<start to="mr-action1"/>
<action name="mr-action1">
   <!-- action for MRJob1-->
   <!-- set output path = /tmp/intermediate/mr1-->
    <ok to="end"/>
    <error to="end"/>
</action>

<action name="mr-action2">
   <!-- action for MRJob2-->
   <!-- set input path = /tmp/intermediate/mr1-->
    <ok to="end"/>
    <error to="end"/>
</action>

<action name="success">
        <!-- action for success-->
    <ok to="end"/>
    <error to="end"/>
</action>

<action name="fail">
        <!-- action for fail-->
    <ok to="end"/>
    <error to="end"/>
</action>

<end name="end"/>

...