sqoop数据迁移和java执行shell命令

  • 3. sqoop数据迁移
    • 3.1、概述
    • 3.2、sqoop1与sqoop2架构对比
    • 3.3、工作机制
    • 3.4 、sqoop实战及原理
      • 3.4.1 sqoop安装
    • 3.5、 Sqoop的数据导入
    • 3.6、 Sqoop的数据导出
  • 4、java执行shell命令

3. sqoop数据迁移

3.1、概述

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等

3.2、sqoop1与sqoop2架构对比

sqoop1架构

sqoop2架构

3.3、工作机制

将导入或导出命令翻译成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

3.4 、sqoop实战及原理

3.4.1 sqoop安装

安装sqoop的前提是已经具备java和hadoop的环境

  • 1、下载并解压
    下载地址
    http://archive.cloudera.com/cdh5/cdh/5/
    sqoop1版本详细下载地址
    http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.14.0.tar.gz
    sqoop2版本详细下载地址
    http://archive.cloudera.com/cdh5/cdh/5/sqoop2-1.99.5-cdh5.14.0.tar.gz

我们这里使用sqoop1的版本,下载之后上传到/export/softwares目录下,然后进行解压

cd /export/softwares
tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C ../servers/
  • 2、修改配置文件
cd /export/servers/sqoop-1.4.6-cdh5.14.0/conf/
cp sqoop-env-template.sh  sqoop-env.sh
vim sqoop-env.sh
export HADOOP_COMMON_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HIVE_HOME=/export/servers/hive-1.1.0-cdh5.14.0
  • 3、加入额外的依赖包
    sqoop的使用需要添加两个额外的依赖包,一个是mysql的驱动包,一个是java-json的的依赖包,不然就会报错
mysql-connector-java-5.1.40.jar
java-json.jar

将这个两个jar包添加到sqoop的lib目录下

  • 4、验证启动
cd /export/servers/sqoop-1.4.6-cdh5.14.0
bin/sqoop-version

3.5、 Sqoop的数据导入

“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)
列举出所有的数据库
命令行查看帮助

bin/sqoop list-databases --help

列出win7主机所有的数据库

bin/sqoop list-databases --connect jdbc:mysql://172.16.43.67:3306/ --username root --password admin

查看某一个数据库下面的所有数据表

bin/sqoop list-tables --connect jdbc:mysql://172.16.43.67:3306/userdb --username root --password admin

其它导入示例
表数据
在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn
表emp:

表emp_add:

表emp_conn:

  • 导入数据库表数据到HDFS
    下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
bin/sqoop import --connect jdbc:mysql://192.168.1.101:3306/userdb --password admin --username root --table emp --m 1

如果成功执行,那么会得到下面的输出。

为了验证在HDFS导入的数据,请使用以下命令查看导入的数据

hdfs  dfs  -ls  /user/root/emp

导入到HDFS指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
使用参数 --target-dir来指定导出目的地,
使用参数—delete-target-dir来判断导出目录是否存在,如果存在就删掉

bin/sqoop import  --connect jdbc:mysql://172.16.43.67:3306/userdb --username root --password admin --delete-target-dir --table emp  --target-dir /sqoop/emp --m 1

查看导出的数据

hdfs dfs -text /sqoop/emp/part-m-00000


它会用逗号(,)分隔emp_add表的数据和字段。
1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP
导入到hdfs指定目录并指定字段之间的分隔符

bin/sqoop import  --connect jdbc:mysql://172.16.43.67:3306/userdb --username root --password admin --delete-target-dir --table emp  --target-dir /sqoop/emp2 --m 1 --fields-terminated-by '\t'

查看文件内容

hdfs dfs -text /sqoop/emp2/part-m-00000

  • 导入关系表到HIVE
    第一步:拷贝jar包
    将我们mysql表当中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下
cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/

第二步:准备hive数据库与表
将我们mysql当中的数据导入到hive表当中来

hive (default)> create database sqooptohive;
hive (default)> use sqooptohive;
hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by '\001';

第三步:开始导入

bin/sqoop import --connect jdbc:mysql://172.16.43.67:3306/userdb --username root --password admin --table emp --fields-terminated-by '\001' --hive-import --hive-table sqooptohive.emp_hive --hive-overwrite --delete-target-dir --m 1

第四步:hive表数据查看

select * from emp_hive;

  • 导入关系表到hive并自动创建hive表
    我们也可以通过命令来将我们的mysql的表直接导入到hive表当中去
bin/sqoop import --connect jdbc:mysql://172.16.43.67:3306/userdb --username root --password admin --table emp_conn --hive-import -m 1 --hive-database sqooptohive;

通过这个命令,我们可以直接将我们mysql表当中的数据以及表结构一起倒入到hive当中去

  • 导入表数据子集
    我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
    where子句的语法如下。

–where

按照条件进行查找,通过—where参数来查找表emp_add当中city字段的值为sec-bad的所有数据导入到hdfs上面去

bin/sqoop import \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root --password admin --table emp_add \
--target-dir /sqoop/emp_add -m 1  --delete-target-dir \
--where "city = 'sec-bad'"
  • sql语句查找导入hdfs
    我们还可以通过 –query参数来指定我们的sql语句,通过sql语句来过滤我们的数据进行导入
bin/sqoop import \
--connect jdbc:mysql://172.16.43.67:3306/userdb --username root --password admin \
--delete-target-dir -m 1 \
--query 'select phno from emp_conn where 1=1 and  $CONDITIONS'  \
--target-dir /sqoop/emp_conn
  • 查看hdfs数据内容
hdfs dfs -text /sqoop/emp_conn/part*

  • 增量导入
    在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据全部导入到hive或者hdfs当中去,肯定会出现重复的数据的状况,所以我们一般都是选用一些字段进行增量的导入,为了支持增量的导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据
    增量导入是仅导入新添加的表中的行的技术。
    它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
    下面的语法用于Sqoop导入命令增量选项。

–incremental
–check-column
–last value

第一种增量导入使用上面的选项来实现
导入emp表当中id大于1202的所有数据
注意:增量导入的时候,一定不能加参数–delete-target-dir否则会报错

bin/sqoop import \
--connect jdbc:mysql://192.168.22.22:3306/userdb \
--username root \
--password admin \
--table emp \
--incremental append \
--check-column id \
--last-value 1202  \
-m 1 \
--target-dir /sqoop/increment

查看数据内容

hdfs dfs -text /sqoop/increment/part*


第二种增量导入通过–where条件来实现
或者我们使用–where来进行控制数据的选取会更加精准

bin/sqoop import \
--connect jdbc:mysql://192.168.22.22:3306/userdb \
--username root \
--password admin  \
--table emp \
--incremental append  \
--where "create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59'" \
--target-dir /sqoop/incement2 \
--check-column id  \
--m 1

作业:增量导入hive表中该如何实现???

3.6、 Sqoop的数据导出

1、将数据从HDFS把文件导出到RDBMS数据库
导出前,目标表必须存在于目标数据库中。
 默认操作是从将文件中的数据使用INSERT语句插入到表中
 更新模式下,是生成UPDATE语句更新表数据
hdfs导出到mysql
数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下
1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1
1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0
1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

  • 第一步:创建mysql表
CREATE TABLE `emp_out` (`id` INT(11) DEFAULT NULL,`name` VARCHAR(100) DEFAULT NULL,`deg` VARCHAR(100) DEFAULT NULL,`salary` INT(11) DEFAULT NULL,`dept` VARCHAR(10) DEFAULT NULL,`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • 第二步:执行导出命令
    通过export来实现数据的导出,将hdfs的数据导出到mysql当中去
bin/sqoop export \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root --password admin \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ","
  • 第三步:验证mysql表数据

4、java执行shell命令

需求描述:在实际工作中,总会有些时候需要我们通过java代码通过远程连接去linux服务器上面执行一些shell命令,包括一些集群的状态管理,执行任务,集群的可视化界面操作等等,所以我们可以通过java代码来执行linux服务器的shell命令
为了解决上述问题,google公司给提出了对应的解决方案,开源出来了一个jar包叫做sshxcute,通过这个jar包我们可以通过java代码,非常便捷的操作我们的linux服务器了
项目地址如下:
https://code.google.com/archive/p/sshxcute/
使用说明
https://www.ibm.com/developerworks/cn/opensource/os-sshxcute/

第一步:创建maven的java工程并导入jar包
由于这个jar包没有maven坐标,所以需要我们手动导入并添加到工程的build path当中去

第二步:开发测试用例

public static void main(String[] args) throws TaskExecFailException {ConnBean connBean = new ConnBean("192.168.52.100", "root", "123456");SSHExec instance = SSHExec.getInstance(connBean);instance.connect();ExecCommand execCommand = new ExecCommand("echo 'hello world'");instance.exec(execCommand);instance.disconnect();
}

Hadoop离线 day18 sqoop数据迁移和java执行shell命令相关推荐

  1. Windows中使用Java执行shell命令运行检测,通过sonarqube的webapi获取扫描结果

    目录 1,实验环境 2,前言(环境配置) 3,通过Java执行shell命令扫描项目 3.1 主要思路 3.2 参考代码 3.3 运行效果 4,通过sonarqube的webapi获取项目扫描结果 4 ...

  2. java执行shell命令,chmod 777 xxx,改变权限无效的解决办法。

    在java程序中执行shell命令,改变文件的权限,可以在命令行中执行 chmod 777 <span style="font-family: Arial, Helvetica, sa ...

  3. java执行shell命令权限不够_Java调用shell脚本解决传参和权限问题的方法|chu

    1. java 执行shell java 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 sh ...

  4. java执行shell命令

    package com.pms.util; import java.io.File; import java.io.IOException; import java.io.InputStream; i ...

  5. Sqoop数据迁移原理及基本框架

    目录 Sqoop简介 Sqoop架构 Sqoop导入底层工作原理 Sqoop导出底层工作原理 Sqoop简介 Sqoop旨在协助RDBMS与Hadoop之间进行高效的大数据交流.可以把关系型数据库的数 ...

  6. sqoop 数据迁移

    sqoop 数据迁移 1 概述 sqoop是apache旗下一款"Hadoop和关系数据库服务器之间传送数据"的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的H ...

  7. 异构数据库数据同步工具DataX教程,安装、数据同步、java执行

    前言 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.TableStor ...

  8. java ganymed ssh2_java 远程执行Shell命令-通过ganymed-ssh2连接

    一.实现远程执行 此程序的目的是执行远程机器上的Shell脚本. [环境参数] 远程机器IP:192.168.243.21 用户名:user 密码:password 命令:python /data/a ...

  9. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

最新文章

  1. 1034 Head of a Gang(图的DFS解法) 擦边大法好
  2. 定位域中长期不活动计算机
  3. Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介
  4. C#下把txt文件数据读进sql server中存储所遇到的乱码问题
  5. linux删除文件退出,在Linux中用于在移动或删除文件时使`tail -f`退出的bash脚本
  6. 我的2018知乎大数据分析
  7. Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) C. Restoring
  8. 我损失几百万换来的教训
  9. sdut 最长公共子序列问题
  10. Virtual Box 与海马玩 安卓模拟器
  11. if函数python_关于函数:如何在python中为一个if语句提供多个条件
  12. 人人在谈的物联网,入门开发真难!
  13. Windows 10 再爆 Bug;罗永浩怼苹果失去灵魂;马化腾回应系 PS | CSDN 极客头条
  14. html5的service worker,GitHub - w3c/ServiceWorker: Service Workers
  15. Chrome OS 开发者版现可备份和恢复 Linux 容器
  16. Spring Cloud Netflix Eureka组件服务注册及发现源码浅析
  17. golang使用xlsx操纵excel浅析
  18. 安卓修改Airpods的双击功能,改“播放暂停”————下一首
  19. 菜鸟教程,css小白入门
  20. 2022.10.14每日刷题打卡

热门文章

  1. 咚咚咚,你的王国之泪已上线「GitHub 热点速览」
  2. js实现影视级滤镜效果,lut3d的前端实现
  3. ERP顾问值这个价吗?ERP顾问是怎么死的?
  4. (28)Linux命令【chown命令】
  5. arduino学习笔记十一--角度倾斜传感器
  6. SVN服务器和客户端的详细安装
  7. 电力配网远程无线传输解决方案,电力安全再加固
  8. 【无线图传】基于FPGA的简易无线图像传输系统verilog开发,matlab辅助验证
  9. P5462_X龙珠邪教组织被我部侦破
  10. vue 选项卡可以滑动_vue实现选项卡及选项卡切换效果