hadoop記錄篇11-關係型數據庫導入導出組件 sqoop

一 。sqoop簡介html

     Sqoop是一款開源的工具,主要用於在Hadoop(Hive)與傳統的數據庫(mysql、postgresql…)間進行數據的傳遞,
java

能夠將一個關係型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也能夠將HDFS的數據導進到關係型數據庫中。
 sqoop1架構(直接使用shell sqoop直接和關係型數據庫與hadoop對接)
  node

 sqoop2架構
   sqoop2引入了sqoop server(具體服務器爲tomcat),對connector實現了集中的管理。其訪問方式也變得多樣化了,其能夠經過REST API、JAVA API、WEB UI以及CLI控制檯方式進行訪問。另外,其在安全性能方面也有必定的改善,在sqoop1中咱們常常用腳本的方式將HDFS中的數據導入到mysql中,或者反過來將mysql數據導入到HDFS中,其中在腳本里邊都要顯示指定mysql數據庫的用戶名和密碼的,安全性作的不是太完善。在sqoop2中,若是是經過CLI方式訪問的話,會有一個交互過程界面,你輸入的密碼信息不被看到
    
  

sqoop官網 http://sqoop.apache.org/
sqoop2用戶手冊地址 http://sqoop.apache.org/docs/1.99.7/admin/Installation.html

mysql

二 。chd安裝sqoop算法

 使用cdh admin console添加服務 選擇 sqoop2 (不使用cdh參考手冊Admin Guide)
 角色分配 選擇一臺服務器 我選擇cdh3 (cdh自動將hadoop配置分發給sqoop)

sqoop元數據數據庫配置 默認是derby
sql

建立成功

shell

sqoopserver其實是部署在tomcat中 從日誌能夠看出

數據庫

sqoop-shell客戶端 cdh未提供 下載sqoop安裝包 解壓使用bin目錄接口 apache

下載 http://mirror.bit.edu.cn/apache/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar.gztomcat

解壓 進入就如bin目錄 就可使用 sqoop2-shell命令 

sqoop1由於沒有sqoopserver 若是安裝了 直接使用sqoop-import 或者sqoop-export導入和導出

同理 在cdh添加 服務 選擇sqoop1 只是個命令 就沒有啓動的說話

三 。sqoop腳本實現導入和導出

1。sqoop1實現

》》數據導入   
CDH添加服務 sqoop1的客戶端  實際上就是設置參數
      (http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_sqoop_tools)
   官網描述 sqoop導入數據到hadoop中 調用hadoop命令 全部這裏必須確保 本機有操做hadoop目錄的命令(檢測hdfs dfs -ls /可否查看hdfs內容) 不然目標地址
  就只能使用  hdfs://這種了 cdh中下載hdfs客戶端配置文件 
  

   查看幫助 

[root@cdh3 conf]# sqoop-import --help
Warning: /opt/cloudera/parcels/CDH-5.7.6-1.cdh5.7.6.p0.6/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/04/25 16:57:34 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.7.6
usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS]

Common arguments:
   --connect <jdbc-uri>                                       鏈接url
   --driver <class-name>                                      驅動類
   --password <password>                                      密碼
   --username <username>                                      用戶名

Import control arguments:
   --append                                                   追加數據模式
   --as-avrodatafile                                          導入avro格式
   --as-parquetfile                                            Parquet格式
   --as-sequencefile                                          Imports data
   --as-textfile                                              文本文件
   --columns <col,col,col...>                                 導入的列
   --compression-codec <codec>                                壓縮算法類
   --delete-target-dir                                        
-e,--query <statement>                                        指定導入sql語句
-m,--num-mappers <n>                                          map個數決定了輸出幾個文件
   --table <table-name>                                       數據庫讀取的表
   --target-dir <dir>                                         目標hdfs目錄
   --where <where clause>                                     WHERE  條件                                                            
-z,--compress                                                 啓用壓縮

Output line formatting arguments:

   --fields-terminated-by <char>      設置字段間分隔符
   --lines-terminated-by <char>       行結尾符號 默認 \n


Input parsing arguments:
   --input-fields-terminated-by <char>      設置字段間分隔符
   --input-lines-terminated-by <char>       行結尾符號 默認 \n
 
Hive arguments:
   --create-hive-table                         建立hive的表 必須hive中不存在該表
   --hive-database <database-name>             導入數據指定的數據庫名稱
   --hive-import  表示是hive導入
   --hive-table <table-name>  指定hive表名
-libjars 指定包含classpath下的jar文件.

演示個簡單例子 演示在cdh1上數據庫  啓用mysql的general_log

set global general_log=on;    # 開啓general log模式
set global log_output='table' 自動將日誌寫入到 mysql.general_log表
將 mysql.genera_log下全部日誌導入到hive中 查看錶結構
MariaDB [mysql]> desc general_log;
+--------------+------------------+------+-----+-------------------+-----------------------------+
| Field        | Type             | Null | Key | Default           | Extra                       |
+--------------+------------------+------+-----+-------------------+-----------------------------+
| event_time   | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_host    | mediumtext       | NO   |     | NULL              |                             |
| thread_id    | int(11)          | NO   |     | NULL              |                             |
| server_id    | int(10) unsigned | NO   |     | NULL              |                             |
| command_type | varchar(64)      | NO   |     | NULL              |                             |
| argument     | mediumtext       | NO   |     | NULL              |                             |
+--------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

測試數據

MariaDB [mysql]> select * from general_log limit 0,5;
+---------------------+----------------------------------+-----------+-----------+--------------+---------------------------------------------------------+
| event_time          | user_host                        | thread_id | server_id | command_type | argument                                                |
+---------------------+----------------------------------+-----------+-----------+--------------+---------------------------------------------------------+
| 2018-04-25 17:14:47 | scm[scm] @ localhost [127.0.0.1] |        19 |         0 | Query        | commit                                                  |
| 2018-04-25 17:14:47 | scm[scm] @ localhost [127.0.0.1] |        19 |         0 | Query        | SET autocommit=1                                        |
| 2018-04-25 17:14:47 | scm[scm] @ localhost [127.0.0.1] |        19 |         0 | Query        | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ |
| 2018-04-25 17:14:48 | scm[scm] @ localhost [127.0.0.1] |        19 |         0 | Query        | SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED  |
| 2018-04-25 17:14:48 | scm[scm] @ localhost [127.0.0.1] |        19 |         0 | Query        | SET autocommit=0                                        |
+---------------------+----------------------------------+-----------+-----------+--------------+---------------------------------------------------------+
寫sqoop的導入語句 這裏先導入到hdfs中
sqoop-import --connect jdbc:mysql://node1:3306/mysql \
--driver com.mysql.jdbc.Driver \
--password hive \
--username hive \
--as-textfile \
--query 'select * from general_log where' \
--num-mappers 1 \
--target-dir /im
通常會報錯 
18/04/25 17:27:15 INFO tool.CodeGenTool: Beginning code generation
18/04/25 17:27:16 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Query [select * from general_log] must contain '$CONDITIONS' in WHERE clause.
        at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:332)
        at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1856)
由於有可能在命令 中使用 --where 這個語句就放在 $CONDITIONS 中 修改sql語句
 
sqoop-import --connect jdbc:mysql://node1:3306/mysql \
--driver com.mysql.jdbc.Driver \
--password hive \
--username hive \
--as-textfile \
--query 'select * from general_log where $CONDITIONS' \
--num-mappers 1 \
--target-dir /im
導入完成查看 hdfs 的/im目錄
[root@cdh4 init.d]# hdfs dfs -ls /im
Found 2 items
-rw-r--r--   3 root supergroup          0 2018-04-25 17:56 /im/_SUCCESS
-rw-r--r--   3 root supergroup    8435938 2018-04-25 17:56 /im/part-m-00000
直接導入到hive中 
sqoop-import --connect jdbc:mysql://node1:3306/mysql \
--driver com.mysql.jdbc.Driver \
--password hive \
--username hive \
--as-textfile \
--query 'select * from general_log where $CONDITIONS' \
--num-mappers 1 \
--target-dir /im1 \
--hive-import \
--create-hive-table \
--hive-database default \
--hive-table general_log

這裏指定的target-dir只是個臨時的存儲 最終導入//user/hive/warehouse/general_log下

進入hive命令段 查看新建的hive表

sqoop-import --connect jdbc:mysql://node1:3306/mysql \
--driver com.mysql.jdbc.Driver \
--password hive \
--username hive \
--as-textfile \
--query 'select * from general_log where $CONDITIONS' \
--num-mappers 1 \
--target-dir /im1 \
--hive-import \
--create-hive-table \
--hive-database default \
--hive-table general_log

》》數據導出
對應的使用 sqoop-export便可 將以前導入到hive的表導入到test數據庫的ttt表 建立ttt表的結構

mysql> create table ttt as select * from mysql.general_log where 1!=1;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc ttt;
+--------------+------------------+------+-----+---------------------+-------+
| Field        | Type             | Null | Key | Default             | Extra |
+--------------+------------------+------+-----+---------------------+-------+
| event_time   | timestamp        | NO   |     | 0000-00-00 00:00:00 |       |
| user_host    | mediumtext       | NO   |     | NULL                |       |
| thread_id    | int(11)          | NO   |     | NULL                |       |
| server_id    | int(10) unsigned | NO   |     | NULL                |       |
| command_type | varchar(64)      | NO   |     | NULL                |       |
| argument     | mediumtext       | NO   |     | NULL                |       |
+--------------+------------------+------+-----+---------------------+-------+
6 rows in set (0.00 sec)

導出命令 

sqoop-export --connect jdbc:mysql://node1:3306/test \
--driver com.mysql.jdbc.Driver \
--password hive \
--username hive \
--table ttt \
--num-mappers 1 \
--hcatalog-database default \
--hcatalog-table general_log

最後查詢mysql 查看到導出數據

mysql> select count(*) from ttt;
+----------+
| count(*) |
+----------+
|     4838 |
+----------+
1 row in set (0.00 sec)

2。sqoop2實現

 (暫略)

相關文章
相關標籤/搜索