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

被折叠的 条评论
为什么被折叠?



