从servlet调用Map作业时出错

qc6wkl3g  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(358)

我是一个hadoop爱好者,还处于学习阶段,出于好奇我尝试了一些东西,我想做一个servlet调用hadoop的工作。我尝试了两种方法,但都失败了。等等,首先有人能告诉我这是否可行吗?如果是这样的话,请用一些实时的例子(不要告诉我色调),或者你可以简单地告诉我,我疯了,浪费我的时间。
好吧,如果你在读这篇文章,那我没疯。现在请看看我的代码,告诉我我做错了什么!!!

package com.testingservlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**

* Servlet implementation class HelloServlets
* /

  @WebServlet("/HelloServlets")
 public class HelloServlets extends HttpServlet {
     private static final long serialVersionUID = 1L;

     /**
     * @see HttpServlet#HttpServlet()
      */
   public HelloServlets() {
     super();
    // TODO Auto-generated constructor stub
    }

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // TODO Auto-generated method stub

    /*******************************************************************
     * *Approach 1
     * 
     *  Using the Hadoop code directly into servlets
    ******************************************************************
     */

    String localPath        = "/home/asadgenx/filelist.txt";
     FileSystem fs      =   FileSystem.get( new Configuration());
     Path workingDir    = fs.getWorkingDirectory();

     out.println("DestinationPath path:"+workingDir);

     Path hdfsDir           = new Path(workingDir+"/servelets");

     out.println("DestinationPath Directory:"+workingDir);

     fs.mkdirs(hdfsDir);

     out.println("Source path:"+localPath);

     Path localFile         = new Path(localPath);
     Path newHdfsFile   = new Path(hdfsDir+"/"+"ourTestFile1.txt");

     out.println("Destination File path:"+hdfsDir+"/"+"ourTestFile1.txt");

     fs.copyFromLocalFile(localFile, newHdfsFile);

        /*******************************************************************
         * *Approach 2
         * 
         *  Executing hadoop commands as string using runtime.exec() 
        ******************************************************************
         */

    String[] cmd = new String[] {"hadoop fs -copyFromLocal /home/asadgenx/filelist.txt /user/asad/myfile.txt"};
    Process process = Runtime.getRuntime().exec(cmd);

     out.println("File copied!!");
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
 }

}
方法一http状态500出错-mkdirs无法创建文件:/var/lib/tomcat7/servelets
方法2 http状态500出错-无法运行程序“hadoop fs-copyfromlocal/home/asadgenx/filelist.txt/user/asad/myfile.txt”:错误=2,没有这样的文件或目录
这里的hadoopMaven能帮我解决这个问题吗!!!

wnavrhmk

wnavrhmk1#

我希望回答你的问题还来得及。
首先,我将把问题的范围限定为从tomcatservlet访问hdfs文件系统,这正是您要做的。我遇到了很多陷阱,读了那么多论坛帖子来克服它,这更多的是你如何设置一切的问题。
要遵循方法2,您必须处理securitymanager,而且您不会这样做´我不喜欢那样做。
要遵循方法1,请查看此检查表:
使适当的jar文件可供您的webapp访问。我更喜欢在每个webapp中放置jar,而不是通过tomcat提供jar。无论如何,您的webapp应该可以访问以下jar文件列表(我没有命名jar版本,可能其中一些是多余的,我正在尝试从运行map reduce作业然后获得结果的项目中缩减列表):
hadoop通用
Guava
共享日志
公共cli
log4j
公地郎
共用配置
hadoop验证
slf4j-log4j型
slf4j接口
hadoop hdfs
java 协议
htrace核心
它们位于hadoop发行版的许多目录中
确保您的网络配置正常。测试hadoop服务是否已启动并正在运行,以及是否可以访问从tomcat服务器到hadoop服务器的所有必需的主机和端口配置。如果它们都位于同一台服务器上,那就更好了。尝试访问hdfs监视器(http://hadoop-host:50070)来自tomcat服务器的网页。
调整要读/写的文件的访问权限:
答。从您的webapp,您将只能访问位于webapp目录内的文件。
b。从hadoop,你的webapp将以用户“tomcat”的身份连接。确保用户tomcat具有读取或写入hadoop dfs中所需文件的权限。
正如angus假设的那样,您的配置对象将是空的。您需要在servlet中自己设置所需的配置参数。
一旦一切都设置好了,您就可以在servlet中运行如下内容:

//Set the root of the files I will work with in the local file system
String root = getServletContext().getRealPath("/") + "WEB-INF";

//Set the root of the files I will work with in Hadoop DFS
String hroot = "/home/tomcat/output/mrjob";

//Path to the files I will work with
String src = hroot + "/part-00000.avro";
String dest = root + "/classes/avro/result.avro";

//Open the HDFS file system
Configuration hdfsconf = new Configuration();

//Fake Address, replace with yours!
hdfsconf.set("fs.default.name", "hdfs://hadoop-host:54310");
hdfsconf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
hdfsconf.set("fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem");

FileSystem hdfs = FileSystem.get(hdfsconf);

//Copy the result to local
hdfs.copyToLocalFile(new Path(src), new Path(dest));

//Delete result
hdfs.delete(new Path(hroot), true);

//Close the file system handler
hdfs.close();

希望这有帮助!

相关问题