Sqoop数据迁移

文章目录

一、Sqoop是什么?

Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具

● 将数据从RDBMS导入到HDFS、Hive、HBase

● 从HDFS导出数据到RDBMS

● 使用MapReduce导入和导出数据,提供并行操作和容错

二、RDBMS => HDFS

2.1 从Mysql导入数据到HDFS

--模板
import
connect jdbc:mysql://192.168.199.130:3306/retail_db   // 声明要连接的数据库类型、客户端主机名、
--driver com.mysql.jdbc.Driver \    // 数据库驱动
table customers    // 指定导入数据库中的某张表
username root     // 数据库用户名
password root     // 数据库密码
target-dir      // HDFS路径  可以没有,直接创建
m  3             //使用mapper的数量     只有map阶段,没有reduce阶段

–案例:

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table customers \
--username root \
--password root \
--target-dir /data01/retail_db/customers \
-m 3

查看数据

hdfs dfs -cat /data01/retail_db/customers/*    // hdfs下的路径

–案例:

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table customers \
--username root \
--password root \
--target-dir /data01/retail_db/customers2 \

–案例:

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table order_items \
--username root \
--password root \
--target-dir /data01/retail_db/order_items01 \
-m 3

2.2 通过where语句过滤导入表

因为有些数据是想要的,有些数据是不想要的

--模板
sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table customers \        // 指定数据库中的表customer
--where "order_id<500" \   // 指定条件
--username root \
--password root \
--delete-target-dir       // 删除原始路径(如果已经存在)
--target-dir /data01/retail_db/customers2 \   // 指定HDFS下的路径

–案例:

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--where "order_id>10000" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data01/retail_db/orders \
-m 5

2.3 使用columns(列)过滤指定列导入表

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--columns "order_id,order_date,order_customer_id" \   // 指定y要导入的列
--delete-target-dir \
--target-dir /data01/retail_db/orders \
-m 3


查看数据
hdfs dfs -cat /data01/retail_db/orders/*

Sqoop数据迁移

2.4 通过query方式导入数据

  1. split-by:用于指定分割的列
    2.$CONDITIONS:使用where子句必须添加
  2. 如果query后面使用的是双引号,则$CONDITIONS前面必须加转义符,防止Shell无法识别为自己的变量
sqoop import  \
--connect jdbc:mysql://192.168.199.130:3306/retail_db  \
--query "select * from orders where order_status != 'CLOSED' and \$CONDITIONS"  \
--username root  \
--password root \
--split-by order_status \    //  指定按照什么分割,,分割的数据可能不是很均匀
--delete-target-dir \
--target-dir /data01/retail_db/order2	\ 
-m 3

–案例:

sqoop import  \
--connect jdbc:mysql://192.168.199.130:3306/retail_db  \
--query "select * from orders where order_status != 'COMPLETE' and \$CONDITIONS"  \
--username root  \
--password root \
--split-by order_date \
--delete-target-dir \
--target-dir /data01/retail_db/order3 \
-m 3

–查数据:

hdfs dfs -cat /data01/retail_db/order3/*

Sqoop数据迁移

2.5 使用sqoop增量导入数据(之前导了一部分数据了,了数据发生了变化)

解决方案:1、删除原来的表,重新导所有的 2、增量导入
incremental :指定增量导入的模式
append:追加数据记录(append为根据递增列更新数据)
lastmodified:可追加更新的数据(astmodified为根据更新时间进行增量更新)
check-column 指定增量更新的基准列

//重新导一次原始数据
sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--delete-target-dir \
--target-dir /data01/retail_db/orders \
-m 5

增量导入:追加
sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--incremental append \       指定增量导入 方式append
--check-column order_date \  增量导入的列  按照日期列导入(递增列字段)
--last-value '2014-04-15' \    原始数据的最后一个值(指定上一次导入中检查列指定字段最大值)
--target-dir /data01/retail_db/orders \
-m 5

2.6 创建Job

 #创建job 注意import前必须有空格
 sqoop job \
 --create order2HDFS -- import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--target-dir /data01/retail_db/orders_job \
-m 3

 #查看job
 sqoop job --list
 #执行job
 sqoop job --exec order2HDFS

三、RDBMS => Hive

先拷贝一个临时路径,再加载到表下面
##注意空格 ,有了空格起不到转义的效果
1、复制jar包

#复制hive的jar包
 cp /opt/install/hive/lib/hive-common-1.1.0-cdh5.14.2.jar /opt/install/sqoop/lib/
 cp /opt/install/hive/lib/hive-shims* /opt/install/sqoop/lib/

2、导入
案例1:

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--hive-import \   指定参数
--create-hive-table  自动在hive中创建
--hive-database retail_db \  没有就需要去创建,必须是要有的  指hive中的数据库
--hive-table orders \      自己命名
--hive-overwrite \
-m 3

:案例2:

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table products \
--username root \
--password root \
--hive-import \
--fields-terminated-by '|' \
--create-hive-table
--hive-database retail_db \
--hive-table products \
--hive-overwrite \
-m 3
* delete-target-dir 表示如果目录已存在则删除
* 从关系型数据库向Hive导入数据,无需指定路径,会自动保存到之前手动创建的目录下
  /opt/software/hadoop/hive110/warehouse

● 导入到hive分区表,注意分区字段不能当作普同字段导入表中

sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--query "select order_id,order_status from orders where order_date>='2014-07-01' and
 order_date<'2014-07001' and \$CONDITIONS" \
--username root \
--password root \
--target-dir /data01/retail_db/order_partition \  指定导入的路径
--hive-import \   指定hive导入
--hive-database retails \
--hive-table order_partition \
--hive-partition-key 'order_date' \  指定分区key  分区字段
--hive-partition-value '2014-07-01' \ 导入到这个分区   分区名
-m 1

四、RDBMS => Hbase

--模板
# product_id          
| product_category_id 
| product_name        
| product_description 
| product_price    
| product_image  


sqoop import \
--connect jdbc:mysql://192.168.199.130:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table products \
--username root \
--password root \
--table products \
--columns 'product_id,product_name,product_description,product_price,product_image' \
--hbase-table product \  指定导入表
--column-family data \
--hbase-row-key product_id \    指定rowkey
-m 3



--案例1:
#hbase创建表
create 'product','details'
#导入到hbase
 sqoop import  \
 --connect jdbc:mysql://localhost:3306/retail_db\
 --driver com.mysql.jdbc.Driver \
 --username root  \
 --password root\
 --table products\
 --columns 'product_id,product_name,product_description,product_price,product_image' \
 --hbase-table product \
 --column-family data\
 --hbase-row-key 'product_id' \
 --m 3

案例2:

//创建命名空间
create_namespace school

//hbase手动建表,school为命名空间,mysql_school为表名,后面三个为列簇名
create 'school:mysql_school','basicscore','classinfo','scoreinfo'

//使用columns从数据库的表中删选部分字段导入hbase
sqoop import \
--connect jdbc:mysql://single:3306/school \
--username root \
--password kb10 \
--table stu_info \
--columns id,stuName,stuGender,province,city,district \
--hbase-table school:mysql_school \
--column-family basicinfo \
--hbase-row-key id \
--num-mappers 1 \
--hbase-bulkload

//如果使用query语句则无需--hbase-bulkload
//查询语句后面必须有where $CONDITIONS
sqoop import \
--connect jdbc:mysql://single:3306/school \
--username root \
--password kb10 \
--query 'select id,proName,className,openDate from stu_info where $CONDITIONS' \
--hbase-table school:mysql_school \
--column-family classinfo \
--hbase-row-key id \
--num-mappers 1
* hbase-table 指定命名空间和表名
* column-family 指定列簇名
* hbase-row-key 指定行键(排序字段),必须是表格中存在的字段名
* hbase-bulkload 不用指定输出的路径,自动数据转移
* 若表不存在,可以通过 hbase-create-table 命令自动创建
* 也可以在shell窗口下手动创建,需要指定命名空间、表名、列簇名

五、HDFS/Hive => RDBMS

(或者说hive数据导出到mysql,因为hive的表实际是一个目录,将该目录下数据导出到mysql即可,注意hive默认分割符是’\001’需要换成能够解析的分隔符)
● mysql建表

create table hive_shop(
	id int,
	name varchar(50),
	mobile varchar(20),
	address varchar(100),
	vol2020 int
);

● 数据导出

sqoop export \
--connect jdbc:mysql://192.168.199.130:3306/kb10 \
--username root \
--password root\
--table hive_shop \
--columns id,name,mobile,address,vol2020 \
--fields-terminated-by ',' \
--export-dir '/kb10/shop1118/000000_0'
* fields-terminated-by 表示原表字段分隔符
* export-dir 表示导出文件路径,HDFS和Hive的文件存储路径有所不同

六、Hive => HDFS

//插入数据
insert overwrite directory '/kb10/shop1118/'
row format delimited
fields terminated by ','
stored as textfile
select
	shopid,
	shopname,
	contact.mobile mobile,
	concat_ws('',address) address,
	volumn['2020'] vol2020
from shop;

//导出数据
export table TABLE_NAME [partition (PART_COLUMN="VALUE"[, ...])]
to 'export_target_path' [ for replication('EVENT_ID') ]

七、HDFS => Hive

//上传数据
load data [local] inpath 'HDFS_PATH' into table [partition (PART_COLUMN="VALUE"[, ...])];

//导入数据
import [[external] table NEW_TABLE [partition (PART_COLUMN="VALUE"[, ...])]]
from 'SOURCE_PATH' [location 'IMPORT_TARGET_PATH']
上一篇:Ambari2.7.4+HDP3.1.4下sqoop增量导入只支持append模式,mysql直接进入hive的lastmodified的不支持。下面是增量的命令。


下一篇:Sqoop安装与使用