Sqoop迁移Hadoop与RDBMS间的数据
1–hive->hdfs
1、不建议从Hive表到RDBMS表的直接导出,因为当Hive表记录较大时,或者RDBMS有多个分区表
时,无法做精细的控制
2、从Hive表导出到HDFS时,可以进一步对数据进行字段筛选
、字段加工
、数据过滤
操作,使得HDFS上的数据更"接近"或等于将来实际要导入RDBMS表的数据
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
3、输入如下命令,可查看传输到指定hdfs目录/kb10/shop1118
下的数据信息:
hdfs dfs -cat /kb10/shop1118/000000_0
2–hdfs->mysql
1、先在mysql创建表,表结构与原hive表中的结构进行对应;
create table hive_shop(
id int,
name varchar(10),
mobile varchar(20),
address varchar(100),
vol2020 int
);
sqoop export \
--connect jdbc:mysql://single:3306/kb10 \
--username root \
--password kb10 \
--table hive_shop \
--columns id,name,mobile,address,vol2020 \
--fields-terminated-by ',' \
--export-dir '/kb10/shop1118/000000_0'
注:--connect jdbc:mysql://single:3306/kb10 \
配置数据库连接为mysql数据库;--username root \
mysql的用户名;--password kb10 \
mysql用户名密码;--table hive_shop \
指定上传的表名;--export-dir '/kb10/shop1118/000000_0'
hdfs下数据位置信息
3–mysql->hdfs
#–incremental append 只支持新增
不支持修改
#–split-by 和-m结合实现numberReduceTasks并行
#–table TABLE_NAME或–query SELECT_COMMAND
#–check-column 和–last-value结合实现增量导入,若last-value为0,指将原mysql表中的数据进行全量导入
sqoop import \
--connect jdbc:mysql://single:3306/kb10mysqltestdb \
--username root \
--password kb10 \
--query "select sid,sname,gender,class_id from student where \$CONDITIONS" \
--target-dir /kb10/student1120 \
--split-by sid \
-m 2 \
--check-column sid \
--incremental append \
--last-value 0
#向原表中插入一条新的数据
insert into student(sid,sname,gender,class_id)values(19,'李白','男',4)
sqoop import \
--connect jdbc:mysql://single:3306/kb10mysqltestdb \
--username root \
--password kb10 \
--query "select sid,sname,gender,class_id from student where \$CONDITIONS" \
--target-dir /kb10/student1120 \
--split-by sid \
-m2 \
--check-column sid \
--incremental append \
--last-value 18
注:第一次全量上传一共18条数据,第二次增量上传时将last-value设置为18,上传成功后hdfs文件系统中新增一个新的文件;
4–MySQL –> Hbase
1、在hbase的命名空间kb10下创建表Mysql_stu1
,列族分别为info
和score
;
sqoop import \
--connect jdbc:mysql://single:3306/kb10mysqltestdb \
--username root \
--password kb10 \
--table score \
--hbase-table kb10:mysql_stu1 \
--column-family score \
--hbase-row-key sid \
--hbase-bulkload
注:--hbase-bulkload
不用指定输出路径,自动数据转移;将mysql中kb10mysqltestdb数据库下的score表数据上传至mysql_stu1表的score列族;将原表中的主键sid作为row-key,保证其唯一性;
5-mysql->hive
在hive中先创建表结构与Mysql原表对应结构的表信息
create external table mysql_stucopy(
stuName string,
stuPhone string
)
row format delimited
fields terminated by ','
stored as textfile;
sqoop import \
--connect jdbc:mysql://single:3306/kb10 \
--username root \
--password kb10 \
--num-mappers 1 \
--table stucopy \
--hive-import \
--hive-table mysql_stucopy \
--fields-terminated-by ',' \
--hive-overwrite \
--delete-target-dir
6–hbase->hive
#利用hbase作为hive的数据源,因为hbase延时低,数据吞吐量大
1、将hive的lib下的hive-hbase-handler-1.1.0-cdh5.14.2.jar拷贝到hbase的lib下
[single lib]# cd /opt/software/hadoop/hive110/lib/
[single lib]# cp hive-hbase-handler-1.1.0-cdh5.14.2.jar /opt/software/hadoop/hbase120/lib/
2、拷贝hbase相关jar到hive中
hbase-client-1.2.0-cdh5.14.2.jar
hbase-hadoop2-compat-1.2.0-cdh5.14.2.jar
hbase-hadoop-compat-1.2.0-cdh5 .14.2.jar
hbase-it-1.2.0-cdh5 .14.2.jar
hbase-server-1.2.0-cdh5.14.2.jar
create external table hbase_score(sid string,student_id int,course_id int,score int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with SERDEPROPERTIES ("hbase.columns.mapping" = ":key,score:student_id,score:course_id,score:score")
TBLPROPERTIES ("hbase.table.name" = "kb10:mysql_stu1");
7–hive->mysql
mysql中创建与hive对应的表,并在环境变量中配置hcatalog路径
sqoop export \
--connect jdbc:mysql://lichan:3306/ms_dm_intes \
--username root \
--password root \
--table events \
#hive数据库
--hcatalog-database dwd_intes \
--hcatalog-table dwd_events \
-m3