根据网上的材料,我配置了2个节点的hadoop集群,本机作为master,另外一个机器作为slave。我把统计文本的例子中提供的源代码进行了打包(jar),通过命令hadoop jar wordcount.jar test-in test-out,能够以集群的形式运行统计文本的例子。
接下来,我创建了一个Java Web Project,新建一个servlet,将统计文本例子源码中main()方法的代码复制到了Servlet的doPost()方法中
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Configuration conf = new Configuration();
Job job = new Job(conf, "word count");
job.setJarByClass(RunServlet.class);
job.setMapperClass(WordcountMap.class);
job.setCombinerClass(WordcountReduce.class);
job.setReducerClass(WordcountReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path("hdfs://master:54310/test-in"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://master:54310/test-out"));
try {
// System.exit(job.waitForCompletion(true) ? 0 : 1);
job.waitForCompletion(true);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//自己定义的一个类,用来放结果的
ValuesAndKeys vak = WordcountHash.getInstance().get("wordcount");
req.setAttribute("vak", vak);
RequestDispatcher dispatch = req.getRequestDispatcher("result.jsp");
dispatch.forward(req, resp);
}
并将HDFS的路径作为文本的输入和输出路径。(我要做的就是:当一个请求高手来了之后,servlet去调用集群,让集群完成文本统计,最后将结果返回到一张JSP中)
接下来,我用命令start-all.sh开启了集群,通过jps能够确认各个节点工作正常。
然后我通过浏览器访问了Servlet,并且结果也确实返回给了JSP页面,但是我发现这个并没有以集群的形式来完成,而仅仅是本机上运行了简单的java类来完成的(因为在Hadoop Administration的页面中并没有提示有新的工作和已经完成的工作)。
请问有人知道是为啥吗吗? |
|