2014-09-10 2 views
0

Каков наилучший способ получить распределенные кэшированные данные?Лучший способ получить небольшой файл поиска с использованием распределенного кэша

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: как указано в настройке, он считывается один раз, а глобальные данные доступны на карте.

Каков правильный способ написания распределенного кеша.

ответ

0

Сделайте столько, сколько вы можете в методе setup: это будет вызываться один раз каждым устройством, но затем будет кэшироваться для каждой записи, которая передается преобразователю. Анализ ваших данных для каждой записи - это накладные расходы, которых можно избежать, поскольку нет ничего, что зависит от key, value и context переменных, которые вы получаете в методе map.

setup метод будет вызываться на карте задача, но map будет вызываться для каждого записи обрабатываются этой задачи (которая может быть явно очень большое число).

+0

Так что лучше пойти с кодом 1 Am i right? Второй - прямой путь? Поскольку в документе Distributed cache говорится, что «каждый узел будет иметь доступ к сканированной копии данных» https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html –

+0

Я бы определенно пошел с первым вариантом: вы не можете избежать того факта, что каждая задача должна анализировать содержимое кеша один раз, но как только это будет сделано, вы можете не делать этого снова для каждой записи. – davek

+0

Что произойдет, если размер данных кеша слишком велик. Это невозможно сохранить в списке или каким-либо другим способом. Может возникнуть ситуация, когда нам нужно получить большие данные. Например: (Если я не ошибаюсь, Pls исправить меня, если я ошибаюсь) алгоритм KNN. Его модель - это те же входные данные. При прогнозировании нам нужно получить данные модели в руке для этой ситуации, мы не можем полагаться на код 1, так как это может занять место кучи –