`
luoshi0801
  • 浏览: 147630 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hadoop如何封装shell脚本

 
阅读更多
package com.taobao.hsf.tlog.config.shell;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

abstract class Shell {

	public static class ShellCommandExecutor extends Shell {

		private final String[] command;
		private StringBuffer output;

		public ShellCommandExecutor(String[] execString) {
			command = execString.clone();
		}

		public ShellCommandExecutor(String[] execString, File dir) {
			this(execString);
			this.setWorkingDirectory(dir);
		}

		public ShellCommandExecutor(String[] execString, File dir, Map<String, String> env) {
			this(execString, dir);
			this.setEnvironment(env);
		}

		public void execute() throws IOException {
			this.run();
		}

		public String getOutput() {
			return (output == null) ? "" : output.toString();
		}

		@Override
		protected String[] getExecString() {
			return command;
		}

		@Override
		protected void parseExecResult(BufferedReader lines) throws IOException {
			output = new StringBuffer();
			char[] buf = new char[512];
			int nRead;
			while ((nRead = lines.read(buf, 0, buf.length)) > 0) {
				output.append(buf, 0, nRead);
			}
		}
	}

	static class ExitCodeException extends IOException {

		private static final long serialVersionUID = -7102633161419484030L;

		int exitCode;

		public ExitCodeException(int exitCode, String message) {
			super(message);
			this.exitCode = exitCode;
		}

		public int getExitCode() {
			return exitCode;
		}
	}

	private static final Logger logger = LoggerFactory.getLogger(Shell.class);
	public static final boolean WINDOWS = System.getProperty("os.name").startsWith("Windows");

	public static String execCommand(Map<String, String> env, String... cmd) throws IOException {
		ShellCommandExecutor exec = new ShellCommandExecutor(cmd);
		if (env != null) {
			exec.setEnvironment(env);
		}
		exec.execute();
		return exec.getOutput();
	}

	public static String execCommand(String... cmd) throws IOException {
		return execCommand(null, cmd);
	}

	private Map<String, String> environment;

	private File dir;

	private Process process;

	private int exitCode;

	public int getExitCode() {
		return exitCode;
	}

	public Process getProcess() {
		return process;
	}

	protected abstract String[] getExecString();

	protected abstract void parseExecResult(BufferedReader lines) throws IOException;

	protected void run() throws IOException {
		exitCode = 0; //reset
		runCommand();
	}

	protected void setEnvironment(Map<String, String> env) {
		this.environment = env;
	}

	protected void setWorkingDirectory(File dir) {
		this.dir = dir;
	}

	private void runCommand() throws IOException {
		ProcessBuilder builder = new ProcessBuilder(getExecString());
		boolean completed = false;

		if (environment != null) {
			builder.environment().putAll(this.environment);
		}
		if (dir != null) {
			builder.directory(this.dir);
		}

		process = builder.start();
		final BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
		BufferedReader inReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
		final StringBuffer errMsg = new StringBuffer();

		Thread errThread = new Thread() {
			@Override
			public void run() {
				try {
					String line = errReader.readLine();
					while ((line != null) && !isInterrupted()) {
						errMsg.append(line);
						errMsg.append(System.getProperty("line.separator"));
						line = errReader.readLine();
					}
				} catch (IOException ioe) {
					logger.warn("Error reading the error stream", ioe);
				}
			}
		};
		try {
			errThread.start();
		} catch (IllegalStateException ise) {
		}
		try {
			parseExecResult(inReader);
			exitCode = process.waitFor();
			try {
				errThread.join();
			} catch (InterruptedException ie) {
				logger.warn("Interrupted while reading the error stream", ie);
			}
			completed = true;
			if (exitCode != 0) {
				throw new ExitCodeException(exitCode, errMsg.toString());
			}
		} catch (InterruptedException ie) {
			throw new IOException(ie.toString());
		} finally {
			try {
				inReader.close();
			} catch (IOException ioe) {
				logger.warn("Error while closing the input stream", ioe);
			}
			if (!completed) {
				errThread.interrupt();
			}
			try {
				errReader.close();
			} catch (IOException ioe) {
				logger.warn("Error while closing the error stream", ioe);
			}
			process.destroy();
		}
	}
}

/*
 * 使用Shell封装
 */
public class StormScheduler {

	private final static File workDir = new File("/home/admin");

	public static void main(String[] args) {
		schedule("tlog");
	}

	public static void schedule(String appName) {
		System.out.println("Start to execute schedule shell: '/bin/bash storm_scheduler.sh " + appName + "'");
		Shell.ShellCommandExecutor executor = new Shell.ShellCommandExecutor(new String[] { "/bin/bash",
				"storm_scheduler.sh", appName }, workDir);
		try {
			executor.execute();
		} catch (IOException e) {
			System.out.println("Shell Exception, " + e);
			throw new RuntimeException("StormScheduler error, appName= " + appName, e);
		}
		System.out.println("Shell output: " + executor.getOutput());
	}

}

 

分享到:
评论

相关推荐

    hadoop 部分 shell 脚本

    在Hadoop生态系统中,Shell脚本扮演着至关重要的角色,特别是在大数据处理和集群管理中。这些脚本通常用于自动化任务,如数据迁移、作业调度、集群监控等。下面我们将深入探讨Hadoop Shell脚本的相关知识点。 一、...

    shell脚本配置Hadoop伪分布式.zip

    在这个"shell脚本配置Hadoop伪分布式.zip"压缩包中,包含了配置Hadoop伪分布式环境所需的所有资源和指南。伪分布式模式是在单个节点上模拟分布式环境,这对于学习和测试Hadoop功能非常有用,无需复杂的多节点集群...

    hadoop环境部署自动化shell脚本(伪分布式、完全分布式集群搭建).docx

    【Hadoop环境部署自动化Shell脚本】是一种高效的方法,用于快速搭建Hadoop集群,无论是用于学习还是开发。本文档提供了一个详细的脚本,涵盖了从Java环境配置到Hadoop集群的完全分布式安装的所有步骤,旨在降低...

    hadoop集群关机重启shell脚本

    hadoop集群关机重启shell脚本

    傻瓜式Hadoop集群配置脚本

    利用shell脚本 对Hadoop环境进行傻瓜式配置 先解压! 环节包括: 1.修改hostname 2.修改hosts 3.配置免密 4.Hadoop配置文件的更改 !!!!!!!!!!!!!!!!!!!! ps 请特别注意以下几个问题: 1....

    shell脚本-大数据

    Hadoop的MapReduce模型和Spark的DataFrame API可以通过shell脚本调用,实现分布式计算任务的提交。例如,通过`hadoop jar`命令运行MapReduce作业,或者用`spark-submit`启动Spark应用,这样可以利用shell脚本实现...

    Hadoop高可用自动化安装使用Shell脚本

    本文将详细探讨如何通过Shell脚本来实现Hadoop的高可用自动化安装。 首先,我们要理解Hadoop高可用性(HA)的基本概念。Hadoop HA主要涉及到NameNode的HA,即通过部署多个NameNode实例,其中一个作为主NameNode...

    hadoop shell操作与程式开发

    3. **Hadoop Shell脚本**:通过编写bash脚本,可以自动化执行一系列HDFS操作,提高工作效率。 4. **MapReduce编程**:理解MapReduce的工作原理,包括Mapper和Reducer阶段,以及Combiner和Partitioner的角色。学习...

    shell脚本完成hadoop的集群安装

    #shell脚本完成hadoop的集群安装 #步骤: #1.安装虚拟机,关闭防火墙、selinux #2.ssh免密码,编辑hosts文件 #3.安装JDK #4.安装hadoop #5.修改配置文件 #6.分发hadoop程序到各个节点 #7.启动集群

    hadoop-shell(第四章)-带书签高清pdf文字版

    5. **Hadoop Shell脚本编写** - 如何编写使用Hadoop命令的bash脚本,以实现自动化数据处理任务,如批量处理文件、数据清洗等。 - `for`循环和条件判断在Shell脚本中的应用,以及如何结合其他Unix工具如`awk`、`sed...

    基于Hadoop的ETL处理Shell架构

    在Hadoop的ETL流程中,Shell脚本可以用于完成数据的预处理、清洗、转换等任务。例如,Bash Shell环境下的脚本可以使用grep、awk、sed等工具进行数据过滤、格式化和修改,或者调用Hadoop的命令行工具如hadoop fs、...

    基于Hadoop的ETL处理Shell架构5

    本篇将详细介绍如何利用Shell脚本在Hadoop环境中实现ETL过程。 1. **Hadoop基础** Hadoop是Apache软件基金会开发的开源分布式计算框架,基于Java语言。其核心组件包括HDFS(Hadoop Distributed File System)和...

    setupHadoop:在集群上设置 Hadoop 的 Shell 脚本和说明

    在集群上设置 Hadoop 的 Shell 脚本和说明。 旨在与 Amazon EC2 上的 Ubuntu Server 14.04.1 LTS 的新实例一起使用。 下面的说明显示了如何设置 2 节点集群。 创建实例 首先,使用 Amazon Web Interface 创建两个...

    hadoop hive 半自动安装脚本(初识shell脚本)

    为hive-0.11半自动安装脚本 使用前请先阅读本脚本注释部分 已有hadoop环境可使用本脚本 因为初识shell脚本 望大虾勿喷 如有不吝赐教者 不胜感激

    hadoop之shell操作及查案元数据

    通过编写Shell脚本,我们可以批量查询表结构,导出DDL,甚至执行更复杂的元数据管理任务。这不仅节省了时间,还降低了人为错误的可能性,对于大型Hadoop集群的运维工作尤其重要。同时,理解并熟练运用这些技巧,也能...

    shell脚本一键安装zookeeper3.4.5

    在IT行业中,shell脚本是一种常用的自动化工具,用于在Linux或Unix系统中执行一系列命令。在本案例中,"shell脚本一键安装zookeeper3.4.5"指的是使用一个自定义的shell脚本来简化Apache ZooKeeper 3.4.5的安装过程。...

    hadoop脚本

    安装hadoop时,集群式安装需要来回的切换机器,那么还有每一步都需要配置文件,很繁琐,所以就在这写了一个脚本

    shell脚本--bigdata.sh

    大数据集群管理脚本

    hadoop集群免密钥配置脚本

    在这个场景下,“hadoop集群免密钥配置脚本”是一个非常实用的工具,它可以帮助管理员简化在多节点集群中配置SSH免密登录的过程,提高运维效率。 SSH(Secure Shell)是一种网络协议,用于在不安全的网络环境中提供...

    大数据中Hadoop Shell介绍

    ### 大数据中Hadoop Shell介绍 ...总之,Hadoop Shell及其相关的脚本为Hadoop的部署、管理和日常维护提供了强大的支持。熟练掌握这些工具的使用方法,对于任何从事大数据处理工作的工程师来说都是必不可少的技能。

Global site tag (gtag.js) - Google Analytics