Как объединить несколько заданий Hadoop MapReduce в одно? - PullRequest
3 голосов
/ 29 июня 2010

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

Моя цель: вычислить эти различные задачи как можно быстрее.

В настоящее время я позволяю им запускать последовательно каждое чтение во всех данных. Я предполагаю, что это будет быстрее, если объединить задачи и выполнить их похожие части (например, передать все данные в маппер) только один раз.

Мне было интересно, если и как я могу объединить эти задачи. Для каждой пары ключ / значение ввода преобразователь может выдавать «супер-ключ», который включает в себя идентификатор задачи и данные ключа конкретной задачи вместе со значением. Таким образом, редукторы получат пары ключ / значение для задачи и ключ, специфичный для задачи, и смогут при просмотре «суперключа» решить, какую задачу выполнить для включенного ключа и значений.

В псевдокоде:

map(key, value):
    emit(SuperKey("Task 1", IncludedKey), value)
    emit(SuperKey("Task 2", AnotherIncludedKey), value)

reduce(key, values):
   if key.taskid == "Task 1":
      for value in values:
          // do stuff with key.includedkey and value
   else:
      // do something else

Ключом может быть WritableComparable, который может содержать всю необходимую информацию.

Примечание: псевдокод предполагает ужасную архитектуру, и это определенно можно сделать более умным способом.

Мои вопросы:

  • Разумный ли это подход?
  • Есть ли лучшие альтернативы?
  • Есть ли у него какой-то ужасный недостаток?
  • Нужен ли класс Partitioner для этого подхода?

Контекст : Данные состоят из нескольких миллионов четвертей RDF, и задачи состоят в том, чтобы рассчитать кластеры, статистику и сходства. Некоторые задачи могут быть легко решены с помощью счетчиков Hadoop в редукторе, но некоторые требуют нескольких шагов MapReduce.

Вычисления в конечном итоге будут выполняться на Amazon Elastic MapReduce. Все задачи должны быть рассчитаны для всего набора данных и как можно быстрее.

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Вы можете использовать:

  1. каскадный
  2. Oozie

Оба используются для записи рабочих процессов в hadoop.

2 голосов
/ 01 июля 2010
  • Это разумный подход?

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

  • Есть ли лучшие альтернативы?

Может быть целесообразно написать несколько каркасных картографов и редукторов, каждый из которых принимает в качестве параметров конфигурации ссылки на классы, которые они должны отложить для отображения фактического и сокращения. Это может решить вышеупомянутое соединение кода (возможно, вы уже думали об этом).

  • У него есть какой-то ужасный недостаток?

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

  • Нужен ли для этого подхода специальный класс Partitioner?

Возможно, в зависимости от того, что вы делаете. В общем, я думаю, что если вы пишете пользовательский вывод WritableComparable, вам также потребуется пользовательское разбиение Однако может существовать некоторая библиотека Partitioner, которую можно настроить для ваших нужд (например, KeyFieldBasedPartitioner, если вы выводите тип Text и используете String разделители полей вместо собственных).

НТН. Если вы можете дать немного больше контекста, возможно, я мог бы предложить больше советов. Удачи!

0 голосов
/ 04 октября 2013

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

http://www.infoq.com/articles/introductionOozie

...