一 。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實現
(暫略)