2014-11-01 4 views
0

У меня возникают проблемы с запуском задания Hadoop, получая исключение FileNotFoundException при попытке извлечь файл из распределенного кэша, даже несмотря на то, что файл существует. Когда я запускаю его в локальной файловой системе, он работает.FileNotFoundExcepton при чтении файла из распределенного кеша Hadoop

Кластер размещен на веб-сервисах Amazon, используя Hadoop версии 1.0.4 и Java версии 1.7. У меня нет никакого контроля над кластером или как он настроен.

В основной функции я добавляю файл в распределенный кеш. Кажется, это работает нормально. Я думаю, по крайней мере, это не исключение.

.... 
JobConf conf = new JobConf(Driver.class); 
conf.setJobName("mean"); 
conf.set("lookupfile", args[2]); 
Job job = new Job(conf); 
DistributedCache.addCacheFile(new Path(args[2]).toUri(), conf); 
... 

В функции настройки вызывается перед тем карте создать путь к файлу, и вызвать функцию, которая загружает файл в хэш-карте.

Configuration conf = context.getConfiguration(); 
String inputPath = conf.get("lookupfile");       
Path dataFile = new Path(inputPath); 
loadHashMap(dataFile, context); 

Исключение происходит в первой строке функции, которая загружает карту хеша.

brReader = new BufferedReader(new FileReader(filePath.toString())); 

Я начинаю работу так.

hadoop jar Driver.jar Driver /tmp/input output /tmp/DATA.csv 

Я получаю следующую ошибку

Error: Found class org.apache.hadoop.mapreduce.Counter, but interface was expected 
attempt_201410300715_0018_m_000000_0: java.io.FileNotFoundException: /tmp/DATA.csv (No such file or directory) 
attempt_201410300715_0018_m_000000_0: at java.io.FileInputStream.open(Native Method) 
attempt_201410300715_0018_m_000000_0: at java.io.FileInputStream.<init>(FileInputStream.java:146) 
attempt_201410300715_0018_m_000000_0: at java.io.FileInputStream.<init>(FileInputStream.java:101) 
attempt_201410300715_0018_m_000000_0: at java.io.FileReader.<init>(FileReader.java:58) 
attempt_201410300715_0018_m_000000_0: at Map.loadHashMap(Map.java:49) 
attempt_201410300715_0018_m_000000_0: at Map.setup(Map.java:98) 
attempt_201410300715_0018_m_000000_0: at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) 
attempt_201410300715_0018_m_000000_0: at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:771) 
attempt_201410300715_0018_m_000000_0: at org.apache.hadoop.mapred.MapTask.run(MapTask.java:375) 
attempt_201410300715_0018_m_000000_0: at org.apache.hadoop.mapred.Child$4.run(Child.java:259) 
attempt_201410300715_0018_m_000000_0: at java.security.AccessController.doPrivileged(Native Method) 
attempt_201410300715_0018_m_000000_0: at javax.security.auth.Subject.doAs(Subject.java:415) 
attempt_201410300715_0018_m_000000_0: at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1140) 
attempt_201410300715_0018_m_000000_0: at org.apache.hadoop.mapred.Child.main(Child.java:253) 
14/11/01 02:12:49 INFO mapred.JobClient: Task Id : attempt_201410300715_0018_m_000001_0, Status : FAILED 

Я подтвердил, что файл существует, как в HDFS и в локальной файловой системе.

[email protected]:~$ hadoop fs -ls /tmp 
Found 2 items 
drwxr-xr-x - hadoop supergroup   0 2014-10-30 11:19 /tmp/input 
-rw-r--r-- 1 hadoop supergroup  428796 2014-10-30 11:19 /tmp/DATA.csv 

[email protected]:~$ ls -al /tmp/ 
-rw-r--r-- 1 hadoop hadoop 428796 Oct 30 11:30 DATA.csv 

Я честно не понимаю, что здесь не так. Исключение указывает правильный путь для файла. Я проверил, что файл существует как на HDFS, так и на локальной файловой системе. Что-то мне здесь не хватает?

ответ

0

Вход в буфер BufferReader должен поступать из пути, возвращаемого DistributedCache.getLocalCacheFiles() в Setup(). Больше похоже ..

Path[] localFiles = DistributedCache.getLocalCacheFiles(); 
if (localFiles.length > 0){ 
    brReader = new BufferedReader(new FileReader(localFiles[0].toString());  
} 
0

я столкнулся с такой же вопрос и ниже код работает для меня:

Configuration conf = context.getConfiguration(); 
URI[] uriList = DistributedCache.getCacheFiles(conf); 
BufferedReader br = new BufferedReader(new FileReader(uriList[0].getPath())) 

Как вы можете видеть, я использую метод getCacheFiles здесь, то выборка путь к файлу и чтение файла.

Смежные вопросы