原文:http://www.cnblogs.com/xiaodf/p/6030102.html#42javascript
Sqoop是一個旨在Hadoop和關係數據庫或主機之間傳輸數據的工具。你可使用Sqoop從關係型數據庫管理系統(RDBMS),如MySQL、Oracle或大型機到Hadoop分佈式文件系統(HDFS)導入數據,在Hadoop中的MapReduce轉換數據,而後將數據導出到一個RDBMS 。Sqoop使用MapReduce導入和導出數據,它提供了並行操做,以及容錯。css
本文檔適用於Sqoop1。html
軟件 | 版本 |
---|---|
Sqoop | 1.4.5-cdh5.3.0 |
Mysql JDBC驅動 | 5.1.32 |
ORACLE JDBC驅動 | 和oracle版本保持一致 |
將驅動對應的jar包放置到 /usr/share/java/下。java
如:/usr/share/java/mysql-connector-java-5.1.32-bin.jar
python
sqoop import \ --connect JDBC_URL \ --username USERNAME \ --password PASSWORD \ --table TABLE \ --hive-import \ --split-by SPLIT_BY_COL \ --num-mappers N \ --hive-database HIVE_DB_NAME \ --hive-table HIVE_TABLE_NAME \ (--hive-partition-key partition_name \ --hive-partition-value partititon_value \ 附:若是是分區表則需指出分區名稱和分區值) --columns col1,clo2,col3… \ --warehouse-dir /user/hive/warehouse/ \ --fields-terminated-by ‘|’ \ --direct \ --compress
參數說明mysql
參數 | 說明 |
---|---|
--connect | 鏈接RDBMS的jdbc鏈接字符串。 示例:--connect jdbc:mysql:// MYSQL_SERVER: PORT / DBNAME 其中:mysql默認端口號爲3306; 示例:--connect jdbc:oracle:thin:USERNAME/PASSWORD@ORACLE_SERVER:PORT: SID 其中:Oracle默認端口號爲1521; thin:是驅動方式,「瘦」的意思,直接使用原生的Oracle JDBC驅動; SID:是一個數據庫的惟一標識符,是創建一個數據庫時系統自動賦予的一個初始ID。 |
--username | 鏈接RDBMS所使用的用戶名。 |
--password | 鏈接RDBMS所使用的密碼。 |
--table | 將要導入到hive的表。 |
--split-by | 分割導入任務所使用的字段。須要明確指定,推薦使用主鍵。 |
--hive-import | 插入數據到hive當中,使用hive默認的分隔符。 |
-m, --num-mappers< n> | 使用n個map任務並行導入數據。是指生成的map任務的總數量, 不是同時處於RUNNING狀態的數量。 |
--hive-database | hive當中的數據庫。 |
-- hive-table | hive當中的表名 |
--hive-partition-key | hive分區的列名 。 |
--hive-partition-value | hive分區的值。 |
--columns < col,col,col…> | 從表中導出指定的一組列的數據,用逗號分隔, oracle中列名須要大寫。 |
--warehouse-dir | (必選)能夠指定爲-warehouse-dir/user/hive/warehouse/ 即導入數據的存放路徑,若是該路徑不存在,會首先建立。 在該路徑下會生成和TABLE(--table)同名的文件夾,該文件夾下存放數據文件。 若是路徑存在,須要保證該文件夾下不存在與TABLE(--table)同名文件。 若是不手動指定,默認是啓動sqoop任務的用戶的home目錄。 |
--direct | 使用快速模式導入 |
--compress | 啓用壓縮,生成的文件爲通過壓縮的文件。 默認使用GZIP算法。 經過--compression-codec設置壓縮算法。 一般當空間不夠時可使用壓縮,不過須要注意,若是壓縮率過大可能致使CPU佔用太高。 若是能夠,推薦使用snappy。 另外,若是配置了mapreduce的「map輸出壓縮」, 那麼即便不適用—compress開關, 導入的數據文件也會使用對應的codec進行壓縮。 |
--compression-codec | 使用Hadoop Codec。(默認gzip)前提是設置了—cpmpress。 |
其餘 | 可以使用 sqoop import 命令查看幫助。 |
附:對於--warehouse-dir須要指定爲/user/hive/warehouse/但在該路徑下不能存在與TABLE(--table)同名的文件,不然導入失敗。當導入成功時,會在該路徑下生成數據文件part-m-XXXXX而且生成與TABLE(--table)同名文件,存放導入成功的標誌文件_SUCCESS。nginx
在sqoop命令中顯式指定密碼會是很不安全的操做,使用操做系統的列出正在執行的命令的方式能夠很容易的獲取到密碼。有兩種方式能夠解決這個問題。
方式一:使用-P(大寫)參數,在執行命令時再輸入密碼。
方式二:使用--password-file參數,即將密碼存放在參數指定的文件中。
算法
Sqoop支持3中不一樣的文件格式,其中一種是文本格式,兩外兩種是二進制格式。二進制格式分別是Avro和SequenceFile。使用--as-avrodatafile或--as-sequencefile以指定具體使用哪一種二進制格式。
sql
使用—compress或-z參數以壓縮導入以後的數據。默認的壓縮算法爲GZip,全部文件的後綴名均爲.gz。可使用—compress-codec來指定其餘的codec。如typescript
--compression-codec org.apache.hadoop.io.compress.BZip2Codec
使用壓縮須要將mapreduce中對應的設置項開啓,如mapreduce.output.
compress。
不一樣於JDBC接口,direct模式下使用數據庫提供的本地工具進行數據傳輸。在MySQL中使用mysqldump和mysqlimport。對於PostgreSQL,sqoop會使用pg_dump工具來導入數據。使用本地工具會極大提升性能,由於他們針對數據傳輸作了優化,以下降數據庫服務器的負擔。固然也有不少限制,好比並非全部的數據庫都提供本地工具。目前sqoop的direct模式只支持MySQL和PostgreSQL。
使用—amp-column-java參數來將列列映射到java類以覆蓋sqoop提供的默認的映射關係。
如要將c一、c二、c3分別映射爲Float、String、String,對應的設置以下所示。
sqoop import --map-column-java c1=Float,c2=String,c3=String ...
Sqoop默認使用4個併發的map任務來項hadoop傳輸數據。當數據量比較大時能夠考慮增長併發執行的map任務的數量以提升傳輸速度。使用參數—num-mappers來控制map任務的數量。
Sqoop使用「null」字符串來代替數據庫中的NULL值。對於文本類型的列,使用—null-string來設置替代NULL值得字符串,對於其餘類型的列,則使用—null-non-string來設置。
若是想使用\N來編碼NULL值,則對應sqoop命令中的值爲\N, \在JAVA中是轉義字符。
--null-string '\\N' \ --null-non-string '\\N'
使用以下命令導入全部表。sqoop會一次導入每張表,以免對數據庫服務器形成額外的負擔。
sqoop import-all-tables \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop
增量導入是每次只導入新增長的或者須要更新的數據。增量導入會大大下降數據庫服務器的負擔。
假設咱們有INTEGER類型的主鍵,而且只追加新列,而且須要按期將表的狀態同步到Hadoop中。咱們須要使用增量導入的功能。典型代碼以下所示。
sqoop import \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table visits \ --incremental append \ --check-column id \ --last-value 1
--incremental參數表示使用增量導入,參數值爲使用的增量導入的類型。,因爲咱們只添加而不修改列的值,因此使用append。增量導入中還須要額外的兩個參數:--check-column指定一個列,用於檢查新增長的數據,--last-value包含上次成功導入到Hadoop的值。
使用lastmodified模式而不是append模式來導入變化的數據。例如使用以下命令導入所last_update_date列大於「2013-05-22 01:01:01」的行。
sqoop import \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table visits \ --incremental lastmodified \ --check-column last_update_date \ --last-value "2013-05-22 01:01:01"
增量導入模式lastmodified須要一個日期(可選的類型有date、time、datetime和timestamp)列來保存列被修改的時間。
注:--last-value的值在增量導入時是包含在須要導入的範圍以內的。
Sqoop不會檢查數據是否重複,即不會按照MySQL中那樣更新數據。
Sqoop導入任務完成後會給出新的last-value,咱們能夠保存當前下來,以便下次使用。
Sqoop的metastore會保存任務的信息,因此咱們建立對應的任務便可。
sqoop job \ --create visits \ -- \ import \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table visits \ --incremental append \ --check-column id \ --last-value 0
執行任務
sqoop job --exec visits
刪除任務
sqoop job --delete visits
查看任務信息,信息中會包含last-value的當前值。
sqoop job --show visits
很不幸,每次使用sqoop job執行任務都須要手動輸入密碼。
解決方式有兩種:
第一種方式,使用password-file(「導入」一章中有介紹);
第二種方式,在sqoop-site.xml中添加以下屬性便可(添加後第一次仍然須要輸入密碼 )。
<property> <name>sqoop.metastore.client.record.password</name> <value>true</value> </property>
啓動metastore服務
sqoop metastore
客戶端鏈接到metastore服務
sqoop job --create visits \ --meta-connect \ jdbc:hsqldb:hsql://metastore.example.com:16000/sqoop \ -- \ import \ --table visits ...
顯示任務
sqoop job --list --meta-connect jdbc:hsqldb:hsql://metastore.example.com:16000/sqoop
sqoop export --connect jdbc:mysql://MYSQL_SERVER:PORT/DBNAME \ --username USERNAME \ --table TABLE \ --export-dir /user/hive/warehouse/HIVE_TABLE_NAME/ \ --num-mappers N \ --fields-terminated-by ','
附:對於hive中有null時,導入到MySQL中依然是NULL。
sqoop使用獨立的insert語句來添加每一行記錄,使用以下的方式能夠每次插入多條記錄。即批量插入,每次插入10條。
sqoop export \ -Dsqoop.export.records.per.statement=10 \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table cities \ --export-dir cities \ --batch
咱們須要確保或者全部數據均導出成功,或者不導出任何數據。爲此咱們使用臨時表,即先將數據導出到臨時表(staging-table)中,而後再轉移到目標表中。
sqoop export \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table cities \ --staging-table staging_cities
使用—update-key參數指定一列,該列能夠識別出被修改的行,一般是表中的主鍵。例以下面的示例中使用列id來更新cities表。
sqoop export \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table cities \ --update-key id
能夠指定多個列,列之間用逗號隔開。
注意,該操做只會更新已有的數據,不會插入新的數據,
使用以下的參數能夠同時插入新數據或更新已有數據。
sqoop export \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table cities \ --update-key id \ --update-mode allowinsert
Sqoop默認hdfs中的數據和數據庫中有相同數量的列而且順序相同,使用—columns參數能夠指定須要導出到數據庫中的列或者指定導出列之間的順序。如只導出coutry和city列,就可使用以下示例。
sqoop export \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table cities \ --columns country,city
你可使用—input-null-string和—input-null-no-string參數來覆蓋NULL值的替換字符串,例如使用‘\N’替換NULL值。
sqoop export \ --connect jdbc:mysql://mysql.example.com/sqoop \ --username sqoop \ --password sqoop \ --table cities \ --input-null-string '\\N' \ --input-null-non-string '\\N'
選項 | 說明 |
---|---|
--connect < jdbc-uri > | 指定JDBC鏈接字符串 |
--connection-manager < class-name > | 指定要使用的鏈接管理器類 |
--driver < class-name > | 指定要使用的JDBC驅動類 |
--hadoop-mapred-home < dir > | 指定$HADOOP_MAPRED_HOME路徑 |
--help | 打印用法幫助信息 |
--password-file | 設置用於存放認證的密碼信息文件的路徑 |
-P | 從控制檯讀取輸入的密碼 |
--password < password > | 設置認證密碼 |
--username < username > | 設置認證用戶名 |
--verbose | 打印詳細的運行信息 |
--connection-param-file < filename > | 可選,指定存儲數據庫鏈接參數的屬性文件 |
import工具,是將HDFS平臺外部的結構化存儲系統中的數據導入到Hadoop平臺,便於後續分析。咱們先看一下import工具的基本選項及其含義,以下表所示:
選項 | 說明 |
---|---|
--append | 將數據追加到HDFS上一個已存在的數據集上 |
--as-avrodatafile | 將數據導入到Avro數據文件 |
--as-sequencefile | 將數據導入到SequenceFile |
--as-textfile | 將數據導入到普通文本文件(默認) |
--boundary-query < statement > | 邊界查詢,用於建立分片(InputSplit) |
--columns < col,col,col…> | 從表中導出指定的一組列的數據 |
--delete-target-dir | 若是指定目錄存在,則先刪除掉 |
--direct | 使用直接導入模式(優化導入速度) |
--direct-split-size < n > | 分割輸入stream的字節大小(在直接導入模式下) |
--fetch-size < n > | 從數據庫中批量讀取記錄數 |
--inline-lob-limit < n > | 設置內聯的LOB對象的大小 |
-m,--num-mappers < n > | 使用n個map任務並行導入數據 |
-e,--query < statement > | 導入的查詢語句 |
--split-by < column-name > | 指定按照哪一個列去分割數據 |
--table < table-name > | 導入的源表表名 |
--target-dir < dir > | 導入HDFS的目標路徑 |
--warehouse-dir < dir > | HDFS存放表的根路徑 |
--where < where clause> | 指定導出時所使用的查詢條件 |
-z,--compress | 啓用壓縮 |
--compression-codec < c > | 指定Hadoop的codec方式(默認gzip) |
--null-string < null-string > | 若是指定列爲字符串類型,使用指定字符串替換值爲null的該類列的值 |
--null-non-string < null-string > | 若是指定列爲非字符串類型,使用指定字符串替換值爲null的該類列的值 |
hive參數
選項 | 說明 |
---|---|
--hive-home < dir > | Override $HIVE_HOME |
--hive-import | 插入數據到hive當中,使用hive的默認分隔符 |
--hive-overwrite | 覆蓋hive表中的數據 |
--create-hive-table | 建表,若是表已經存在,該操做會報錯 |
--hive-table < table-name > | 設置到hive當中的表名 |
--hive-drop-import-delims | 導入到hive時刪除 \n, \r, and \01 |
--hive-delims-replacement | 導入到hive時用自定義的字符替換掉\n, \r, and \01 |
--hive-partition-key | hive分區的key |
--hive-partition-value < v > | hive分區的值 |
--map-column-hive < map > | 類型匹配,sql類型對應到hive類型 |
HBase參數
選項 | 說明 |
---|---|
--column-family < family > | 把內容導入到hbase當中,默認是用主鍵做爲split列 |
--hbase-create-table | 建立Hbase表 |
--hbase-row-key < col > | 指定字段做爲row key ,若是輸入表包含複合主鍵,用逗號分隔 |
--hbase-table < table-name > | 指定hbase表 |
export工具,是將HDFS平臺的數據,導出到外部的結構化存儲系統中,可能會爲一些應用系統提供數據支持。咱們看一下export工具的基本選項及其含義,以下表所示:
選項 | 說明 |
---|---|
--validate < class-name > | 啓用數據副本驗證功能,僅支持單表拷貝,能夠指定驗證使用的實現類 |
--validation-threshold < class-name > | 指定驗證門限所使用的類表 |
--direct | 使用直接導出模式(優化速度) |
--export-dir < dir > | 導出過程當中HDFS源路徑 |
-m,--num-mappers < n > | 使用n個map任務並行導出 |
--table < table-name > | 導出的目的表名稱 |
--call < stored-proc-name > | 導出數據調用的指定存儲過程名 |
--update-key col-name > | 更新參考的列名稱,多個列名使用逗號分隔 |
--update-mode < mode > | 指定更新策略,包括:updateonly(默認)、allowinsert |
--input-null-string < null-string > | 使用指定字符串,替換字符串類型值爲null的列 |
--input-null-non-string < null-string > | 使用指定字符串,替換非字符串類型值爲null的列 |
--staging-table < staging-table-name> | 在數據導出到數據庫以前,數據臨時存放的表名稱 |
--clear-staging-table | 清除工做區中臨時存放的數據 |
--batch | 使用批量模式導出 |
選項 | 說明 |
---|---|
--create < job-id > | 定義sqoop job |
--delete < job-id> | 刪除sqoop job |
--exec < job-id> | 執行sqoop job |
--show < job-id> | 查看sqoop job狀態 |
--list | 查看全部sqoop job |