У меня возникают проблемы с запуском задания 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, так и на локальной файловой системе. Что-то мне здесь не хватает?