【问题标题】:Exception while executing hadoop job remotely远程执行hadoop作业时出现异常
【发布时间】:2011-04-28 08:03:41
【问题描述】:

我正在尝试在远程 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 jar 命令在hadoop 集群上执行该作业。但我无法远程运行它。我还可以远程运行其他作业。

谁能告诉我这个问题的解决方法是什么?

【问题讨论】:

    标签: hadoop mapreduce hdfs


    【解决方案1】:

    看来conf.set("mapred.job.tracker", "server:9001"); 解决了这个问题。感谢您的帮助。

    【讨论】:

      【解决方案2】:

      你这样做:

      conf.set("fs.default.name", "serverurl");
      

      所以你将文件系统设置为值“serverurl”......这是没有意义的。

      我很确定当您从代码中删除该行时它会起作用。

      HTH

      【讨论】:

      • 我没有将其设置为 serverurl,我将其设置为 hdfs url。例如hdfs://服务器:9000/。对困惑感到抱歉。也更新了问题。
      • 静止;尝试删除该行。您将作业提交到集群,集群应该知道如何访问文件系统。
      • 是的。但我正在远程集群上执行。即作业执行代码不在集群上运行。所以作业应该知道集群的位置。
      • 你将job提交到集群的jobtracker; jobtracker 知道文件系统在哪里。如果它不能那样工作,那么您似乎有一个配置错误的集群。
      • 等等……你真的说“作业执行代码不在集群上运行”……那是……很奇怪!我的第一反应:买一本好书:basj.es/hadoop
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2014-05-10
      • 2013-11-07
      • 1970-01-01
      • 2012-03-28
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多