sqoop实现大数据集群和关系型数据库之间数据迁移

本文详细介绍了如何使用Sqoop在Hadoop与关系型数据库间进行数据迁移,包括从RDBMS导入数据到HDFS、Hive及HBase,以及从HDFS导出数据到RDBMS的具体操作命令。

Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具。
Sqoop导入导出是通过MapReduce来完成的。
在 Sqoop 中,“导入”概念指:从关系型数据库(RDBMS)向大数据集群(HDFS, HIVE,HBASE)中传输数据,叫做:导入,即使用 import关键字。

在 Sqoop 中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向关 系型数据库(RDBMS)中传输数据,叫做:导出,即使用 export 关键字。

从RDB到HDFS的数据迁移

语句模板如下:

sqoop import 
--connect jdbc:mysql://localhost:3306/retail_db		//指定mysql数据库名 
--driver com.mysql.jdbc.Driver 	//mysql驱动包
--username root 	//连接mysql的用户名
--password 1111 	//连接mysql的密码
--delete-target-dir 		//如果导入的hdfs文件存在,就删除该文件
--target-dir /data/retail_db/customers		//指定输出到hdfs的文件路径 (文件当前并不存在)
--m 3			//mapper 数量 

1.将customers整个表数据导入hdfs的/data/retail_db/customers文件中。

–table table_name //指定导入表

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

网页查看对应路径hdfs文件,可以看到已导入文件。
在这里插入图片描述

2.使用where过滤出表orders中【order_id<100】的数据导入hdfs的/data/retail_db/orders文件中。

–where “条件” //指定条件

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--where "order_id<100" \
--username root \
--password 1111 \
--delete-target-dir \
--target-dir /data/retail_db/orders \
--m 3

3.使用columns过滤出指定字段数据到hdfs的/data/retail_db/customers文件中。

–columns “fn1,fn2,…” //指定需要获取的列名

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table customers \
--columns "customer_id,customer_fname,customer_lname" \  
--username root \
--password 1111 \
--delete-target-dir \
--target-dir /data/retail_db/customers \
--m 3

4.使用query用查询语句【sql语句需要添加 and $CONDITIONS】,将符合条件的数据导入hdfs文件

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--query "select  order_id,order_date,order_customer_id from orders where order_status!='CLOSED' and \$CONDITIONS"  \
--username root \
--password 1111 \
--delete-target-dir \
--target-dir /data/retail_db/customers \
--m 3

从RDB到Hive的数据迁移

1.mysql导数据到Hive中
Hive建库

hive -e "create database if not exists retail_db;"

导入数据

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password 1111 \
--hive-import \								//hive导入数据
--create-hive-table \						//创建hive数据表
--hive-database retail_db \					//导入hive的目标数据库
--hive-table orders \						//导入hive目标数据表
--m 3

导数据报错

1.Import failed: java.io.IOException: java.lang.ClassNotFoundException:
2.java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader

需要导包:复制 hive/lib中的hive-common和hive-shims* 包到sqoop/lib中

报错:文件存在

Import failed: org.apache.hadoop.mapred.FileAlreadyExistsException
----------------------------------------------------------
删除文件:hdfs dfs -rmr hdfs://hadoop1:9000/user/root/orders

2.导入数据到Hive分区中

删除orders表

drop table if exists orders;

导入数据

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--query "select order_id,order_status from orders where order_date>='2013-11-03' and order_date <'2013-11-04' and \$CONDITIONS" \
--username root \
--password 1111 \
--delete-target-dir \							//删除hdfs文件
--target-dir /data/retail_db/orders \			//指定数据保存到目标文件
--split-by order_id \							//分割字段
--hive-import \
--hive-database retail_db \
--hive-table orders \
--hive-partition-key "order_date" \				//分区字段
--hive-partition-value "2013-11-03" \			//对应值
--m 3

注意:分区字段不能当成普通字段导入表中

导入数据到HBase中

1.在HBase中建表

create 'products','data','category'

2.sqoop导入

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--username root \
--password 1111 \
--table products \					//源数据表
--hbase-table products \			//目标数据表
--column-family data \				//列簇名
--m 3

从HDFS到RDB的数据迁移

1.MySQL中建表

//创建的表需要和hdfs中导出的文件字段数一一对应
create table customers_demo (
customer_id int,
customer_fname string,
customer_lname string,
job string,
gender string,
age int
);

2.上传数据到HDFS

hdfs dfs -mkdir /customerinput
hdfs dfs -put customers.csv /customerinput

3.导出数据

sqoop export \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--username root \
--password 1111 \
--table customers_demo \
--export-dir /customerinput \			//导出文件 
--m 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值