Мой рабочий процесс выглядит следующим образом:
Я обрабатываю огромное количество данных. У меня есть MapFile
, который нужно кэшировать. Размер этого файла сейчас составляет 1 ГБ, но я ожидаю, что со временем он вырастет.
Содержимое MapFile будет примерно таким:
12345,45464 192.34.23.1
33214,45321 123.45.32.1
- В
map-phase
я обрабатываю каждую запись из входных файлов, которые находятся вTextInputFormat
. Я разбираю строку (разделенную на токены) и получаю первые два токена, token1 и token2.
Если пары (токен1, токен2) нет в кешированном файле, я делаю вызов API, получаю информацию, сохраняюсь в кеше (если возможно) и продолжаю обработку.
private Parser parser = new customParser();
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
parser.parse(value);
Pair pair = new Pair();
pair.setFirst(parser.getFirst());
pair.setSecond(parser.getSecond());
IP ip = null;
//here is the catch
//check if pair exists in cache
if cache.contains(pair){
ip=cache.get(pair);
}
else {
ip=getFromAPI(pair);//This does API call outside network.
cache.put(pair,ip);
}
context.write(pair,ip);
}
}
Основные проблемы, которые я вижу здесь, это
Как получить большой файл в кеше на всех узлах. DistributedCache работает, копируя файлы на локальные узлы. но поскольку этот файл больше, здесь задействован сетевой трафик, и для моих рутинных работ я не хочу продолжать его распространять.
Как эффективно искать MapFile (кеш), весь mapFile не будет в памяти.
Как написать в этот MapFile, который является моим Cache.
Спасибо