java 远程提交MR jar包并获得application_id
来源:互联网 发布:nginx 允许目录浏览 编辑:程序博客网 时间:2024/05/22 02:23
2. java代码在windowns上通过ssh远程执行linux命令
pom.xml需要添加相关依赖
<dependency> <groupId>com.github.cverges.expect4j</groupId> <artifactId>expect4j</artifactId> <version>1.6</version></dependency>
测试类:
/** * @Title: 远程提交mapreduce jar包 * @Description: 远程提交mapreduce jar包,并将控制台输出重定向到一个临时文件里,访问该临时文件,得到applicationID。 */public class SubmitMRjar { public static void main(String[] args) { String[] cmd = {"nohup yarn jar /root/mrtest/hadoopTest.jar hdfs://10.2.**.**:8020/demo.txt hdfs://10.2.**.**:8020/outputsang 1>sangSSSS.txt"}; exec(cmd); String[] cmd1={"head -n 15 /root/sangSSSS.txt"}; exec(cmd1); } /** * 执行命令 * @param cmd */ public static void exec(String[] cmd){ ConnectLinux2Command shell = new ConnectLinux2Command("10.2.**.**", 22, "root", "******"); shell.executeCommands(cmd); if(cmd[0].startsWith("head")){ String str = shell.getResponse(); getAppid(str); } try { Thread.sleep(2000);//休眠2s后再关闭,防止没有提交完成就关闭SSH连接 } catch (InterruptedException e) { e.printStackTrace(); } shell.disconnect();//关闭SSH连接 } public static void getAppid(String response){ String[] info = response.split("\n"); for(String line : info){ if(line.contains("job: http://")){ String[] str = line.split("/"); System.out.println(str[str.length-2]); } } }}
工具类:
import java.util.ArrayList;import java.util.Hashtable;import java.util.List;import org.apache.log4j.Logger;import org.apache.oro.text.regex.MalformedPatternException;import com.jcraft.jsch.ChannelShell;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;import com.jcraft.jsch.UserInfo;import expect4j.Closure;import expect4j.Expect4j;import expect4j.ExpectState;import expect4j.matches.EofMatch;import expect4j.matches.Match;import expect4j.matches.RegExpMatch;import expect4j.matches.TimeoutMatch;public class ConnectLinux2Command { private static Logger log = Logger.getLogger(ConnectLinux2Command.class); private Session session; private ChannelShell channel; private static Expect4j expect = null; private static final long defaultTimeOut = 1000; private StringBuffer buffer=new StringBuffer(); public static final int COMMAND_EXECUTION_SUCCESS_OPCODE = -2; public static final String BACKSLASH_R = "\r"; public static final String BACKSLASH_N = "\n"; public static final String COLON_CHAR = ":"; public static String ENTER_CHARACTER = BACKSLASH_R; public static final int SSH_PORT = 22; //正则匹配,用于处理服务器返回的结果 public static String[] linuxPromptRegEx = new String[] { "~]#", "~#", "#",":~#", "/$", ">" }; public static String[] errorMsg=new String[]{"could not acquire the config lock "}; //ssh服务器的ip地址 private String ip; //ssh服务器的登入端口 private int port; //ssh服务器的登入用户名 private String user; //ssh服务器的登入密码 private String password; public ConnectLinux2Command(String ip,int port,String user,String password) { this.ip=ip; this.port=port; this.user=user; this.password=password; expect = getExpect(); } /** * 关闭SSH远程连接 */ public void disconnect(){ if(channel!=null){ channel.disconnect(); } if(session!=null){ session.disconnect(); } } /** * 获取服务器返回的信息 * @return 服务端的执行结果 */ public String getResponse(){ return buffer.toString(); } //获得Expect4j对象,该对用可以往SSH发送命令请求 private Expect4j getExpect() { try { log.debug(String.format("Start logging to %s@%s:%s",user,ip,port)); JSch jsch = new JSch(); session = jsch.getSession(user, ip, port); session.setPassword(password); Hashtable<String, String> config = new Hashtable<String, String>(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); localUserInfo ui = new localUserInfo(); session.setUserInfo(ui); session.connect(); channel = (ChannelShell) session.openChannel("shell"); Expect4j expect = new Expect4j(channel.getInputStream(), channel .getOutputStream()); channel.connect(); log.debug(String.format("Logging to %s@%s:%s successfully!",user,ip,port)); return expect; } catch (Exception ex) { log.error("Connect to "+ip+":"+port+"failed,please check your username and password!"); ex.printStackTrace(); } return null; } /** * 执行配置命令 * @param commands 要执行的命令,为字符数组 * @return 执行是否成功 */ public boolean executeCommands(String[] commands) { //如果expect返回为0,说明登入没有成功 if(expect==null){ return false; } log.debug("----------Running commands are listed as follows:----------"); for(String command:commands){ log.debug(command); } log.debug("----------End----------"); Closure closure = new Closure() { public void run(ExpectState expectState) throws Exception { buffer.append(expectState.getBuffer());// buffer is string // buffer for appending // output of executed // command expectState.exp_continue(); } }; List<Match> lstPattern = new ArrayList<Match>(); String[] regEx = linuxPromptRegEx; if (regEx != null && regEx.length > 0) { synchronized (regEx) { for (String regexElement : regEx) {// list of regx like, :>, /> // etc. it is possible // command prompts of your // remote machine try { RegExpMatch mat = new RegExpMatch(regexElement, closure); lstPattern.add(mat); } catch (MalformedPatternException e) { return false; } catch (Exception e) { return false; } } lstPattern.add(new EofMatch(new Closure() { // should cause // entire page to be // collected public void run(ExpectState state) { } })); lstPattern.add(new TimeoutMatch(defaultTimeOut, new Closure() { public void run(ExpectState state) { } })); } } try { boolean isSuccess = true; for (String strCmd : commands){ isSuccess = isSuccess(lstPattern, strCmd); } //防止最后一个命令执行不了 isSuccess = !checkResult(expect.expect(lstPattern)); //找不到错误信息标示成功 String response=buffer.toString().toLowerCase(); for(String msg:errorMsg){ if(response.indexOf(msg)>-1){ return false; } } return isSuccess; } catch (Exception ex) { ex.printStackTrace(); return false; } } //检查执行是否成功 private boolean isSuccess(List<Match> objPattern, String strCommandPattern) { try { boolean isFailed = checkResult(expect.expect(objPattern)); if (!isFailed) { expect.send(strCommandPattern); expect.send("\r"); return true; } return false; } catch (MalformedPatternException ex) { return false; } catch (Exception ex) { return false; } } //检查执行返回的状态 private boolean checkResult(int intRetVal) { if (intRetVal == COMMAND_EXECUTION_SUCCESS_OPCODE) { return true; } return false; } //登入SSH时的控制信息 //设置不提示输入密码、不显示登入信息等 public static class localUserInfo implements UserInfo { String passwd; public String getPassword() { return passwd; } public boolean promptYesNo(String str) { return true; } public String getPassphrase() { return null; } public boolean promptPassphrase(String message) { return true; } public boolean promptPassword(String message) { return true; } public void showMessage(String message) { } }}
0 0
- java 远程提交MR jar包并获得application_id
- java远程Debug Jar包
- 客户端用java api 远程操作HDFS以及远程提交MR任务(源码和异常处理)
- 客户端用java api 远程操作HDFS以及远程提交MR任务(源码和异常处理
- 客户端用java api 远程操作HDFS以及远程提交MR任务(源码和异常处理)
- java打jar包,并签名有感
- java生成jar压缩包并运行
- Java打jar包并运行实践
- java项目打成jar包,并执行
- java生成jar压缩包并运行
- 编译Java文件并生成jar包
- Oracle导入JAR包并调用Java
- storm提交jar包
- 【深入JAVA】打包项目为Jar包并运行jar
- maven将项目达成jar包并运行mvn package,java -jar 项目jar包
- 反编译apk获得jar包
- 用maven获得jar包
- Maven学习-项目打成jar包提交到远程仓库(nexus)
- Qt中rcc工具简介
- Android WebView shouldInterceptRequest 异步加载
- oracle按code编码长度查询代码展现层级关系(给字段前加空格)
- 关于spring3.0 后的 事务注解管理指定数据源问题
- Unsupported major.minor version 51.0
- java 远程提交MR jar包并获得application_id
- Mysql技术内幕基础部分
- SQL语句--like和正则表达式的使用
- java数据类型转换汇总
- C语言 ,有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用拆半查找法找出该数是数组中的第几个元素的值,如果该数不在数组中,则输出“无此数”
- Python爬虫urllib2笔记(三)之使用正则表达式提取百度贴吧网页中的楼主发的图片
- webgl 入门的简单小模型
- XML 基础
- hibernate返回非受管实体(Returning non-managed entities)