概述
sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
- 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系
统;
- 导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等
安装
安装sqoop的前提是已经具备了java和hadoop的环境
下载解压
下载地址:http://archive.apache.org/dist/sqoop/1.4.7
sqoop1版本详细下载地址 :http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
sqoop2版本详细下载地址 :http://archive.apache.org/dist/sqoop/1.99.6/sqoop-1.99.6-bin-hadoop200.tar.gz
我们这里使用sqoop1的版本,下载之后上传到/export/softwares目录下,然后进行解压
cd /export/softwares
tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C ../servers/
修改配置文件
cd /export/servers/hadoop‐3.1.1/conf/
cp sqoop‐env‐template.sh sqoop‐env.sh
vim sqoop‐env.sh
export HADOOP_COMMON_HOME/export/servers/hadoop‐3.1.1
export HADOOP_MAPRED_HOME=/export/servers/hadoop‐3.1.1
export HIVE_HOME=/export/servers/apache‐hive‐3.1.1‐bin
加入额外的依赖包
sqoop的使用需要添加两个额外的依赖包,一个是mysql的驱动包,一个是java-json的的依赖包,不然就会报错。mysql-connector-java-5.1.40.jar 、java-json.jar 将这两个包添加到sqoop的lib目录下
验证启动
cd /export/servers/sqoop-1.4.7.bin__hadoop-2.6.0
bin/sqoop-version
sqoop数据的导入
常用命令
#列举所有数据库
bin/sqoop list‐databases ‐‐connect jdbc:mysql://192.168.1.7:3306/ ‐‐ username root ‐‐password root
# 查看某一个数据库下面的数据表
bin/sqoop list‐tables ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root
在mysqk中有个库userdb,有三个表:emp、emp_add、emp_conn
表emp:表emp_add:
表emp_conn:
导入数据库表到hdfs
下面的命令用于从mysql数据库服务器中的emp表导入hdfs(底层走的是MapReduce),
- —target-dir 指定导出目录,如果不指定默认导入到/user/root/
- —delete-target-dir来判断导出目录是否存在,存在则删掉
- —m指定mapreduce的个数
- ‐‐fields‐terminated‐by 如果不指定导出分隔符,则为逗号
查看文件内容:bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root ‐‐delete‐target‐dir ‐‐table emp ‐‐target‐dir /sqoop/emp ‐‐m 1 ‐‐fields‐terminated‐by '\t'
hdfs dfs -text /sqoop/emp/part-m-0000
导入关系表到hive
- 拷贝jar包
将我们的mysql表中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-3.1.1.jar的jar包拷贝到sqoop的lib目录
cp /export/servers/apache‐hive‐3.1.1‐bin/lib/hive‐exec‐3.1.1.jar
/export/servers/sqoop‐1.4.7.bin__hadoop‐2.6.0/lib
- 准备hive数据库和表 ```shell hive (default)> create database sqooptohive;
hive (default)> use sqooptohive;
行分隔符\001
hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by ‘\001’;
3. 开始导入
- ‐‐hive‐overwrite 数据覆盖
```shell
bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root ‐‐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表
我们也可以通过命令将我们的mysql的表直接导入到hive表当中去,用的就是这个参数 ‐‐hive‐database 会自动帮我们创建,这种也更简单,推荐这一种。bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐ username root ‐‐password root ‐‐table emp_conn ‐‐hive‐import ‐m 1 ‐‐hive‐database sqooptohive
增量导入
在实际工作当中,数据的导入,很多时候都是只需要导入增量的数据即可,并不需要将表中全部的数据导入到hive或者hdfs,肯定会出现重复数据的情况。所以一般我们都是选用一些字段进行增量导入,为了支持增量导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据。
增量导入是仅导入新添加的表中的行的技术,它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。下面的语法用途sqoop导入命令增量选项。注意:增量导入的时候,一定不能加参数—delete-target-dir否则会报错
导入emp表当中id大于1202的所有数据
bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐username root ‐‐password root ‐‐table emp ‐‐incremental append
‐‐check‐column id ‐‐last‐value 1202 ‐m 1
‐‐target‐dir /sqoop/increment
where参数来来导入我们想要的数据,以导入hdfs举例
bin/sqoop import ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐username root ‐‐password admin ‐‐table emp ‐‐incremental append ‐‐where "create_time > '2018‐06‐17 00:00:00' and create_time < '2018‐06‐ 17 23:59:59'"
‐‐target‐dir /sqoop/incement2
‐‐check‐column id ‐‐m 1
sqoop数据导出
hdfs导出到mysql
将数据从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 UPDATECURRENT_TIMESTAMP, is_delete BIGINT(20) DEFAULT '1' ) ENGINE=INNODB DEFAULT CHARSET=utf8;
执行导出命令
bin/sqoop export ‐‐connect jdbc:mysql://192.168.1.7:3306/userdb ‐‐username root ‐‐password root ‐‐table emp_out ‐‐export‐dir /sqoop/emp ‐‐input‐fields‐terminated‐by ","
查看验证mysql表数据