在Hadoop中实现作业结束通知侦听器

时间:2014-07-21 03:55:07

标签: tomcat servlets hadoop notifications listener

我正在尝试在作业完成后收到通知。我正在使用以下链接作为参考。我无法让它工作。我在互联网上找不到太多东西。我使用tomcat作为一种方法来建立一个通知URL的点我在哪里使用servlet。

http://hadoopi.wordpress.com/2013/09/18/hadoop-get-a-callback-on-mapreduce-job-completion/

这是根据我不应该工作的servlet显然是因为我没有直接从另一个我应该提交参数的页面调用它。在这里,我需要一个侦听器来从hadoop获取调用,然后获取将提交给servlet的jobId和jobStatus,但我不知道如何实现它。

import java.io.*;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Serv extends HttpServlet
{ 
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
    {
        String jobId=req.getParameter("jobId");
        String jobStatus=req.getParameter("jobStatus");
        res.setContentType("text/html");
        PrintWriter pw=res.getWriter();
        pw.println("JobId: \n"+jobId);
        pw.println("JobStatus: \n"+jobStatus);
        pw.close();
    }
    public void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
    {
        String jobId=req.getParameter("jobId");
        String jobStatus=req.getParameter("jobStatus");
        res.setContentType("text/html");
        PrintWriter pw=res.getWriter();
        pw.println("JobId: \n"+jobId);
        pw.println("JobStatus: \n"+jobStatus);
        pw.close();
    }
} 

这是我的Toolrunner运行功能中通知代码的一部分。

conf.set("job.end.notification.url", "http://localhost:8080/Serv?jobId=$jobId&jobStatus=$jobStatus");                                 
conf.setInt("job.end.retry.attempts", 3);
conf.setInt("job.end.retry.interval", 1000);

我认为可能还有很多工作要做。

我尝试使用php,并相应地更改代码。

修改 我得到了一些部分,我必须将输出记录在一个文件或其他地方,这样当调用Servlet时,它应该将输出记录到文件,即创建一个具有作业ID和作业状态的文件。所以我按如下方式更改了我的Servlet代码,但仍然没有创建文件。

import java.io.*;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Serv extends HttpServlet
{ 
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
    {
        String jobId=req.getParameter("jobId");
        String jobStatus=req.getParameter("jobStatus");
        res.setContentType("text/html");
        PrintWriter pw=res.getWriter();
        pw.println("JobId: \n"+jobId);
        pw.println("JobStatus: \n"+jobStatus);
        PrintWriter writer = new PrintWriter("log.txt", "UTF-8");
        writer.println("Job ID : "+jobId);
        writer.println("Job Status : "+jobStatus);
        writer.close();
        pw.close();

    }
    public void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
    {
        String jobId=req.getParameter("jobId");
        String jobStatus=req.getParameter("jobStatus");
        res.setContentType("text/html");
        PrintWriter pw=res.getWriter();
        pw.println("JobId: \n"+jobId);
        pw.println("JobStatus: \n"+jobStatus);
        PrintWriter writer = new PrintWriter("log.txt", "UTF-8");
        writer.println("Job ID : "+jobId);
        writer.println("Job Status : "+jobStatus);
        writer.close();
        pw.close();
    }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这是我最终为了让它发挥作用而做的事情。 我之前做的是一些愚蠢的事情,我试图回应输出。这显然对我来说是错误的,但它并没有点击我,我必须在调用Servlet时将输出记录到某处,所以我将输出写入一个有效的文件。

String path = getServletContext().getRealPath("/");在此非常重要,因为它设置了根目录的路径,否则它会拒绝写入日志文件的权限。

import java.io.*;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Serv extends HttpServlet
{ 
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
    {
        String jobId=req.getParameter("jobId");
        String jobStatus=req.getParameter("jobStatus");
        res.setContentType("text/html");
        PrintWriter pw=res.getWriter();
        pw.println("JobId: \n"+jobId);
        pw.println("JobStatus: \n"+jobStatus);
        String path = getServletContext().getRealPath("/");
        PrintWriter writer = new PrintWriter(path+"log.txt", "UTF-8");
        writer.println("Job ID : "+jobId);
        writer.println("Job Status : "+jobStatus);
        writer.close();
        pw.close();

    }
    public void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
    {
        String jobId=req.getParameter("jobId");
        String jobStatus=req.getParameter("jobStatus");
        res.setContentType("text/html");
        PrintWriter pw=res.getWriter();
        pw.println("JobId: \n"+jobId);
        pw.println("JobStatus: \n"+jobStatus);
        String path = getServletContext().getRealPath("/");
        PrintWriter writer = new PrintWriter(path+"log.txt", "UTF-8");
        writer.println("Job ID : "+jobId);
        writer.println("Job Status : "+jobStatus);
        writer.close();
        pw.close();
    }
}