设为首页 收藏本站
查看: 943|回复: 0

[经验分享] 自己编写接口用于获取Hadoop Job conf 信息

[复制链接]

尚未签到

发表于 2016-12-11 07:18:42 | 显示全部楼层 |阅读模式
  Hadoop Job完成后可以设置回调接口,一个自定义的URL,比如我的:
  


http://x.x.x.x/log/notify/stat_job/{jobId}/{jobStatus}
  之后我在Servlet中可以拿到jobId,通过jobId,就可以拿到Job对象(RunningJob),代码如下:
  


public static RunningJob getJobById(String jobId) {
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", Constants.MAP_REDUCE_URL);
JobClient client;
try {
client = new JobClient(new JobConf(conf));
return client.getJob(jobId);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
   关键是这个RunningJob对象只可以获取jobname信息,但是无法获取我们设置的conf信息。为了解决这个问题,我写了一个jsp,放到namenode上,用于读取本地log文件,并将结果反馈给调用者。代码如下,希望对大家有帮助:
  


<%@ page
contentType="text/xml; charset=UTF-8"
import="javax.servlet.*"
import="javax.servlet.http.*"
import="java.io.*"
import="java.net.URL"
import="org.apache.hadoop.util.*"
import="javax.servlet.jsp.JspWriter"
%><%!
private static final long serialVersionUID = 1L;
public File getHistoryFile(final String jobId) {
File dir = new File("/opt/hadoop/logs/history/done/");
File[] files = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
if (name.indexOf(jobId) >= 0 && name.endsWith(".xml")) {
return true;
}
return false;
}
});
if (files != null && files.length > 0) {
return files[0];
}
return null;
}
public void printXML(JspWriter out, String jobId) throws IOException {
FileInputStream jobFile = null;
String[] outputKeys = { "db_id", "channel_id", "channel_name", "user_id", "user_name", "job_day", "pub_format_type", "mapred.output.dir" };
String line = "";
try {
jobFile = new FileInputStream(getLogFilePath(jobId));
BufferedReader reader = new BufferedReader(new InputStreamReader(jobFile));
while ((line = reader.readLine()) != null) {
for (String key : outputKeys) {
if (!line.startsWith("<property>") || line.indexOf("<name>" + key + "</name>") >= 0) {
out.println(line);
break;
}
}
}
} catch (Exception e) {
out.println("Failed to retreive job configuration for job '" + jobId + "!");
out.println(e);
} finally {
if (jobFile != null) {
try {
jobFile.close();
} catch (IOException e) {
}
}
}
}
private File getLogFilePath(String jobId) {
String logDir = System.getProperty("hadoop.log.dir");
if (logDir == null || logDir.length() == 0) {
logDir = "/opt/hadoop/logs/";
}
File logFile = new File(logDir + File.separator + jobId + "_conf.xml");
return logFile.exists() ? logFile : getHistoryFile(jobId);
}
%><%
response.setContentType("text/xml");
final String jobId = request.getParameter("jobid");
if (jobId == null) {
out.println("<h2>Missing 'jobid' for fetching job configuration!</h2>");
return;
}
printXML(out, jobId);
%>

   这里有个要点,运行中和刚完成的job xml文件放到了"/opt/hadoop/logs"下,归档的job xml放到了“/opt/hadoop/logs/history/done/”,所以要判断第一个地方找不到文件,去第二个地方找。
  功能很简单,但是很有用。
  --heipark

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312458-1-1.html 上篇帖子: 使用pdsh在集群执行命令(hadoop适用) 下篇帖子: 搬迁vm导致hadoop namenode启动失败的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表