數(shù)據(jù)遷移的工具Sqoop實(shí)踐
sqoop : 數(shù)據(jù)遷入遷出的工具
RDBMS -- import -> Hadoop
Hadoop -- export -> RDBMS
列出MySQL數(shù)據(jù)庫里的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 連接關(guān)系型數(shù)據(jù)庫的URL
--username 數(shù)據(jù)庫的用戶名
--password 數(shù)據(jù)庫的密碼
列出MySQL中的mysql數(shù)據(jù)庫的數(shù)據(jù)表:
sqoop list-tables \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456

創(chuàng)建一張跟mysql中的help_keyword表一樣的hive表hk:
在hive里使用默認(rèn)的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


導(dǎo)入
導(dǎo)入MySQL表中數(shù)據(jù)到HDFS中:
普通導(dǎo)入:導(dǎo)入mysql庫中的help_keyword的數(shù)據(jù)到HDFS上的默認(rèn)路徑:/user/bigdata/help_keyword
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
-m 1
-m 1就是一個(gè)MapTask

查看結(jié)果:
hadoop fs -cat /user/bigdata/help_keyword/p*

先刪除原來的結(jié)果文件:
hadoop fs -rm -r /user/bigdata/help_keyword

下面會(huì)生成4個(gè)文件夾,也就是說默認(rèn)的m是4個(gè)MapTask。
sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword

導(dǎo)入: 指定分隔符為和導(dǎo)入路徑
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

導(dǎo)入數(shù)據(jù):帶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

導(dǎo)入:指定自定義查詢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

下面是導(dǎo)入所有,其實(shí)沒有添加條件,但是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
下面會(huì)報(bào)錯(cuò)
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語句導(dǎo)出數(shù)據(jù)到HDFS的情況下:
1、引號(hào)問題,要么外層使用單引號(hào),內(nèi)層使用雙引號(hào),
符號(hào)不用轉(zhuǎn)義, 要么外層使用雙引號(hào),那么內(nèi)層使用單引號(hào),然后
符號(hào)需要轉(zhuǎn)義
2、自定義的SQL語句中必須帶有WHERE $CONDITIONS
導(dǎo)入MySQL數(shù)據(jù)庫中的表數(shù)據(jù)到Hive中:
普通導(dǎo)入:數(shù)據(jù)存儲(chǔ)在默認(rèn)的default hive庫中,表名就是對(duì)應(yīng)的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*
// 查看數(shù)據(jù)
hadoop fs -cat /home/bigdata/data/hivedata/help_keyword/p*

// 指定行分隔符和列分隔符,
//指定hive-import,
//指定覆蓋導(dǎo)入,
//指定自動(dòng)創(chuàng)建hive表,
//指定表名,
//指定刪除中間結(jié)果數(shù)據(jù)目錄
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*

增量導(dǎo)入 導(dǎo)入到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 只導(dǎo)入 id > 500 的所有記錄。

導(dǎo)出:
mysql --> RDBMS
注意:導(dǎo)出的RDBMS的表必須自己預(yù)先創(chuàng)建,不會(huì)自動(dòng)創(chuàng)建
創(chuàng)建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;

創(chuàng)建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)
);
導(dǎo)出HDFS數(shù)據(jù)到MySQL:
// 導(dǎo)出HDFS數(shù)據(jù)到MySQL:
sqoop export \
--connect jdbc:mysql://bigdata02:3306/sqoopdb \
--username bigdata \
--password 123456 \
--table sqoopstudent \
--export-dir /student_ext_4 \
--fields-terminated-by ','

導(dǎo)出hive數(shù)據(jù)到MySQL:
先清空sqoopstudent
// 導(dǎo)出hive數(shù)據(jù)到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數(shù)據(jù)庫中的所有數(shù)據(jù)庫
//列出mysql數(shù)據(jù)庫中的所有數(shù)據(jù)庫
sqoop list-databases \
--connect jdbc:mysql://bigdata02:3306/ \
-username bigdata \
-password 123456

連接mysql并列出數(shù)據(jù)庫中的表
//連接mysql并列出數(shù)據(jù)庫中的表
sqoop list-tables \
--connect jdbc:mysql://bigdata02:3306/mysql \
-username bigdata \
-password 123456

導(dǎo)入 MySQL 數(shù)據(jù)到 HBase
先手動(dòng)創(chuàng)建表
hbase shell
create 'new_help_keyword','info'

提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自動(dòng)創(chuàng)建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 表示遠(yuǎn)程或者本地 Mysql 服務(wù)的 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 表示導(dǎo)出 mysql 數(shù)據(jù)庫的 help_keyword 表。
導(dǎo)出 HBase 數(shù)據(jù)到 MySQL
很遺憾,現(xiàn)在還沒有直接的命令將 HBase 的數(shù)據(jù)導(dǎo)出到 MySQL
一般采用如下方法:
1、將 Hbase 數(shù)據(jù),扁平化成 HDFS 文件,然后再由 sqoop 導(dǎo)入
2、直接使用 HBase 的 Java API 讀取表數(shù)據(jù),直接向 mysql 導(dǎo)入,不需要使用 sqoop