Как я могу получить целочисленный индекс для ключа в hadoop? - PullRequest
3 голосов
/ 22 сентября 2011

Интуитивно понятно, что hadoop делает что-то подобное для распределения ключей среди картографов, используя псевдокод python-esque.

# data is a dict with many key-value pairs
keys = data.keys()
key_set_size = len(keys) / num_mappers
index = 0
mapper_keys = []
for i in range(num_mappers):
  end_index = index + key_set_size
  send_to_mapper(keys[int(index):int(end_index)], i)
  index = end_index
# And something vaguely similar for the reducer (but not exactly).

Кажется, что где-то hadoop знает индекс каждого передаваемого ключа, посколькураспределяет их равномерно среди картографов (или редукторов).У меня вопрос: как я могу получить доступ к этому индексу?Я ищу диапазон целых чисел [0, n), сопоставляющих все мои n ключей;это то, что я подразумеваю под «индексом».

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

Ответы [ 3 ]

0 голосов
/ 22 сентября 2011

Если вы используете новый API MR, тогда org.apache.hadoop.mapreduce.lib.partition.HashPartitioner является разделителем по умолчанию, иначе org.apache.hadoop.mapred.lib .HashPartitioner является разделителем по умолчанию. Вы можете вызвать getPartition () на любом из HashPartitioner, чтобы получить номер раздела для ключа (который вы упомянули как индекс).

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

Вот код из HashPartitioner для getPartition (). Вы можете написать простую программу на Java для того же.

public int getPartition (ключ K, значение V, int numReduceTasks) {
return (key.hashCode () & Integer.MAX_VALUE)% numReduceTasks;
}

Редактировать: Включая другой способ получения индекса.

Следующий код из также должен работать. Быть включенным в карту или функцию уменьшения.

public void configure (JobConf job) {
partition = job.getInt ("mapred.task.partition", 0);
}

0 голосов
/ 07 ноября 2012

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

0 голосов
/ 22 сентября 2011

На самом деле, ваш редуктор (каждый отдельный) возвращает массив элементов, которые соответствуют ключу редукции. Итак, хотите ли вы, чтобы смещение элементов в ключе сокращения в вашем редукторе или общее смещение конкретного элемента в глобальном массиве всех обрабатываемых строк? Чтобы получить Indeex в вашем маппере, вы можете просто добавить номер строки к каждой строке файла, прежде чем файл попадет в маппер. Это скажет вам «глобальный индекс». Однако имейте в виду, что с 1 000 000 единиц товара 662 345 можно обработать до позиции 10 000.

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