用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql
1:创建shell脚本
- touch sqoop_options.sh
- chmod 777 sqoop_options.sh
编辑文件 特地将执行map的个数设置为变量 测试 可以java代码传参数 同时也验证sqoop的 options 属性支持这种写法
- #!/bin/bash
- /opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/bin/sqoop --options-file /opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/sqoop-import-mysql.txt --num-mappers $1
- if [ $? -eq 0 ];then
- echo "success"
- else
- echo "error"
- fi
2:创建 sqoop-import-mysql.txt 文件并编辑
- touch sqoop-import-mysql.txt
- export
- --connect
- jdbc:mysql://172.16.71.27:3306/babasport
- --username
- root
- --password
- root
- --table
- test_hive
- --export-dir
- /user/hive/warehouse/hive_bbs_product_snappy
- --input-fields-terminated-by
- '\t'
hive数据存在hdfs位置
3:开始写java后台代码 目前只支持 window写法 后期加上linux调用shell脚本的写法
- package com.liveyc.common.utils;
- import java.util.Properties;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class FileToHbase {
- /**
- * shell脚本执行成功标识
- */
- public static int SHELL_EXIT_OK = 0;
- public static Log log = LogFactory.getLog(FileToHbase.class);
- public static String connIp = "172.16.71.120";
- public static String connUser = "root";
- public static String connPwd = "123456";
- public static void main(String[] args) throws Exception {
- boolean result = export();
- System.out.println(result);
- }
- public static boolean export() throws Exception {
- boolean result = false;
- // 如果当前系统是window系统需要远程ssh连接系统
- if (isWinSystem()) {
- ConnectShell connectShell = new ConnectShell(connIp, connUser, connPwd, "utf-8");
- String url = "/opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/sqoop_options.sh" + " " +1;
- result = connectShell.excuteShellCommand(url);
- }
- return result;
- }
- /**
- * 当前操作系统类型
- *
- * @return true 为windos系统,false为linux系统
- */
- public static boolean isWinSystem() {
- // 获取当前操作系统类型
- Properties prop = System.getProperties();
- String os = prop.getProperty("os.name");
- if (os.startsWith("win") || os.startsWith("Win")) {
- return true;
- } else {
- return false;
- }
- }
- }
- package com.liveyc.common.utils;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import java.nio.charset.Charset;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import ch.ethz.ssh2.ChannelCondition;
- import ch.ethz.ssh2.Connection;
- import ch.ethz.ssh2.Session;
- import ch.ethz.ssh2.StreamGobbler;
- /**
- *
- * ConnectShell
- *
- * @Description:连接Shell脚本所在服务器
- * @author:aitf
- * @date: 2016年3月31日
- *
- */
- public class ConnectShell {
- private Connection conn;
- private String ipAddr;
- private String userName;
- private String password;
- private String charset = Charset.defaultCharset().toString();
- private static final int TIME_OUT = 1000 * 5 * 60;
- public static Log log = LogFactory.getLog(ConnectShell.class);
- public ConnectShell(String ipAddr, String userName, String password, String charset) {
- this.ipAddr = ipAddr;
- this.userName = userName;
- this.password = password;
- if (charset != null) {
- this.charset = charset;
- }
- }
- public boolean login() throws IOException {
- conn = new Connection(ipAddr);
- conn.connect();
- return conn.authenticateWithPassword(userName, password); // 认证
- }
- /**
- *
- * @Title: excuteShellCommand
- * @Description: 执行shell脚本命令
- * @param shellpath
- * @return
- */
- public boolean excuteShellCommand(String shellpath) {
- InputStream in = null;
- boolean result = false;
- String str = "";
- try {
- if (this.login()) {
- Session session = conn.openSession();
- //session.execCommand("cd /root");
- session.execCommand(shellpath);
- in = new StreamGobbler(session.getStdout());
- // in = session.getStdout();
- str = this.processStdout(in, charset);
- session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
- session.close();
- conn.close();
- if (str.contains("success")) {
- result = true;
- }else{
- result = false;
- }
- }
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- return result;
- }
- public String excuteShellCommand2(String shellpath) throws Exception {
- InputStream in = null;
- String result = "";
- try {
- if (this.login()) {
- Process exec = Runtime.getRuntime().exec(shellpath);// ipconfig
- in = exec.getInputStream();
- result = this.processStdout(in, this.charset);
- }
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- return result;
- }
- /**
- * 转化结果
- *
- * @param in
- * @param charset
- * @return
- * @throws UnsupportedEncodingException
- */
- public String processStdout(InputStream in, String charset) throws UnsupportedEncodingException {
- String line = null;
- BufferedReader brs = new BufferedReader(new InputStreamReader(in, charset));
- StringBuffer sb = new StringBuffer();
- try {
- while ((line = brs.readLine()) != null) {
- sb.append(line + "\n");
- }
- } catch (IOException e) {
- log.error("---转化出现异常---");
- }
- return sb.toString();
- }
- }
4:开始测试
在mysql创建一个表 hive中数据格式 是 int int String
- CREATE TABLE test_hive(
- id INT,
- brand_id INT,
- NAME VARCHAR(200)
- )
执行java main方法 开始测试
观看8088端口 查看MapReduce的运行状况 发现正在运行(开心)
执行完毕
可以看到 只有1个 MapReduce任务 (默认的个数是4个 这样看来第一步写的shell脚本 参数是传递过来了 sqoop的 options 也支持这种直接指定参数的写法)
现在转过来看java代码
返回值 :
- Warning: /opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/bin/../../hbase does not exist! HBase imports will fail.
- Please set $HBASE_HOME to the root of your HBase installation.
- Warning: /opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/bin/../../hcatalog does not exist! HCatalog jobs will fail.
- Please set $HCAT_HOME to the root of your HCatalog installation.
- Warning: /opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/bin/../../accumulo does not exist! Accumulo imports will fail.
- Please set $ACCUMULO_HOME to the root of your Accumulo installation.
- Warning: /opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6/bin/../../zookeeper does not exist! Accumulo imports will fail.
- Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
- success
发现返回 success 说明shell脚本执行成功了
一切执行正常 看下mysql 数据库表中有没有数据
OK 一切正常 , 后期把linux执行shell脚本的语句也补充上 。
用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql的更多相关文章
- Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件
本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...
- (MySQL里的数据)通过Sqoop Import Hive 里 和 通过Sqoop Export Hive 里的数据到(MySQL)
Sqoop 可以与Hive系统结合,实现数据的导入和导出,用户需要在 sqoop-env.sh 中添加HIVE_HOME的环境变量. 具体,见我的如下博客: hadoop2.6.0(单节点)下Sqoo ...
- Java如何调用shell脚本的
有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12G ...
- 通过ant调用shell脚本执行adb命令
在Hudson或者Jenkins中利用ant的exec 来调用shell命令,通过shell脚本来执行adb shell命令,可以正常执行,不会出现在ant中直接调用adb shell出现的假死情况. ...
- 利用jmeter发起java请求调用shell脚本
1.创建maven项目 在pom文件中加入依赖: 2.在路径src/main/java下创建类,如类名shellclass 3. 创建jmet ...
- java调用shell脚本执行操作
//定时清空 日志 String shellString = "sh /home/jyapp/delete_log.sh"; Process process = Runtime.g ...
- Java 调用 shell 脚本详解
这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的“陷阱”造成调用shell 脚本在某些特 ...
- python调用shell脚本时需要切换目录
最近遇到了一个问题,就是python代码调用shell脚本时,发现输入输出的文件,总是和自己预想的有偏差,但是单独在linux下执行命令的时候,却没有错误.后来发现是相对路径的问题,因为执行pytho ...
- Java代码调用服务器上的Shell脚本
Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...
随机推荐
- Swift-自定义类的构造函数
构造函数类似oc中的init方法默认情况下,创建一个,类会调用一个构造函数即使没写任何构造函数,编译器会默认一个构造函数如果是继承NSObject,可以对构造函数重写 class Person: NS ...
- 上传web端——个人项目
我用visual studio新建了一个web窗口,如图: 然后这里是系统自带的代码: [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile ...
- 【beta】Scrum站立会议第7次....11.9
小组名称:nice! 组长:李权 成员:于淼 刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.11.9 12:00——12:30 地点:传媒西楼220室 本次对beta阶段 ...
- linux之JDK安装
1.JDK安装 a.卸载JDK (1)卸载默认的JDK 用root用户登陆到系统,打开一个终端输入 # rpm -qa|grep gcj 显示内容其中包含下面两行信息 # java-1.4.2-gcj ...
- 分享几个IP获取地理位置的API接口(最全面的了)
转载;https://cloud.tencent.com/developer/article/1152362 全网首发,最全的IP接口,不服来辩!博主找了几个小时的资料,又手动抓取到了几个接口补充进来 ...
- jquery不能是使用普通的for循环 因为普通的for循环通过下表获取对象 如果通过下表获取对象的话 会转成dom对象
jquery不能是使用普通的for循环 因为普通的for循环通过下表获取对象 如果通过下表获取对象的话 会转成dom对象
- java中的error该不该捕获
写java程序时,通常会被提示捕获异常,而又有一些异常是不需要强制捕获的,这是一个被说烂了的话题.像我一样从其他语言转过来的人确实有点迷惑,那我以我的理解重新解释一遍吧. 异常的基类是Exceptio ...
- 题解 P1469 【找筷子】
这题真是水 咳咳.. 基本思路:桶排 但是可以剪枝. 剪枝方法: 好几种,可以用set(集合),可以用stack(栈), 也可以像我一样的蒟蒻最大最小值...... 但是作者的毒瘤数据应该不会放过我们 ...
- C++11线程使用总结
std::thread 在 <thread> 头文件中声明,因此使用 std::thread 需包含 <thread> 头文件. <thread> 头文件摘要 &l ...
- Java日期格式转换
Java时间格式转换大全 import java.text.*;import java.util.Calendar;public class VeDate {/** * 获取现在时间 * ...