2013-05-19 4 views
0

Как сделать объединение двух наборов записей, используя Map Reduce? Большинство решений, в том числе опубликованных на SO, предлагают мне испускать записи на основе общего ключа, а в редукторе добавить их, чтобы сказать HashMap, а затем взять крест продукта. (например, Join of two datasets in Mapreduce/Hadoop)Операция объединения с использованием Hadoop MapReduce

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

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

+0

Вы делаете что-то неправильно. Этот ответ на самом деле дает вам единственный способ сделать присоединение к MR (за исключением соединения в памяти с помощью распределенного кеша и некоторого другого колдовства), если у вас закончится куча, вы, очевидно, сохраняете слишком много материала в памяти или ваш размер кучи слишком мал, попробуйте поднять его с помощью -XmxSIZE. Каждый * ряд * ваших данных содержит миллиарды записей? – TC1

+0

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

ответ

0

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

При работе на линии типа A найдите ключ в Кассандре. Если существует - слияние A записывается в существующее значение (элементы B). Если нет - создайте ключ и добавьте A как значение.

При работе на линии типа B найдите ключ в Кассандре. Если существует - объединить записи B в существующее значение (элементы A). Если нет - создайте ключ и добавьте B-элементы в качестве значения.

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

0

Вы должны изучить, как свиньи объединяются. Идея заключается в том, что если ваши данные содержат слишком много значений с одним и тем же ключом (даже если нет перекос данных), вы можете создавать искусственные ключи и распространять распределение ключей. Это позволит убедиться, что каждый редуктор получает меньше записей, чем в противном случае. Напр. если вы должны суффикс «1» до 50% от вашего ключа «K1» и «2», остальные 50% вы закончите с половиной записей на редукторе 1 (1K1), а другая половина будет равна 2K2.

Если распределение ключей не известно заранее, вы можете использовать какой-либо алгоритм выборки.

Смежные вопросы