目錄 一、概述 二、工作機制 三、安裝 1、前提概述 2、軟體下載 3、安裝步驟 四、Sqoop的基本命令 基本操作 示例 五、Sqoop的數據導入 1、從RDBMS導入到HDFS中 2、把MySQL資料庫中的表數據導入到Hive中 3、把MySQL資料庫中的表數據導入到hbase 目錄 一、概述 ...
正文
回到頂部一、概述
sqoop 是 apache 旗下一款“Hadoop 和關係資料庫伺服器之間傳送數據”的工具。
核心的功能有兩個:
導入、遷入
導出、遷出
導入數據:MySQL,Oracle 導入數據到 Hadoop 的 HDFS、HIVE、HBASE 等數據存儲系統
導出數據:從 Hadoop 的文件系統中導出數據到關係資料庫 mysql 等 Sqoop 的本質還是一個命令行工具,和 HDFS,Hive 相比,並沒有什麼高深的理論。
sqoop:
工具:本質就是遷移數據, 遷移的方式:就是把sqoop的遷移命令轉換成MR程式
hive
工具,本質就是執行計算,依賴於HDFS存儲數據,把SQL轉換成MR程式
二、工作機制
將導入或導出命令翻譯成 MapReduce 程式來實現 在翻譯出的 MapReduce 中主要是對 InputFormat 和 OutputFormat 進行定製
回到頂部三、安裝
1、前提概述
將來sqoop在使用的時候有可能會跟那些系統或者組件打交道?
HDFS, MapReduce, YARN, ZooKeeper, Hive, HBase, MySQL
sqoop就是一個工具, 只需要在一個節點上進行安裝即可。
補充一點: 如果你的sqoop工具將來要進行hive或者hbase等等的系統和MySQL之間的交互
你安裝的SQOOP軟體的節點一定要包含以上你要使用的集群或者軟體系統的安裝包
補充一點: 將來要使用的azakban這個軟體 除了會調度 hadoop的任務或者hbase或者hive的任務之外, 還會調度sqoop的任務
azkaban這個軟體的安裝節點也必須包含以上這些軟體系統的客戶端/2、
2、軟體下載
下載地址http://mirrors.hust.edu.cn/apache/
sqoop版本說明
絕大部分企業所使用的sqoop的版本都是 sqoop1
sqoop-1.4.6 或者 sqoop-1.4.7 它是 sqoop1
sqoop-1.99.4----都是 sqoop2
此處使用sqoop-1.4.6版本sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
3、安裝步驟
(1)上傳解壓縮安裝包到指定目錄
因為之前hive只是安裝在hadoop3機器上,所以sqoop也同樣安裝在hadoop3機器上
[hadoop@hadoop3 ~]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C apps/
(2)進入到 conf 文件夾,找到 sqoop-env-template.sh,修改其名稱為 sqoop-env.sh cd conf
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
[hadoop@hadoop3 ~]$ cd apps/ [hadoop@hadoop3 apps]$ ls apache-hive-2.3.3-bin hadoop-2.7.5 hbase-1.2.6 sqoop-1.4.6.bin__hadoop-2.0.4-alpha zookeeper-3.4.10 [hadoop@hadoop3 apps]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop-1.4.6 [hadoop@hadoop3 apps]$ cd sqoop-1.4.6/conf/ [hadoop@hadoop3 conf]$ ls oraoop-site-template.xml sqoop-env-template.sh sqoop-site.xml sqoop-env-template.cmd sqoop-site-template.xml [hadoop@hadoop3 conf]$ mv sqoop-env-template.sh sqoop-env.sh
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
(3)修改 sqoop-env.sh
[hadoop@hadoop3 conf]$ vi sqoop-env.sh
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.5 #Set path to where hadoop-*-core.jar is available export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.7.5 #set the path to where bin/hbase is available export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6 #Set the path to where bin/hive is available export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.3-bin #Set the path for where zookeper config dir is export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
為什麼在sqoop-env.sh 文件中會要求分別進行 common和mapreduce的配置呢???
在apache的hadoop的安裝中;四大組件都是安裝在同一個hadoop_home中的
但是在CDH, HDP中, 這些組件都是可選的。
在安裝hadoop的時候,可以選擇性的只安裝HDFS或者YARN,
CDH,HDP在安裝hadoop的時候,會把HDFS和MapReduce有可能分別安裝在不同的地方。
(4)加入 mysql 驅動包到 sqoop1.4.6/lib 目錄下
[hadoop@hadoop3 ~]$ cp mysql-connector-java-5.1.40-bin.jar apps/sqoop-1.4.6/lib/
(5)配置系統環境變數
[hadoop@hadoop3 ~]$ vi .bashrc
#Sqoop export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6 export PATH=$PATH:$SQOOP_HOME/bin
保存退出使其立即生效
[hadoop@hadoop3 ~]$ source .bashrc
(6)驗證安裝是否成功
sqoop-version 或者 sqoop version
四、Sqoop的基本命令
基本操作
首先,我們可以使用 sqoop help 來查看,sqoop 支持哪些命令
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
[hadoop@hadoop3 ~]$ sqoop help Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. 18/04/12 13:37:19 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6 usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import Import a table from a database to HDFS import-all-tables Import tables from a database to HDFS import-mainframe Import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information See 'sqoop help COMMAND' for information on a specific command. [hadoop@hadoop3 ~]$
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
然後得到這些支持了的命令之後,如果不知道使用方式,可以使用 sqoop command 的方式 來查看某條具體命令的使用方式
示例
列出MySQL數據有哪些資料庫
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
[hadoop@hadoop3 ~]$ sqoop list-databases \ > --connect jdbc:mysql://hadoop1:3306/ \ > --username root \ > --password root Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. 18/04/12 13:43:51 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6 18/04/12 13:43:51 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 18/04/12 13:43:51 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. information_schema hivedb mysql performance_schema test [hadoop@hadoop3 ~]$
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
列出MySQL中的某個資料庫有哪些數據表:
[hadoop@hadoop3 ~]$ sqoop list-tables \
> --connect jdbc:mysql://hadoop1:3306/mysql \
> --username root \
> --password root
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
創建一張跟mysql中的help_keyword表一樣的hive表hk:
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop create-hive-table \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --hive-table hk
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
回到頂部
五、Sqoop的數據導入
“導入工具”導入單個表從 RDBMS 到 HDFS。表中的每一行被視為 HDFS 的記錄。所有記錄 都存儲為文本文件的文本數據(或者 Avro、sequence 文件等二進位數據)
1、從RDBMS導入到HDFS中
語法格式
sqoop import (generic-args) (import-args)
常用參數
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
--connect <jdbc-uri> jdbc 連接地址 --connection-manager <class-name> 連接管理者 --driver <class-name> 驅動類 --hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME --help help 信息 -P 從命令行輸入密碼 --password <password> 密碼 --username <username> 賬號 --verbose 列印流程信息 --connection-param-file <filename> 可選參數
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
示例
普通導入:導入mysql庫中的help_keyword的數據到HDFS上
導入的預設路徑:/user/hadoop/help_keyword
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ -m 1
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
查看導入的文件
[hadoop@hadoop4 ~]$ hadoop fs -cat /user/hadoop/help_keyword/part-m-00000
導入: 指定分隔符和導入路徑
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --target-dir /user/hadoop11/my_help_keyword1 \ --fields-terminated-by '\t' \ -m 2
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
導入數據:帶where條件
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --where "name='STRING' " \ --table help_keyword \ --target-dir /sqoop/hadoop11/myoutport1 \ -m 1
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
查詢指定列
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --columns "name" \ --where "name='STRING' " \ --table help_keyword \ --target-dir /sqoop/hadoop11/myoutport22 \ -m 1 selct name from help_keyword where name = "string"
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
導入:指定自定義查詢SQL
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/ \ --username root \ --password root \ --target-dir /user/hadoop/myimport33_1 \ --query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \ --split-by help_keyword_id \ --fields-terminated-by '\t' \ -m 4
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
在以上需要按照自定義SQL語句導出數據到HDFS的情況下:
1、引號問題,要麼外層使用單引號,內層使用雙引號,$CONDITIONS的$符號不用轉義, 要麼外層使用雙引號,那麼內層使用單引號,然後$CONDITIONS的$符號需要轉義
2、自定義的SQL語句中必須帶有WHERE \$CONDITIONS
2、把MySQL資料庫中的表數據導入到Hive中
Sqoop 導入關係型數據到 hive 的過程是先導入到 hdfs,然後再 load 進入 hive
普通導入:數據存儲在預設的default hive庫中,表名就是對應的mysql的表名:
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --hive-import \ -m 1
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
導入過程
第一步:導入mysql.help_keyword的數據到hdfs的預設路徑
第二步:自動仿造mysql.help_keyword去創建一張hive表, 創建在預設的default庫中
第三步:把臨時目錄中的數據導入到hive表中
查看數據
[hadoop@hadoop3 ~]$ hadoop fs -cat /user/hive/warehouse/help_keyword/part-m-00000
指定行分隔符和列分隔符,指定hive-import,指定覆蓋導入,指定自動創建hive表,指定表名,指定刪除中間結果數據目錄
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --fields-terminated-by "\t" \ --lines-terminated-by "\n" \ --hive-import \ --hive-overwrite \ --create-hive-table \ --delete-target-dir \ --hive-database mydb_test \ --hive-table new_help_keyword
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
報錯原因是hive-import 當前這個導入命令。 sqoop會自動給創建hive的表。 但是不會自動創建不存在的庫
手動創建mydb_test數據塊
hive> create database mydb_test; OK Time taken: 6.147 seconds hive>
之後再執行上面的語句沒有報錯
查詢一下
select * from new_help_keyword limit 10;
上面的導入語句等價於
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --fields-terminated-by "\t" \ --lines-terminated-by "\n" \ --hive-import \ --hive-overwrite \ --create-hive-table \ --hive-table mydb_test.new_help_keyword \ --delete-target-dir
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
增量導入
執行增量導入之前,先清空hive資料庫中的help_keyword表中的數據
truncate table help_keyword;
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --target-dir /user/hadoop/myimport_add \ --incremental append \ --check-column help_keyword_id \ --last-value 500 \ -m 1
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
語句執行成功
查看結果
3、把MySQL資料庫中的表數據導入到hbase
普通導入
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
sqoop import \ --connect jdbc:mysql://hadoop1:3306/mysql \ --username root \ --password root \ --table help_keyword \ --hbase-table new_help_keyword \ --column-family person \ --hbase-row-key help_keyword_id
![複製代碼](https://common.cnblogs.com/images/copycode.gif)
此時會報錯,因為需要先創建Hbase裡面的表,再執行導入的語句
hbase(main):001:0> create 'new_help_keyword', 'base_info' 0 row(s) in 3.6280 seconds => Hbase::Table - new_help_keyword hbase(main):002:0>
轉自:扎心了,老鐵 https://www.cnblogs.com/qingyunzong/p/8807252.html#_label0