在HTTP servlet中使用时,使用Hadoop 2.5.1获取此异常
java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.hdfs.DistributedFileSystem not a subtype
可以在这些jar中找到DistributedFileSystem类
hadoop-core-1.2.1.jar
hadoop-hdfs-2.5.1.jar
当我单独使用hadoop-core-1.2.1.jar时,我得到的编译错误是找不到hdfs模式。
java.io.IOException: No FileSystem for scheme: hdfs
当我使用两个罐子时,我得到了上述错误。
servlet中的代码:
Configuration conf = new Configuration();
try {
System.out.println("keyword=" + keyWord);
conf.set("keyword", keyWord);
conf.set("fs.hdfs.impl",
org.apache.hadoop.fs.hdfs.DistributedFileSystem.class.getName()
);
Job job = Job.getInstance();
job.setJarByClass(HadoopServlet.class);
job.setJobName("Tomcat Log Error");
FileInputFormat.addInputPath(job, new Path("hdfs://master:54310/keyword/pg20417.txt"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://master:54310/tmp/output" + uuid));
job.setMapperClass(TomcatLogErrorMapper.class);
job.setReducerClass(TomcatLogErrorReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
感谢任何帮助。
找到这个帖子
A Servlet Container on top of Hadoop?
看起来无法使用servlet来运行hadoop作业。
答案 0 :(得分:0)
因为hdfs架构已在hadoop-hdfs.jar中注册,所以你不能单独使用hadoop-core.jar。
看起来你正在运行的servlet线程的上下文类加载器无法加载org.apache.hadoop.hdfs.DistributedFileSystem,你可以试试这个:
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());