Во многих реальных ситуациях, когда вы применяете MapReduce, окончательные алгоритмы превращаются в несколько шагов MapReduce.
т.е. Map1, Reduce1, Map2, Reduce2 и так далее.
Итак, у вас есть результат последнего сокращения, который необходим в качестве входных данных для следующей карты.
Промежуточные данные - это то, что вы (как правило) не хотите сохранять после успешного завершения конвейера. Кроме того, поскольку эти промежуточные данные, как правило, представляют собой некую структуру данных (например, «карту» или «набор»), вы не хотите прикладывать слишком много усилий для записи и чтения этих пар ключ-значение.
Каков рекомендуемый способ сделать это в Hadoop?
Есть ли (простой) пример, который показывает, как правильно обрабатывать эти промежуточные данные, включая последующую очистку?
Ответы:
Я думаю, что этот учебник в сети разработчиков Yahoo поможет вам в этом: Создание цепочки заданий
Вы используете расширение
JobClient.runJob()
. Путь вывода данных из первого задания становится входным путем для вашего второго задания. Их необходимо передавать в качестве аргументов вашим заданиям с соответствующим кодом для их анализа и настройки параметров для задания.Я думаю, что вышеупомянутый метод может быть тем же способом, что и более старый API с отображением карт, но он все равно должен работать. В новом API mapreduce будет аналогичный метод, но я не уверен, что это такое.
Что касается удаления промежуточных данных после завершения задания, вы можете сделать это в своем коде. Раньше я использовал что-то вроде:
Где путь - это расположение данных в HDFS. Убедитесь, что вы удаляете эти данные только тогда, когда они не требуются для других заданий.
источник
Есть много способов сделать это.
(1) Каскадирование рабочих мест
Создайте объект JobConf «job1» для первого задания и установите все параметры с «input» в качестве входного каталога и «temp» в качестве выходного каталога. Выполните эту работу:
Сразу под ним создайте объект JobConf «job2» для второго задания и установите все параметры с «temp» в качестве входного каталога и «output» в качестве выходного каталога. Выполните эту работу:
(2) Создайте два объекта JobConf и установите в них все параметры так же, как (1), за исключением того, что вы не используете JobClient.run.
Затем создайте два объекта Job с настройками jobconfs в качестве параметров:
Используя объект jobControl, вы указываете зависимости задания, а затем запускаете задания:
(3) Если вам нужна структура вроде Map + | Уменьшить | Map *, вы можете использовать классы ChainMapper и ChainReducer, которые поставляются с Hadoop версии 0.19 и новее.
источник
На самом деле есть несколько способов сделать это. Я сосредоточусь на двух.
Один из них - через Riffle ( http://github.com/cwensel/riffle ) - библиотеку аннотаций для идентификации зависимых вещей и «выполнения» их в зависимости (топологическом) порядке.
Или вы можете использовать Cascade (и MapReduceFlow) в Cascading ( http://www.cascading.org/ ). В будущей версии будут поддерживаться аннотации Riffle, но теперь она отлично работает с необработанными заданиями MR JobConf.
Один из вариантов - вообще не управлять заданиями MR вручную, а разработать приложение с помощью Cascading API. Затем JobConf и объединение заданий обрабатываются внутри с помощью классов Cascading planner и Flow.
Таким образом, вы тратите свое время на решение своей проблемы, а не на механику управления заданиями Hadoop и т. Д. Вы даже можете накладывать поверх разных языков (например, clojure или jruby), чтобы еще больше упростить разработку и приложения. http://www.cascading.org/modules.html
источник
Я выполнил цепочку заданий, используя объекты JobConf один за другим. Я взял пример WordCount для объединения заданий. Одна задача вычисляет, сколько раз слово a повторяется в данном выводе. Второе задание принимает выходные данные первого задания в качестве входных данных и вычисляет общее количество слов в заданных входных данных. Ниже приведен код, который необходимо поместить в класс Driver.
Команда для запуска этих заданий:
bin / hadoop jar TotalWords.
Нам нужно дать окончательное имя задания для команды. В приведенном выше случае это TotalWords.
источник
Вы можете запустить цепочку MR, как указано в коде.
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ : был предоставлен только код драйвера
ПОСЛЕДОВАТЕЛЬНОСТЬ:
( JOB1 ) MAP-> REDUCE-> ( JOB2 ) MAP
Это было сделано для сортировки ключей, но есть и другие способы, такие как использование древовидной карты.
Тем не менее, я хочу сосредоточить ваше внимание на способе связывания заданий! !
Спасибо
источник
Вы можете использовать oozie для обработки ваших заданий MapReduce. http://issues.apache.org/jira/browse/HADOOP-5303
источник
В проекте Apache Mahout есть примеры, которые объединяют несколько заданий MapReduce. Один из примеров можно найти по адресу:
RecommenderJob.java
http://search-lucene.com/c/Mahout:/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java%7C%7CRecommenderJob
источник
Мы можем использовать
waitForCompletion(true)
метод задания, чтобы определить зависимость между заданиями.В моем сценарии у меня было 3 работы, которые зависели друг от друга. В классе драйвера я использовал приведенный ниже код, и он работает, как ожидалось.
источник
Новый класс org.apache.hadoop.mapreduce.lib.chain.ChainMapper помогает в этом сценарии
источник
Хотя существуют сложные серверные механизмы рабочего процесса Hadoop, например oozie, у меня есть простая библиотека Java, которая позволяет выполнять несколько заданий Hadoop в качестве рабочего процесса. Конфигурация задания и рабочий процесс, определяющий зависимость между заданиями, настраиваются в файле JSON. Все настраивается извне и не требует каких-либо изменений в существующей реализации сокращения карты, чтобы стать частью рабочего процесса.
Подробности можно найти здесь. Исходный код и jar доступны в github.
http://pkghosh.wordpress.com/2011/05/22/hadoop-orchestration/
Pranab
источник
Я думаю, что oozie помогает последующим заданиям получать данные непосредственно от предыдущей работы. Это позволяет избежать операций ввода-вывода, выполняемых с помощью управления заданиями.
источник
Если вы хотите программно объединить свои задания, вы захотите использовать JobControl. Использование довольно простое:
После этого вы добавляете экземпляры ControlledJob. ControlledJob определяет задание со своими зависимостями, таким образом, автоматически подключает входные и выходные данные для соответствия «цепочке» заданий.
запускает цепочку. Вы захотите разместить это в специальной ветке. Это позволяет проверять статус вашей цепочки во время ее работы:
источник
Как вы упомянули в своем требовании, что хотите, чтобы o / p MRJob1 было i / p MRJob2 и так далее, вы можете рассмотреть возможность использования рабочего процесса oozie для этого варианта использования. Также вы можете рассмотреть возможность записи промежуточных данных в HDFS, поскольку они будут использоваться в следующем MRJob. А после завершения работы вы можете очистить промежуточные данные.
источник