Каков наилучший способ получить распределенные кэшированные данные?Лучший способ получить небольшой файл поиска с использованием распределенного кэша
public class TrailMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
ArrayList<String> globalFreq = new ArrayList<String>();
public void setup(Context context) throws IOException{
Configuration conf = context.getConfiguration();
FileSystem fs = FileSystem.get(conf);
URI[] cacheFiles = DistributedCache.getCacheFiles(conf);
Path getPath = new Path(cacheFiles[0].getPath());
BufferedReader bf = new BufferedReader(new InputStreamReader(fs.open(getPath)));
String setupData = null;
while ((setupData = bf.readLine()) != null) {
String [] parts = setupData.split(" ");
globalFreq.add(parts[0]);
}
}
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
//Accessing "globalFreq" data .and do further processing
}
ИЛИ
public class TrailMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
URI[] cacheFiles
public void setup(Context context) throws IOException{
Configuration conf = context.getConfiguration();
FileSystem fs = FileSystem.get(conf);
cacheFiles = DistributedCache.getCacheFiles(conf);
}
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
ArrayList<String> globalFreq = new ArrayList<String>();
Path getPath = new Path(cacheFiles[0].getPath());
BufferedReader bf = new BufferedReader(new InputStreamReader(fs.open(getPath)));
String setupData = null;
while ((setupData = bf.readLine()) != null) {
String [] parts = setupData.split(" ");
globalFreq.add(parts[0]);
}
}
Так что, если мы делаем, как (код 2) это означает Say we have 5 map task every map task reads the same copy of the data
. при написании, как это для каждой карты, задача читает данные несколько раз вправо (5 раз)?
код 1: как указано в настройке, он считывается один раз, а глобальные данные доступны на карте.
Каков правильный способ написания распределенного кеша.
Так что лучше пойти с кодом 1 Am i right? Второй - прямой путь? Поскольку в документе Distributed cache говорится, что «каждый узел будет иметь доступ к сканированной копии данных» https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html –
Я бы определенно пошел с первым вариантом: вы не можете избежать того факта, что каждая задача должна анализировать содержимое кеша один раз, но как только это будет сделано, вы можете не делать этого снова для каждой записи. – davek
Что произойдет, если размер данных кеша слишком велик. Это невозможно сохранить в списке или каким-либо другим способом. Может возникнуть ситуация, когда нам нужно получить большие данные. Например: (Если я не ошибаюсь, Pls исправить меня, если я ошибаюсь) алгоритм KNN. Его модель - это те же входные данные. При прогнозировании нам нужно получить данные модели в руке для этой ситуации, мы не можем полагаться на код 1, так как это может занять место кучи –