jsch教程(用java ssh 操作spark yarn任務)

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;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章