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脚本的相关知识点。 一、...
在这个"shell脚本配置Hadoop伪分布式.zip"压缩包中,包含了配置Hadoop伪分布式环境所需的所有资源和指南。伪分布式模式是在单个节点上模拟分布式环境,这对于学习和测试Hadoop功能非常有用,无需复杂的多节点集群...
【Hadoop环境部署自动化Shell脚本】是一种高效的方法,用于快速搭建Hadoop集群,无论是用于学习还是开发。本文档提供了一个详细的脚本,涵盖了从Java环境配置到Hadoop集群的完全分布式安装的所有步骤,旨在降低...
hadoop集群关机重启shell脚本
利用shell脚本 对Hadoop环境进行傻瓜式配置 先解压! 环节包括: 1.修改hostname 2.修改hosts 3.配置免密 4.Hadoop配置文件的更改 !!!!!!!!!!!!!!!!!!!! ps 请特别注意以下几个问题: 1....
Hadoop的MapReduce模型和Spark的DataFrame API可以通过shell脚本调用,实现分布式计算任务的提交。例如,通过`hadoop jar`命令运行MapReduce作业,或者用`spark-submit`启动Spark应用,这样可以利用shell脚本实现...
本文将详细探讨如何通过Shell脚本来实现Hadoop的高可用自动化安装。 首先,我们要理解Hadoop高可用性(HA)的基本概念。Hadoop HA主要涉及到NameNode的HA,即通过部署多个NameNode实例,其中一个作为主NameNode...
3. **Hadoop Shell脚本**:通过编写bash脚本,可以自动化执行一系列HDFS操作,提高工作效率。 4. **MapReduce编程**:理解MapReduce的工作原理,包括Mapper和Reducer阶段,以及Combiner和Partitioner的角色。学习...
#shell脚本完成hadoop的集群安装 #步骤: #1.安装虚拟机,关闭防火墙、selinux #2.ssh免密码,编辑hosts文件 #3.安装JDK #4.安装hadoop #5.修改配置文件 #6.分发hadoop程序到各个节点 #7.启动集群
5. **Hadoop Shell脚本编写** - 如何编写使用Hadoop命令的bash脚本,以实现自动化数据处理任务,如批量处理文件、数据清洗等。 - `for`循环和条件判断在Shell脚本中的应用,以及如何结合其他Unix工具如`awk`、`sed...
在Hadoop的ETL流程中,Shell脚本可以用于完成数据的预处理、清洗、转换等任务。例如,Bash Shell环境下的脚本可以使用grep、awk、sed等工具进行数据过滤、格式化和修改,或者调用Hadoop的命令行工具如hadoop fs、...
本篇将详细介绍如何利用Shell脚本在Hadoop环境中实现ETL过程。 1. **Hadoop基础** Hadoop是Apache软件基金会开发的开源分布式计算框架,基于Java语言。其核心组件包括HDFS(Hadoop Distributed File System)和...
在集群上设置 Hadoop 的 Shell 脚本和说明。 旨在与 Amazon EC2 上的 Ubuntu Server 14.04.1 LTS 的新实例一起使用。 下面的说明显示了如何设置 2 节点集群。 创建实例 首先,使用 Amazon Web Interface 创建两个...
为hive-0.11半自动安装脚本 使用前请先阅读本脚本注释部分 已有hadoop环境可使用本脚本 因为初识shell脚本 望大虾勿喷 如有不吝赐教者 不胜感激
通过编写Shell脚本,我们可以批量查询表结构,导出DDL,甚至执行更复杂的元数据管理任务。这不仅节省了时间,还降低了人为错误的可能性,对于大型Hadoop集群的运维工作尤其重要。同时,理解并熟练运用这些技巧,也能...
在IT行业中,shell脚本是一种常用的自动化工具,用于在Linux或Unix系统中执行一系列命令。在本案例中,"shell脚本一键安装zookeeper3.4.5"指的是使用一个自定义的shell脚本来简化Apache ZooKeeper 3.4.5的安装过程。...
安装hadoop时,集群式安装需要来回的切换机器,那么还有每一步都需要配置文件,很繁琐,所以就在这写了一个脚本
大数据集群管理脚本
在这个场景下,“hadoop集群免密钥配置脚本”是一个非常实用的工具,它可以帮助管理员简化在多节点集群中配置SSH免密登录的过程,提高运维效率。 SSH(Secure Shell)是一种网络协议,用于在不安全的网络环境中提供...
### 大数据中Hadoop Shell介绍 ...总之,Hadoop Shell及其相关的脚本为Hadoop的部署、管理和日常维护提供了强大的支持。熟练掌握这些工具的使用方法,对于任何从事大数据处理工作的工程师来说都是必不可少的技能。