Допустим, у меня есть два довольно больших набора данных - первый называется «Base» и содержит 200 миллионов строк с разделителями табуляции, а второй - вызов «MatchSet», который содержит 10 миллионов строк с похожими данными табуляции.
Допустим, у меня также есть произвольная функция Match (row1, row2), а Match (), по сути, содержит некоторую эвристику для просмотра row1 (из MatchSet) и сравнения его с row2 (из Base) и определения, похожи ли оникаким-то образом.
Допустим, правила, реализованные в Match (), представляют собой пользовательские и сложные правила, а не простые совпадения строк, включающие некоторые проприетарные методы.Допустим, что Match (row1, row2) написан в псевдо-коде, поэтому реализация на другом языке не является проблемой (хотя сегодня это на C ++).
В линейной модели, то есть программе, работающей на одном гигантском процессоре - мы читали каждую строку из MatchSet и каждую строку из Base, сравнивали одну из них с помощью Match () и записывали нашу статистику совпадений.Например, мы могли бы захватить: X записей из MatchSet - сильные совпадения, Y записей из MatchSet - слабые совпадения, Z записей из MatchSet не совпадают.Мы также записали бы сильные / слабые / не значения в отдельные файлы для проверки.Ака, это своего рода вложенный цикл:
for each row1 in MatchSet
{
for each row2 in Base
{
var type = Match(row1,row2);
switch(type)
{
//do something based on type
}
}
}
Я начал рассматривать потоковую передачу Hadoop как метод для выполнения этих сравнений как пакетного задания за короткое время.Тем не менее, я испытываю трудности с тем, чтобы разобраться с парадигмой сокращения карт для такого рода проблем.
В этот момент я довольно четко понимаю, как получить один входной сигнал от hadoop, обработатьданные с помощью функции отображения, а затем испустить результаты, чтобы уменьшить.Тем не менее, подход «вложенного цикла» сравнения двух наборов записей немного сбивает меня с толку.
Самое близкое к тому, что я прихожу к решению, заключается в том, что мне все равно придется сделать 10 миллионов записей.сравните параллельно по 200 миллионам записей, так что 200 миллионов / n узлов * 10 миллионов итераций на узел.Это самый эффективный способ сделать это?