Поскольку файл будет иметь n
входных данных, перестановки должны иметь n^2
выходных данных. Имеет смысл, что вы могли бы n
задач выполнить n
из этих операций. Я полагаю, что вы могли бы сделать это (если только для одного файла):
Поместите ваш входной файл в DistributedCache , чтобы он был доступен только для чтения вашим картостроителям / редукторам. Сделайте разделение ввода в каждой строке файла (как в WordCount). Таким образом, маппер получит одну строку (например, title1
в вашем примере). Затем прочитайте строки из файла в DistributedCache и создайте пары ключ / значение: с ключом в качестве ввода и значениями в качестве каждой строки из файла из DistributedCache.
В этой модели вам нужен только шаг Map.
Что-то вроде:
public static class PermuteMapper
extends Mapper<Object, Text, Text, Text>{
private static final IN_FILENAME="file.txt";
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
String inputLine = value.toString();
// set the property mapred.cache.files in your
// configuration for the file to be available
Path[] cachedPaths = DistributedCache.getLocalCacheArchives(conf);
if ( cachedPaths[0].getName().equals(IN_FILENAME) ) {
// function defined elsewhere
String[] cachedLines = getLinesFromPath(cachedPaths[0]);
for (String line : cachedLines)
context.emit(inputLine, line);
}
}
}