2016-09-18 11 views
1

Я использовал нижеприведенный код для распределенного кэширования в основном классе.Исключение Geting при использовании DistributedCache в Hadoop

job.addCacheFile(new URI(args[2])); 

Ниже упомянутый код относится к классу уменьшения.

@Override 
     protected void setup(Reducer<LongWritable, Text, Text, Text>.Context context) throws IOException, InterruptedException { 
      super.setup(context); 
      URI[] paths = context.getCacheFiles(); 
      if (paths.length > 0) { 
       loadDeliveryStatusCodes(paths[0].toString()); 
      } 
     } 
     private void loadDeliveryStatusCodes(String file) { 
      String strRead; 
      BufferedReader reader = null; 
      try { 
       reader = new BufferedReader(new FileReader("./some")); 
       while ((strRead = reader.readLine()) != null) { 
        String splitarray[] = strRead.split(","); 
        deliveryCodesMap.put(splitarray[0].trim(), splitarray[1].trim()); 
       } 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

Я получаю приведенное ниже исключение.

@@@@@@@@/user/DeliveryStatusCodes.txt 1 
java.io.FileNotFoundException: ./some (No such file or directory) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(FileInputStream.java:195) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at java.io.FileInputStream.<init>(FileInputStream.java:93) 
    at java.io.FileReader.<init>(FileReader.java:58) 
    at com.hadoop.intellipaat.UserSMSDeliveryJob$USERNameSMSStatusCodeMapper.loadDeliveryStatusCodes(UserSMSDeliveryJob.java:95) 

Ваша помощь спасет мой день. Спасибо.

+0

Что такое 'арг [2]'? –

+0

Это расположение файла txt в каталоге hadoop, который я хочу использовать в качестве кеша. например. /user/DeliveryStatusCodes.txt – cody123

ответ

1

Похоже, вы пропустили #some с конца вашего args[2] .На данный момент у вас есть /user/DeliveryStatusCodes.txt, но вы должны иметь

/user/DeliveryStatusCodes.txt#some 

Без него FileReader буквально ищет ./some, который, конечно, не будет.

Или вы можете пропустить псевдоним (это необязательно) и написать

new FileReader("/user/DeliveryStatusCodes.txt") 
+0

Спасибо, Бен. Я пробовал это раньше, но как-то он не работал в то время, теперь он работает. Я также сталкиваюсь с проблемой с редуктором. Он не объединяет выходные данные. https://github.com/ragnar-lothbrok/hadoop-demo/blob/master/src/main/java/com/hadoop/intellipaat/UserSMSDeliveryJob.java В редукторе [ключ, [value1, значение1]] [key, [valeu2, value2]], но он должен быть таким [key, [value1, value2]]. Не могли бы вы мне помочь. – cody123

+0

Вы уверены, что Reducer запущен? Вы видите ваш sysout? –

+0

Да, я тоже отлаживал и использовал sysout. Контроль идет туда. 123 456 ######## [пользователь-SMS ~ 001, пользователь-SMS ~ 001] 456 123 ######## [пользователь ~ Том, Том пользователь ~] 789 123 ######## [user-sms ~ 003, user-sms ~ 003] – cody123