数据迁移的工具Sqoop实践
sqoop : 数据迁入迁出的工具
RDBMS -- import -> Hadoop
Hadoop -- export -> RDBMS
列出MySQL数据库里的database:
sqoop list-databases \
--connect jdbc:mysql://bigdata02:3306/ \
--username bigdata \
--password 123456
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username bigdata --password 123456
--connect 连接关系型数据库的URL
--username 数据库的用户名
--password 数据库的密码
列出MySQL中的mysql数据库的数据表:
sqoop list-tables \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456
创建一张跟mysql中的help_keyword表一样的hive表hk:
在hive里使用默认的default库
sqoop create-hive-table \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--hive-table hk
使用myhive库
sqoop create-hive-table \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--hive-database myhive \
--hive-table hk
导入
导入MySQL表中数据到HDFS中:
普通导入:导入mysql库中的help_keyword的数据到HDFS上的默认路径:/user/bigdata/help_keyword
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
-m 1
-m 1就是一个MapTask
查看结果:
hadoop fs -cat /user/bigdata/help_keyword/p*
先删除原来的结果文件:
hadoop fs -rm -r /user/bigdata/help_keyword
下面会生成4个文件夹,也就是说默认的m是4个MapTask。
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword
导入: 指定分隔符为和导入路径
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--target-dir /user/bigdata/my_help_keyword2 \
--fields-terminated-by '\t' \
-m 1
hadoop fs -cat /user/bigdata/my_help_keyword2/part-m-00001
导入数据:带where条件
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--where "name='STRING' " \
--table help_keyword \
--target-dir /sqoop/bigdata/myoutport1 \
-m 1
hadoop fs -cat /sqoop/bigdata/myoutport1/part-m-00000
导入:指定自定义查询SQL
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--target-dir /user/bigdata/myimport2 \
--query 'select help_keyword_id,name from help_keyword WHERE $CONDITIONS and name = "STRING"' \
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 1
hadoop fs -cat /user/bigdata/myimport2/part-m-00000
下面是导入所有,其实没有添加条件,但是WHERE $CONDITIONS 必须要有。
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--target-dir /user/root/myimport22 \
--query "select help_keyword_id,name from help_keyword WHERE \$CONDITIONS" \
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 3
下面会报错
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--target-dir /user/root/myimport222 \
--query "select help_keyword_id,name from help_keyword" \
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 3
在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号,符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后符号需要转义
2、自定义的SQL语句中必须带有WHERE $CONDITIONS
导入MySQL数据库中的表数据到Hive中:
普通导入:数据存储在默认的default hive库中,表名就是对应的mysql的表名:
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--hive-import \
-m 1
// hadoop fs -cat /user/hive/warehouse/help_keyword/p*
// 查看数据
hadoop fs -cat /home/bigdata/data/hivedata/help_keyword/p*
// 指定行分隔符和列分隔符,
//指定hive-import,
//指定覆盖导入,
//指定自动创建hive表,
//指定表名,
//指定删除中间结果数据目录
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database myhive \
--hive-table new_help_keyword2
// hadoop fs -cat /user/hive/warehouse/myhive.db/new_help_keyword2/p*
hadoop fs -cat /home/bigdata/data/hivedata/myhive.db/new_help_keyword2/p*
增量导入 导入到hdfs
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--target-dir /user/root/myimport3 \
--incremental append \
--check-column help_keyword_id \
--last-value 500 \
-m 1
hadoop fs -cat /user/root/myimport3/p*
last-value 500 只导入 id > 500 的所有记录。
导出:
mysql --> RDBMS
注意:导出的RDBMS的表必须自己预先创建,不会自动创建
创建student表
hive
create database if not exists myhive;
use myhive;
drop table if exists student;
create table student(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";
load data local inpath "/home/bigdata/data/student.txt" into table myhive.student;
select * from myhive.student;
创建sqoopstudent表
mysql -ubigdata -p123456
create database sqoopdb default character set utf8 COLLATE utf8_general_ci;
use sqoopdb;
CREATE TABLE sqoopstudent (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
sex VARCHAR(20),
age INT,
department VARCHAR(20)
);
导出HDFS数据到MySQL:
// 导出HDFS数据到MySQL:
sqoop export \
--connect jdbc:mysql://bigdata02:3306/sqoopdb \
--username bigdata \
--password 123456 \
--table sqoopstudent \
--export-dir /student_ext_4 \
--fields-terminated-by ','
导出hive数据到MySQL:
先清空sqoopstudent
// 导出hive数据到MySQL:
sqoop export \
--connect jdbc:mysql://bigdata02:3306/sqoopdb \
--username bigdata \
--password 123456 \
--table sqoopstudent \
--export-dir /home/bigdata/data/hivedata/myhive.db/student \
--fields-terminated-by ','
一些其他操作:
列出mysql数据库中的所有数据库
//列出mysql数据库中的所有数据库
sqoop list-databases \
--connect jdbc:mysql://bigdata02:3306/ \
-username bigdata \
-password 123456
连接mysql并列出数据库中的表
//连接mysql并列出数据库中的表
sqoop list-tables \
--connect jdbc:mysql://bigdata02:3306/mysql \
-username bigdata \
-password 123456
导入 MySQL 数据到 HBase
先手动创建表
hbase shell
create 'new_help_keyword','info'
提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--columns "help_keyword_id,name" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "help_keyword_id" \
--hbase-table "new_help_keyword"
hbase shell
scan 'new_help_keyword'
字段解释:
--connect jdbc:mysql://bigdata02:3306/mysql 表示远程或者本地 Mysql 服务的 URI
--hbase-create-table 表示在 HBase 中建立表。
--hbase-table new_help_keyword 表示在 HBase 中建立表 new_help_keyword。
--hbase-row-key help_keyword_id 表示hbase表的rowkey是mysql表的help_keyword_id 字段。
--column-family "info" 表示在表 new_help_keyword 中建立列族 person。
--username root 表示使用用户 root 连接 mysql。
--password 111111 连接 mysql 的用户密码
--table help_keyword 表示导出 mysql 数据库的 help_keyword 表。
导出 HBase 数据到 MySQL
很遗憾,现在还没有直接的命令将 HBase 的数据导出到 MySQL
一般采用如下方法:
1、将 Hbase 数据,扁平化成 HDFS 文件,然后再由 sqoop 导入
2、直接使用 HBase 的 Java API 读取表数据,直接向 mysql 导入,不需要使用 sqoop