數據遷移工具之Sqoop

1. Sqoop是什麼

  • Sqoop是apache旗下的一款 ”Hadoop和關係數據庫之間傳輸數據”的工具
    • 導入數據 import
      • 將MySQL,Oracle導入數據到Hadoop的HDFS、HIVE、HBASE等數據存儲系統
    • 導出數據 export
      • 從Hadoop的文件系統中導出數據到關係數據庫
        在這裏插入圖片描述

2. Sqoop的工作機制

  • 將導入和導出的命令翻譯成MapReduce程序實現
  • 在翻譯後的MapReduce中主要是對inputformat和outputformat進行定製

3. Sqoop基本架構

  • sqoop在發展中的過程中演進出來了兩種不同的架構.架構演變史

  • Sqoop的架構一

在這裏插入圖片描述

版本號爲1.4.x0
  • Sqoop的架構二

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZOFBXwTA-1588822808016)(Sqoop數據遷移工具.assets/sqoop2.jpg)]

版本號爲1.99x爲sqoop2 
在架構上:sqoop2引入了sqoop server,對connector實現了集中的管理 
訪問方式:REST API、 JAVA API、 WEB UI以及CLI控制檯方式進行訪問 

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s84VS86A-1588822808018)(Sqoop數據遷移工具.assets/sqoop1 VS sqoop2.png)]

4. Sqoop安裝部署

  • 1、下載安裝包

  • 2、規劃安裝目錄

  • 3、上傳安裝包到服務器node03上

    • sqoop就是一個工具,只需要安裝一臺就可以了,一般跟hive安裝在同一臺服務器上
  • 4、解壓安裝包到指定的規劃目錄

    • tar -zxvf sqoop-1.4.6-cdh5.14.2.tar.gz -C /zsc/install
  • 5、修改配置

    • 進入到sqoop安裝目錄下的conf文件夾中

      • 先重命名文件

        • mv sqoop-env-template.sh sqoop-env.sh
      • 修改文件,添加java環境變量

        • vim sqoop-env.sh
        #Set path to where bin/hadoop is available
        export HADOOP_COMMON_HOME=/kkb/install/hadoop-2.6.0-cdh5.14.2
        
        #Set path to where hadoop-*-core.jar is available
        export HADOOP_MAPRED_HOME=/kkb/install/hadoop-2.6.0-cdh5.14.2
        
        #set the path to where bin/hbase is available
        export HBASE_HOME=/kkb/install/hbase-1.2.0-cdh5.14.2
        
        #Set the path to where bin/hive is available
        export HIVE_HOME=/kkb/install/hive-1.1.0-cdh5.14.2
        
  • 6、添加mysql驅動jar包和json依賴包

    • 把mysql的驅動jar包添加到sqoop的lib目錄下
      • 拷貝之前hive的lib目錄下的mysql驅動
    cp /zsc/install/hive-1.1.0-cdh5.14.2/lib/mysql-connector-java-5.1.38.jar  /zsc/install/sqoop-1.4.6-cdh5.14.2/lib/
    
    • 把json依賴包添加到sqoop的lib目錄下
    java-json.jar
    
  • 7、配置sqoop環境變量

    • vim /etc/profile
    export SQOOP_HOME=/kkb/install/sqoop-1.4.6-cdh5.14.2
    export PATH=:$SQOOP_HOME/bin:$PATH
    
  • 8、讓sqoop環境變量生效

    • source /etc/profile

5. Sqooq數據的導入

  • 導入單個表從RDBMS到HDFS。表中的每一行被視爲HDFS的記錄。所有記錄都存儲爲文本文件的文本數據(或者Avro、sequence文件等二進制數據)

5.1 列舉出所有的數據庫

  • 命令行查看幫助文檔
sqoop list-databases --help
  • 列出node03上mysql數據庫中所有的數據庫名稱
sqoop list-databases --connect jdbc:mysql://node03:3306/ --username root --password 123456
  • 查看某一個數據庫下面的所有數據表
sqoop list-tables --connect jdbc:mysql://node03:3306/hive --username root --password 123456

5.2 導入數據庫表數據到HDFS

  • 在MySQL數據庫服務器中創建一個數據庫userdb, 然後在創建一張表 emp,添加點測試數據到表中

  • 從MySQL數據庫服務器中的userdb數據庫下的emp表導入HDFS上

sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root   \
--password 123456 \
--table emp \
--m 1



#參數解釋
--connect   指定mysql鏈接地址
--username  連接mysql的用戶名
--password  連接mysql的密碼
--table     指定要導入的mysql表名稱
--m:        表示這個MR程序需要多少個MapTask去運行,默認爲4
默認路徑是/user/hadoop下
  • 提交之後,會運行一個MR程序,最後查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

5.3 導入數據庫表數據到HDFS指定目錄

  • 在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。
  • 使用參數 --target-dir來指定導出目的地,
  • 使用參數–delete-target-dir來判斷導出目錄是否存在,如果存在就刪掉
sqoop import  --connect jdbc:mysql://node03:3306/userdb --username root --password 123456  --table emp  --target-dir /sqoop/emp  --delete-target-dir --m 1
# --target-dir是指定數據目錄
# --delete-target-dir 表示如果目錄存在 刪除重新創建
  • 提交查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

5.4 導入數據庫表數據到HDFS指定目錄並且指定數據字段的分隔符

  • 這裏使用參數
    • –fields-terminated-by 分隔符
sqoop import  \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--delete-target-dir \
--table emp  \
--target-dir /sqoop/emp1 \
--fields-terminated-by '#' \
--m 1
  • 提交查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

5.5 導入關係表到Hive中

  • (1) 將我們mysql表當中的數據直接導入到hive表中的話,需要將hive的一個叫做hive-exec-1.1.0-cdh5.14.2.jar包拷貝到sqoop的lib目錄下
cp /kkb/install/hive-1.1.0-cdh5.14.2/lib/hive-exec-1.1.0-cdh5.14.2.jar /kkb/install/sqoop-1.4.6-cdh5.14.2/lib/
  • (2) 準備hive數據庫與表

    • 在hive中創建一個數據庫和表
    create database sqooptohive;
    
    create external table sqooptohive.emp_hive(id int,name string,deg string,salary double ,dept string) row format delimited fields terminated by '\001';
    
  • (3) 把mysql表數據導入到hive表中

sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp \
--fields-terminated-by '\001' \
--hive-import \
--hive-table sqooptohive.emp_hive \
--hive-overwrite \
--delete-target-dir \
--m 1

##參數解釋
--hive-table      指定要導入到hive表名
--hive-import     導入數據到hive表中
--hive-overwrite  覆蓋hive表中已存有的數據

分爲兩步

  • (4) 執行完成了查看hive中表的數據
    • select * from sqooptohive.emp_hive;

在這裏插入圖片描述

5.6 導入數據庫表數據到hive中(並自動創建hive表)

  • 可以通過命令來將我們的mysql的表直接導入到hive表當中去,不需要事先創建hive表
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp \
--hive-database sqooptohive \
--hive-table emp1 \
--hive-import \
--m 1 


drop table emp1
  • 執行完成了查看hive中表的數據
    • select * from sqooptohive.emp1;
      在這裏插入圖片描述

5.7 導入表數據子集

  • 我們可以導入表的使用Sqoop導入工具,"where"子句的一個子集。它執行在各自的數據庫服務器相應的SQL查詢,並將結果存儲在HDFS的目標目錄。
  • 按照條件進行查找,通過==–where參數來查找表emp當中dept==字段的值爲 TP 的所有數據導入到hdfs上面去
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp \
--target-dir /sqoop/emp_where \
--delete-target-dir \
--where "dept = 'TP'" \
--m 1 
  • 提交查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

5.8 sql語句查找導入hdfs

  • 我們還可以通過 -–query參數來指定我們的sql語句,通過sql語句來過濾我們的數據進行導入
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoop/emp_sql \
--delete-target-dir \
--query 'select * from emp where salary >30000 and $CONDITIONS' \
--m 1
  • 提交查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

  • 補充:

    $CONTITONS是linux系統的變量,如果你想通過並行的方式導入結果,每個map task需要執行sql查詢後腳語句的副本,結果會根據sqoop推測的邊界條件分區。query必須包含$CONDITIONS。這樣每個sqoop程序都會被替換爲一個獨立的條件。同時你必須指定 --split-by '字段',後期是按照字段進行數據劃分,最後可以達到多個MapTask並行運行。
    
    
    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456 \
    --target-dir /sqoop/emp_sql_2 \
    --delete-target-dir \
    --query 'select * from emp where salary >30000 and $CONDITIONS' \
    --split-by 'id' \
    --m 2
    
    
    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456 \
    --target-dir /sqoop/emp_sql_2 \
    --delete-target-dir \
    --query 'select * from emp where id >1 and $CONDITIONS' \
    --split-by 'salary' \
    --m 2
    
    
    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456 \
    --target-dir /sqoop/emp_sql_2 \
    --delete-target-dir \
    --query 'select * from emp where id >1 and $CONDITIONS' \
    --split-by 'id' \
    --m 7
    
    
    
    
    --split-by '字段': 後期按照字段進行數據劃分實現並行運行多個MapTask。
    

5.9 增量導入

  • 在實際工作當中,數據的導入很多時候都是只需要導入增量數據即可,並不需要將表中的數據全部導入到hive或者hdfs當中去,肯定會出現重複的數據的狀況,所以我們一般都是選用一些字段進行增量的導入,爲了支持增量的導入,sqoop也給我們考慮到了這種情況並且支持增量的導入數據

  • 增量導入是僅導入新添加的表中的行的技術。

  • 它需要添加 ==‘incremental’, ‘check-column’, 和 ‘last-value’==選項來執行增量導入。

    --incremental <mode>
    --check-column <column name>
    --last value <last check column value>
    
  • 第一種增量導入實現

    • 基於遞增列的增量數據導入(Append方式)
    • 導入emp表當中id大於1202的所有數據
      • 注意:這裏不能加上 --delete-target-dir 參數,添加就報錯
    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456 \
    --table emp \
    --incremental append \
    --check-column id \
    --last-value 1202  \
    --target-dir /sqoop/increment \
    --m 1
    
    
    ##參數解釋
    --incremental   這裏使用基於遞增列的增量數據導入
    --check-column  遞增列字段
    --last-value    指定上一次導入中檢查列指定字段最大值
    --target-dir    數據導入的目錄
    
    • 提交查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

  • 第二種增量導入實現

    • 基於時間列的增量數據導入(LastModified方式)

      • 此方式要求原有表中有time字段,它能指定一個時間戳
        • user表結構和數據
          在這裏插入圖片描述
    sqoop import \
    --connect jdbc:mysql://node03:3306/userdb \
    --username root \
    --password 123456  \
    --table user \
    --incremental lastmodified  \
    --check-column createTime  \
    --last-value '2019-10-01 10:30:00'  \
    --target-dir /sqoop/increment2 \
    --m 1
    
    ##參數解釋
    --incremental   這裏使用基於時間列的增量導入
    --check-column  時間字段
    --last-value    指定上一次導入中檢查列指定字段最大值
    --target-dir    數據導入的目錄
    				如果該目錄存在(可能已經有數據)
    				再使用的時候需要添加 --merge-key or --append
    		--merge-key 指定合併key(對於有修改的)
    		--append    直接追加修改的數據
    
    • 提交查看HDFS上的目錄看是否有數據生成

在這裏插入圖片描述

5.10 mysql表的數據導入到hbase中

  • 實現把一張mysql表數據導入到hbase中
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456  \
--table emp \
--hbase-table  mysqluser \
--column-family  f1 \
--hbase-create-table \
--hbase-row-key id  \
--m 1 


#參數說明
--hbase-table  			指定hbase表名
--column-family 		指定表的列族
--hbase-create-table 	表不存在就創建
--hbase-row-key 		指定hbase表的id
--m  					指定使用的MapTask個數
list
scan 'mysqluser'
disable 'mysqluser'
drop 'mysqluser'


# mysql導入hbase 不同的列族
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456  \
--columns id,salary,dept \
--table emp \
--hbase-table  mysqluser2 \
--column-family  f1 \
--hbase-create-table \
--hbase-row-key id  \
--m 1 


sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456  \
--columns id,name,deg \
--table emp \
--hbase-table  mysqluser2 \
--column-family  f2 \
--hbase-create-table \
--hbase-row-key id  \
--m 1 


6. Sqoop數據的導出

  • 將數據從HDFS把文件導出到RDBMS數據庫
  • 導出前,目標表必須存在於目標數據庫中。
  • 默認操作是從將文件中的數據使用INSERT語句插入到表中
  • 更新模式下,是生成UPDATE語句更新表數據

6.1 hdfs文件導出到mysql表中

  • 1、數據是在HDFS當中的如下目錄/user/hive/warehouse/hive_source,數據內容如下
1 zhangsan 20 hubei
2 lisi 30 hunan
3 wangwu 40 beijing
4 xiaoming 50 shanghai
  • 2、創建一張mysql表
    • 注意mysql中的這個表一定要先創建! 不然報錯!
CREATE TABLE  userdb.fromhdfs (
   id INT DEFAULT NULL,
   name VARCHAR(100) DEFAULT NULL,
   age int DEFAULT NULL,
   address VARCHAR(100) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • 3、執行導出命令
sqoop export \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table fromhdfs \
--export-dir /user/hive/warehouse/hive_source \
--input-fields-terminated-by " " 


##參數解釋
--table 					  指定導出的mysql表名
--export-dir 				  指定hdfs數據文件目錄
--input-fields-terminated-by  指定文件數據字段的分隔符
  • 4、驗證mysql表數據
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章