Shell形式:
package com.spark.demo.sub.spark;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
/**
* 停止yarn任務
* @author duhai
* @date 2019年12月11日
*/
public class SparkShell {
private static final String USER = "root";
private static final String PASSWORD = "*******";
private static final String HOST = "10.168.11.11";
private static final int DEFAULT_SSH_PORT = 22;
public static void main(final String[] arg) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(USER, HOST, DEFAULT_SSH_PORT);
session.setPassword(PASSWORD);
session.setConfig("StrictHostKeyChecking", "no");// 第一次訪問服務器不用輸入yes
session.connect(30000); // making a connection with timeout.
Channel channel = (Channel) session.openChannel("shell");
channel.connect();
InputStream inputStream = channel.getInputStream();//從遠程端到達的所有數據都能從這個流中讀取到
OutputStream outputStream = channel.getOutputStream();//寫入該流的所有數據都將發送到遠程端。
//使用PrintWriter流的目的就是爲了使用println這個方法
//好處就是不需要每次手動給字符串加\n
PrintWriter printWriter = new PrintWriter(outputStream);
String yarnId = "application_1576031636631_0001";
String command = "yarn application -kill " + yarnId;
//command = "ls";
printWriter.println(command);
//加上個就是爲了,結束本次交互
printWriter.println("exit");
printWriter.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String msg = null;
while ((msg = in.readLine()) != null) {
System.out.println(msg);
}
in.close();
channel.disconnect();
session.disconnect();
} catch (Exception e) {
System.out.println(e);
}
}
}
Exec形式:
package com.spark.demo.sub.spark;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
/**
* 提交任務、查看yarn日誌
* @author duhai
* @date 2019年12月11日
*/
public class SparkExec {
private static Logger logger = Logger.getLogger(SparkExec.class);
private static final String USER = "root";
private static final String PASSWORD = "********";
private static final String HOST = "10.168.11.";
private static final int DEFAULT_SSH_PORT = 22;
public static void main(final String[] arg) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(USER, HOST, DEFAULT_SSH_PORT);
session.setPassword(PASSWORD);
session.setConfig("StrictHostKeyChecking", "no");// 第一次訪問服務器不用輸入yes
session.connect();
//提交任務 TODO
String command = "/usr/dh/spark/spark-2.3.4/bin/spark-submit --class wordcount.JavaWordCount --master yarn --deploy-mode cluster --driver-memory 1G --num-executors 3 --executor-memory 1G --executor-cores 1 hdfs://10.121.55.67:9000/dh/wordcount-two-1.0.0.jar";
//
command = "/usr/jdk1.8.0_121/bin/java -version";
//查看任務日誌 TODO
String yarnId = "application_1576031636631_0001";
String logCommand = "/usr/dh/hadoop2.8.2/bin/yarn logs -applicationId ";
command = logCommand + yarnId;
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect();
getIn(in, channel);
//getIn2(in, channel);
channel.disconnect();
session.disconnect();
} catch (Exception e) {
logger.info(e);
}
}
private static void getIn(final InputStream in, final Channel channel) throws IOException {
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) {
break;
}
logger.info(new String(tmp, 0, i));
}
if (channel.isClosed()) {
if (in.available() > 0) {
continue;
}
logger.info("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
}
private static String getIn2(final InputStream in, final Channel channel) throws IOException {
// 返回結果存在ExtInputStream中,所以需要合併兩個返回結果
BufferedReader input2 = new BufferedReader(new InputStreamReader(in));
// 接收遠程服務器執行命令的結果
String line;
String pattern = "Submitted application application_(.*)";
String appid = null;
Pattern p = Pattern.compile(pattern);
boolean isDealed = false;
while ((line = input2.readLine()) != null) {
Matcher m = p.matcher(line);
if (!isDealed && m.find()) {
// 這裏雖然拿到了Yarn Id,但是不能立即返回,因爲該通道還是處於暫用狀態,必須阻塞線程
appid = "application_" + m.group(1);
isDealed = true;
}
}
System.out.println("appid:" + appid);
return appid;
}
}