#hadoop #mapreduce #hdfs
#hadoop #mapreduce #hdfs
Вопрос:
Я пытаюсь выполнить задание Hadoop в удаленном кластере hadoop. Ниже приведен мой код.
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://server:9000/");
conf.set("hadoop.job.ugi", "username");
Job job = new Job(conf, "Percentil Ranking");
job.setJarByClass(PercentileDriver.class);
job.setMapperClass(PercentileMapper.class);
job.setReducerClass(PercentileReducer.class);
job.setMapOutputKeyClass(TestKey.class);
job.setMapOutputValueClass(TestData.class);
job.setOutputKeyClass(TestKey.class);
job.setOutputValueClass(BaselineData.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(inputPath));
FileOutputFormat.setOutputPath(job, new Path(outputPath));
job.waitForCompletion(true);
Когда задание начинает выполняться немедленно, исключение выдается еще до начала фазы отображения.
java.io.IOException: Filesystem closed
at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:226)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:617)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:453)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:192)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:142)
at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1216)
at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1197)
at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:92)
at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:373)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:800)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:432)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447)
Входной файл действительно существует и представляет собой текстовый файл, разделенный запятыми. Я могу выполнить задание в кластере hadoop, используя hadoop jar
команду с тем же вводом и выводом. Но я не могу запустить его удаленно. Я также могу выполнять другие задания удаленно.
Кто-нибудь может сказать мне, каково решение этой проблемы?
Ответ №1:
Кажется, conf.set("mapred.job.tracker", "server:9001");
проблема устранена. Спасибо за вашу помощь.
Ответ №2:
Вы делаете это:
conf.set("fs.default.name", "serverurl");
Итак, вы устанавливаете для файловой системы значение «serverurl»… что бессмысленно.
Я почти уверен, что это работает, когда вы просто удаляете эту строку из своего кода.
HTH
Комментарии:
1. Я не устанавливаю для него значение serverurl, я устанавливаю для него URL hdfs. например, hdfs://server: 9000 /. Извините за путаницу. Также обновлен вопрос.
2. Тем не менее; попробуйте удалить эту строку. Вы отправляете задание в кластер, и кластер должен знать, как получить доступ к файловой системе.
3. ДА. Но я выполняю в удаленном кластере. т.е. код выполнения задания не выполняется в кластере. Таким образом, задание должно знать местоположение кластера.
4. Вы отправляете задание в jobtracker кластера; jobtracker знает, где находится файловая система. Если это не работает таким образом, то, похоже, у вас неправильно настроенный кластер.
5. Подождите … вы действительно сказали «код выполнения задания не выполняется в кластере»… то есть … ОЧЕНЬ странно! Моя первая реакция: Получить хорошую книгу: basj.es/hadoop