文章目录
一、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/*
2.4 通过query方式导入数据
- split-by:用于指定分割的列
2.$CONDITIONS:使用where子句必须添加
- 如果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/*
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']