數(shù)據(jù)遷移的工具Sqoop實(shí)踐

數(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),CONDITIONS的符號(hào)不用轉(zhuǎn)義, 要么外層使用雙引號(hào),那么內(nèi)層使用單引號(hào),然后CONDITIONS的符號(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容