Как поделиться генератором глобальных последовательных чисел в Hadoop? - PullRequest
1 голос
/ 28 октября 2011

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

1) Создайте текстовый файл, например test.seq, в HDFS для сохранения текущего порядкового номера.

2) Я использую файл блокировки ".lock" для управления параллелизмом.Предположим, у нас есть две задачи для параллельной обработки данных.Если task1 хочет получить номер, он проверит, существует ли файл блокировки.Если да, это означает, что task2 обращается к номеру из test.seq, тогда task1 должен ждать.Когда задача2 получила номер, она перезаписывает старый номер, увеличивая 1, когда возвращается, и удаляет файл блокировки «.lock».Когда task1 видит исчезновение .lock, task1 сначала создает файл ".lock", а затем делает то же самое, чтобы получить порядковый номер.

Однако я не уверен, что этот подход практичен.Поскольку я храню файлы .lock и test.seq в HDFS, даже задача test.seq была изменена задачей 1, она может быть не сразу обнаружена задачей 2.По мере того как другие задачи получают информацию о данных в HDFS через namenode.Итак, датодель сначала уведомит об изменении наменоде, затем другие задачи уведомят об изменениях.Это правильно?

Другая идея заключается в создании торжанской программы, работающей на Master.Итак, задание получить порядковый номер есть через RPC программу Torjan.Но как запустить программу Torjan на главной программе?

Кто-нибудь может дать мне совет?спасибо!

Ответы [ 3 ]

6 голосов
/ 28 октября 2011

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

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

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

4 голосов
/ 29 октября 2011

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

Таким образом, у вас есть два варианта:

  1. Вы принимаете ограничения на масштабирование и выбираете решения, предложенные другими.(например, опция zookeeper)
  2. Вы выбираете решение, которое не требует формы центральной координации.За счет некоторых свойств ключа.

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

0 голосов
/ 28 октября 2011

Если вам нужно иметь записи только в хронологическом порядке, сохраните метку времени вместо идентификатора.

...