ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Sqoop数据迁移

2020-12-23 12:00:02  阅读:154  来源: 互联网

标签:jdbc -- root Sqoop db mysql 迁移 retail 数据


文章目录

一、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方式导入数据

  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/*

在这里插入图片描述

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']

标签:jdbc,--,root,Sqoop,db,mysql,迁移,retail,数据
来源: https://blog.csdn.net/weixin_50034171/article/details/111569062

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有