Sqoop工具的使用

Sqoop

sqoop理解(sqoop站在Hdfs角度)

Sqoop是一个能够在hadoop的结构化数据库和传统的关系型数据库之间进行高效批量数据传输的工具,通过内嵌的mapreduce程序实现关系型数据库和hdfs,hive和hbase之间数据的输入和输出。

sqoop安装

1、访问sqoop的⽹址http://sqoop.apache.org/,选择相应的sqoop版本下载,本案例选择下载的
是 1.4.7 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoo
p-2.6.0.tar.gz,下载完相应的⼯具包后,解压Sqoop

[root@CentOS ~]# tar -zxf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/
[root@CentOS ~]# cd /usr/
[root@CentOS usr]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7
[root@CentOS ~]# cd /usr/sqoop-1.4.7/

2.配置环境变量

[root@CentOS sqoop-1.4.7]# vi ~/.bashrc
JAVA_HOME=/usr/java/latest
HADOOP_HOME=/usr/hadoop-2.9.2
HBASE_HOME=/usr/hbase-1.2.4
HIVE_HOME=/usr/apache-hive-1.2.2-bin
SQOOP_HOME=/usr/sqoop-1.4.7
ZOOKEEPER_HOME=/usr/zookeeper-3.4.6
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HIVE_HOM
E/bin:$SQOOP_HOME/bin:$ZOOKEEPER_HOME/bin
CLASSPATH=.
export JAVA_HOME
export HADOOP_HOME
export HBASE_HOME
export HIVE_HOME
export PATH
export CLASSPATH
export SQOOP_HOME
export ZOOKEEPER_HOME
[root@CentOS sqoop-1.4.7]# source ~/.bashrc

3、修改conf下的sqoop-env.sh.template配置⽂件 —内容要与上面的环境变量对应一致

[root@CentOS sqoop-1.4.7]# mv conf/sqoop-env-template.sh conf/sqoop-env.sh
[root@CentOS sqoop-1.4.7]# vi conf/sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/hadoop-2.9.2
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/hadoop-2.9.2
#set the path to where bin/hbase is available
export HBASE_HOME=/usr/hbase-1.2.4
#Set the path to where bin/hive is available
export HIVE_HOME=/usr/apache-hive-1.2.2-bin
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/zookeeper-3.4.6/conf

4、将MySQL驱动jar拷⻉到sqoop的lib⽬录下

[root@CentOS ~]# cp /usr/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.48.jar
/usr/sqoop-1.4.7/lib/

5、验证Sqoop是否安装成功

[root@CentOS sqoop-1.4.7]# sqoop version
Warning: /usr/sqoop-1.4.7/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/sqoop-1.4.7/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/sqoop-1.4.7/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /usr/sqoop-1.4.7/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
19/12/22 08:40:12 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
[root@CentOS sqoop-1.4.7]# sqoop list-tables --connect
jdbc:mysql://192.168.52.1:3306/mysql --username root --password root

Sqoop-Import


1.RDBMS导入到HDFS

import工具将单个表从RDBMS导入到HDFS中。表中的每⼀⾏在HDFS中均表示为单独的记录。记录可以存
储为⽂本⽂件(每⾏⼀个记录),也可以⼆进制表示形式存储为Avro或SequenceFiles。

全表导入

#\表示同一行
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://192.168.1.104:3306/mysql?characterEncoding=UTF-8 \
--username root \
--password root \
--table t_user \
--num-mappers 4 \
--fields-terminated-by '\t' \
--target-dir /mysql/test/t_user \
--delete-target-dir
参数 属性
–connect 连接的数据库地址
-–username 连接的数据库的用户名
–password 连接的数据库的密码
–table 想要导出数据的表
–num-mappers 表示设置的maptask个数,默认为4个,决定最终在hdfs中生成的文件个数(将table中的数据分成几个文件分别存储)
–target-dir 要导入到hdfs中的目录(如果不指定,默认存储在“/user/用户名/导入的表名” 目录下)
-–delete-target-dir 表示如果在hdfs中有该目录,则先删除,然后再导入数据到该目录下
–fields-terminated-by 指定字段的分割符号

字段导入

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://192.168.1.104:3306/mysql?characterEncoding=UTF-8 \
--username root \
--password root \
--table t_user \
--columns "id,name,age" \
--where "id > 2 or name like '%z%'" \
--target-dir /mysql/test/t_user1 \
--delete-target-dir \
--num-mappers 4 \
--fields-terminated-by '\t'
属性 说明
–columns 指定要导入的字段,字段之间用,分隔
–where 指定过滤条件

SQL查询导入

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://192.168.1.104:3306/mysql \
--username root \
--password root \
--num-mappers 3 \
--fields-terminated-by '\t' \
--query 'select id, name,sex, age ,birthDay from t_user where $CONDITIONS LIMIT 100' \
--split-by id \
--target-dir /mysql/test/t_user2 \
--delete-target-dir

如果要并⾏导⼊查询结果,则每个Map任务将需要执⾏查询的副本,其结果由Sqoop推断的边界条
件进⾏分区。您的查询必须包含令牌 $CONDITIONS ,每个Sqoop进程将⽤ 唯⼀条件表达式 替换
该令牌。您还必须使⽤ --split-by 选择拆分列。

属性 说明
where $CONDITIONS 导入SQL并行查询时,必须加载sql语句中
–split-by 选择使用什么字段进行拆分,并不影响查询结果

(split-by)切分必须使用int类型,不能使用String类型

2.RDBFS导入到Hive

全表导入

sqoop import \
--connect jdbc:mysql://192.168.1.104:3306/mysql \
--username root \
--password root \
--table t_user \
--num-mappers 3 \	
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table baizhi.t_user
属性 说明
–hive-import 将数据导⼊到hive中
–hive-overwrite 如果表已经存在,将原有数据覆盖
–hive-table 指定导⼊hive中哪张表⾥

分区导入

sqoop import \
--connect jdbc:mysql://192.168.1.104:3306/mysql \
--username root \
--password root \
--table t_user \
--num-mappers 3 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table baizhi.t_user \
--hive-partition-key city \
--hive-partition-value 'bj'
属性 说明
–hive-partition-key 分区字段
–hive-partition-value 指定分区值

3.RDBFS导入到Hbase

sqoop import \
--connect jdbc:mysql://192.168.1.104:3306/mysql \
--username root \
--password root \
--table t_user \
--num-mappers 3 \
--hbase-table baizhi:t_user \
--column-family cf1 \
--hbase-create-table \
--hbase-row-key id \
--hbase-bulkload
属性 说明
–hbase-table 写⼊hbase中的表
–column-family 导⼊的列簇
–hbase-create-table 创建表
–hbase-row-key 指定字段作为rowkey
–hbase-bulkload 启动Hbase 批量写⼊

启动hbase服务,创建baizhi数据库,t_usr可由系统自动创建。

Sqoop-export


export工具将一组文件从HDFS导出到RDBFS。目标表必须已经存在数据库中。根据用户指定的界符,读取输入文件并将其作为一组记录。

1.HDFS到MySQL

数据准备

0	zhangsan	true	20	2020-01-11
1 	lisi	false	25	2020-01-10
3	wangwu 	true	36	2020-01-17
4 	zhaoliu	false	50 	1990-02-08
5	win7	true	20	1991-02-08

在mysql数据库中准备好表格

create table t_user(
 id int primary key auto_increment,
 name VARCHAR(32),
 sex boolean,
 age int,
 birthDay date
) CHARACTER SET=utf8;

将自定义的数据的数据文件上传至HDFS文件系统对应的位置

sqoop export \
--connect jdbc:mysql://192.168.1.104:3306/mysql \
--username root \
--password root \
--table t_user \
--update-key id \
--update-mode allowinsert \
--export-dir /demo/src \
--input-fields-terminated-by '\t'
属性 说明
–export-dir 导出的数据
–input-fields-terminated-by hdfs数据文件中字段间的分割符号
–update-mode 导入模式

导入模式(–update-mode)可以选择:allowinsert 或 updateonly

updateonly:仅仅更新已经存在的数据记录,对于不存在数据则不记录。

allowinsert :对于已有的数据更新,对于不存在的数据插入。

可以根据–update-key中选中的字段进行区分数据是否已经存在。

注意分隔符,不一定是 ‘\t’ TAB键易出错,可以使用 逗号 作为分隔符,容易导入数据。

2.Hbase到MySQL

思路:Hbase存储是二进制文件无法直接导出,先将数据导出到hive中,再从hdfs中将数据导出。

HBASE -> HIVE
HIVE-RDBMS 等价 HDFS => RDBMS

①准备测试数据

7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,\N,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,\N,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,\N,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,\N,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,1500,\N,20
7839,KING,PRESIDENT,\N,1981-11-17 00:00:00,5000,\N,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,\N,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,\N,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,\N,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,\N,10

②为了准备数据,先将数据存储在hive中,从hive转移到hbase中

create database if not exists baizhi;
use baizhi;
drop table if exists t_employee;
CREATE TABLE t_employee(
 empno INT,
 ename STRING,
 job STRING,
 mgr INT,
 hiredate TIMESTAMP,
 sal DECIMAL(7,2),
 comm DECIMAL(7,2),
 deptno INT)
row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by '>'
lines terminated by '\n'
stored as textfile;
load data local inpath '/root/t_employee' overwrite into table t_employee;
drop table if exists t_employee_hbase;
create external table t_employee_hbase(
 empno INT,
 ename STRING,
 job STRING,
 mgr INT,
 hiredate TIMESTAMP,
 sal DECIMAL(7,2),
 comm DECIMAL(7,2),
 deptno INT)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" =
":key,cf1:name,cf1:job,cf1:mgr,cf1:hiredate,cf1:sal,cf1:comm,cf1:deptno")
TBLPROPERTIES("hbase.table.name" = "baizhi:t_employee");
insert overwrite table t_employee_hbase select empno,ename,job,mgr,hiredate,sal,comm,deptno from t_employee;

在hbase中建立 baizhi:t_employee 表方便为其映射值。

③创建一个sql文件,将hbase中的数据导入到hdfs(hive)中

use baizhi;
INSERT OVERWRITE DIRECTORY '/demo/src/employee' ROW FORMAT DELIMITED FIELDS
TERMINATED BY ',' STORED AS TEXTFILE select
empno,ename,job,mgr,hiredate,sal,comm,deptno from t_employee_hbase;

④将HDFS中的数据导入到RDBMS

sqoop export \
--connect jdbc:mysql://192.168.1.104:3306/mysql \
--username root \
--password root \
--table t_employee \
--update-key id \
--update-mode allowinsert \
--export-dir /demo/src/employee \
--input-fields-terminated-by ',' \
--input-null-string '\\N' \
--input-null-non-string '\\N';
属性 说明
–input-null-string 数据中空值的代表

ql://192.168.1.104:3306/mysql
–username root
–password root
–table t_employee
–update-key id
–update-mode allowinsert
–export-dir /demo/src/employee
–input-fields-terminated-by ‘,’
–input-null-string ‘\N’
–input-null-non-string ‘\N’;


| 属性                | 说明             |
| ------------------- | ---------------- |
| --input-null-string | 数据中空值的代表 |

猜你喜欢

转载自blog.csdn.net/origin_cx/article/details/104243704