пользовательский разделитель для отправки одного ключа на несколько редукторов?

Если у меня есть только один ключ. Могу ли я избежать его отправки только одному редюсеру (и распределить его по нескольким редьюсерам)?

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


person Gadam    schedule 13.11.2014    source источник
comment
Какой InputFormat ты используешь?   -  person blackSmith    schedule 14.11.2014


Ответы (1)


Я был в похожей ситуации один раз. Я сделал что-то вроде этого:

int numberOfReduceCalls = 5
IntWritable outKey = new IntWritable();
Random random = new Random();
public void map(LongWritable key, Text value, Context context)
                      throws IOException, InterruptedException {
    // use a random integer within a limit
    outKey.set( random.nextInt(numberOfReduceCalls) );  
    context.write(outKey, value);
}
person blackSmith    schedule 14.11.2014
comment
Извините, я не понял, что вы пытаетесь сделать здесь. Какова цель «outkey»? Вы не используете его после того, как установили его значение. И вы вроде все это делаете в самом маппере. Не могли бы вы объяснить? - person Gadam; 14.11.2014
comment
Это была ошибка, обновил оператор context.write, посмотрите. Вместо того, чтобы писать собственный разделитель, я случайным образом сгенерировал 5 ключей на карте, так что значения будут распределены по 5 различным вызовам сокращения. Если вы используете TextinputFormat, приведенного выше кода достаточно, чтобы выполнить работу. В reduce вы просто игнорируете ключ и обрабатываете только значения. - person blackSmith; 17.11.2014
comment
Таким образом, это в основном имитирует функциональность разделителя, фактически не используя его. И я предполагаю, что нам все еще нужен второй map-reduce, чтобы объединить выходные данные редуктора. Я добавлю +1 к этому и подожду, чтобы увидеть, есть ли какие-либо другие подходы. Спасибо! - person Gadam; 17.11.2014
comment
конечно, существуют и другие способы, но я просто воспользовался самой функцией map-reduce, а не вводил новый тип. Но вы не можете отрицать слияние в любом случае при использовании нескольких редьюсеров, это неизбежный компромисс. stackoverflow.com/questions/5700068/ - person blackSmith; 18.11.2014