tomcat—在hadoop中实现作业结束通知侦听器

0yycz8jy  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(345)

我正在努力在工作完成后得到通知。我使用下面的链接作为参考。我不能让它工作。我在网上找不到很多东西。我使用tomcat作为一种建立通知点url的方法,在这里我使用servlet。
http://hadoopi.wordpress.com/2013/09/18/hadoop-get-a-callback-on-mapreduce-job-completion/
根据我的说法,这个servlet显然不应该工作,因为我不是直接从另一个页面调用它,我应该在那里提交参数。在这里,我需要一个侦听器来获取来自hadoop的调用,然后获取jobid和jobstatus,它们将被提交到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);
        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();
    }
}

感谢您的帮助。

p4rjhz4m

p4rjhz4m1#

这就是我最后让它工作的方法。我之前做的是一些愚蠢的事情,我试图呼应输出。这对我来说显然是错误的,但是当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();
    }
}

相关问题