Sqoop使用手冊


轉載請注明出處http://www.cnblogs.com/xiaodf/

1 Sqoop概述

Sqoop是一個旨在Hadoop和關系數據庫或主機之間傳輸數據的工具。你可以使用Sqoop從關系型數據庫管理系統(RDBMS),如MySQL、Oracle或大型機到Hadoop分布式文件系統(HDFS)導入數據,在Hadoop中的MapReduce轉換數據,然后將數據導出到一個RDBMS 。Sqoop使用MapReduce導入和導出數據,它提供了並行操作,以及容錯。

2 版本說明

本文檔適用於Sqoop1。

軟件 版本
Sqoop 1.4.5-cdh5.3.0
Mysql JDBC驅動 5.1.32
ORACLE JDBC驅動 和oracle版本保持一致

3 驅動安裝

3.1 MySQL

將驅動對應的jar包放置到 /usr/share/java/下。

如:/usr/share/java/mysql-connector-java-5.1.32-bin.jar

4 基本用法

4.1 導入

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

參數說明

參數 說明
--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。

4.1.1 保護密碼

在sqoop命令中顯式指定密碼會是很不安全的操作,使用操作系統的列出正在執行的命令的方式可以很容易的獲取到密碼。有兩種方式可以解決這個問題。
方式一:使用-P(大寫)參數,在執行命令時再輸入密碼。
方式二:使用--password-file參數,即將密碼存放在參數指定的文件中。

4.1.2 使用其他文件格式

Sqoop支持3中不同的文件格式,其中一種是文本格式,兩外兩種是二進制格式。二進制格式分別是Avro和SequenceFile。使用--as-avrodatafile或--as-sequencefile以指定具體使用哪種二進制格式。

4.1.3 壓縮導入的數據

使用—compress或-z參數以壓縮導入之后的數據。默認的壓縮算法為GZip,所有文件的后綴名均為.gz。可以使用—compress-codec來指定其他的codec。如

--compression-codec org.apache.hadoop.io.compress.BZip2Codec

使用壓縮需要將mapreduce中對應的設置項開啟,如mapreduce.output.
compress。

4.1.4 提高傳輸速度

不同於JDBC接口,direct模式下使用數據庫提供的本地工具進行數據傳輸。在MySQL中使用mysqldump和mysqlimport。對於PostgreSQL,sqoop會使用pg_dump工具來導入數據。使用本地工具會極大提高性能,因為他們針對數據傳輸做了優化,以降低數據庫服務器的負擔。當然也有很多限制,比如並不是所有的數據庫都提供本地工具。目前sqoop的direct模式只支持MySQL和PostgreSQL。

4.1.5 自定義類型映射

使用—amp-column-java參數來將列列映射到java類以覆蓋sqoop提供的默認的映射關系。
如要將c1、c2、c3分別映射為Float、String、String,對應的設置如下所示。

sqoop import --map-column-java c1=Float,c2=String,c3=String ...

4.1.6 並行控制

Sqoop默認使用4個並發的map任務來項hadoop傳輸數據。當數據量比較大時可以考慮增加並發執行的map任務的數量以提高傳輸速度。使用參數—num-mappers來控制map任務的數量。

4.1.7 對NULL值進行編碼

Sqoop使用“null”字符串來代替數據庫中的NULL值。對於文本類型的列,使用—null-string來設置替代NULL值得字符串,對於其他類型的列,則使用—null-non-string來設置。

如果想使用\N來編碼NULL值,則對應sqoop命令中的值為\N, \在JAVA中是轉義字符。

--null-string '\\N' \
--null-non-string '\\N'

4.1.8 導入所有表

使用如下命令導入所有表。sqoop會一次導入每張表,以避免對數據庫服務器造成額外的負擔。

sqoop import-all-tables \

   --connect jdbc:mysql://mysql.example.com/sqoop \

   --username sqoop \

   --password sqoop

4.2 增量導入

增量導入是每次只導入新增加的或者需要更新的數據。增量導入會大大降低數據庫服務器的負擔。

4.2.1 只導入細膩數據

假設我們有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的值。

4.2.2 增量導入可變數據

使用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中那樣更新數據。

4.2.3 保存last-value

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

4.2.4 在metastore中保存密碼

很不幸,每次使用sqoop job執行任務都需要手動輸入密碼。
解決方式有兩種:
第一種方式,使用password-file(“導入”一章中有介紹);
第二種方式,在sqoop-site.xml中添加如下屬性即可(添加后第一次仍然需要輸入密碼 )。

<property>
   <name>sqoop.metastore.client.record.password</name>
   <value>true</value>
</property>

4.2.5 客戶端之間共享metastore

啟動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

4.3 導出

4.3.1 hive導出數據到mysql

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。

4.3.2 批量插入

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

4.3.3 導出所有數據或不導出任何數據

我們需要確保或者所有數據均導出成功,或者不導出任何數據。為此我們使用臨時表,即先將數據導出到臨時表(staging-table)中,然后再轉移到目標表中。

sqoop export \
   --connect jdbc:mysql://mysql.example.com/sqoop \
   --username sqoop \
   --password sqoop \
   --table cities \
   --staging-table staging_cities

4.3.4 更新已有數據

使用—update-key參數指定一列,該列可以識別出被修改的行,通常是表中的主鍵。例如下面的示例中使用列id來更新cities表。

sqoop export \
   --connect jdbc:mysql://mysql.example.com/sqoop \
   --username sqoop \
   --password sqoop \
   --table cities \
   --update-key id

可以指定多個列,列之間用逗號隔開。
注意,該操作只會更新已有的數據,不會插入新的數據,

4.3.5 更新或插入數據

使用如下的參數可以同時插入新數據或更新已有數據。

sqoop export \
   --connect jdbc:mysql://mysql.example.com/sqoop \
   --username sqoop \
   --password sqoop \
   --table cities \
   --update-key id \
   --update-mode allowinsert

4.3.6 只導出某些列

Sqoop默認hdfs中的數據和數據庫中有相同數量的列並且順序相同,使用—columns參數可以指定需要導出到數據庫中的列或者指定導出列之間的順序。如只導出coutry和city列,就可以使用如下示例。

sqoop export \
   --connect jdbc:mysql://mysql.example.com/sqoop \
   --username sqoop \
   --password sqoop \
   --table cities \
   --columns country,city

4.3.7 編碼NULL值

你可以使用—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'

5 附:import和export參數詳解

5.1 import和export工具通用選項

選項 說明
--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 > 可選,指定存儲數據庫連接參數的屬性文件

5.2 數據導入工具import參數詳解

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表

5.3 數據導出工具export參數詳解

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 使用批量模式導出

5.4 Sqoop Job參數詳解

選項 說明
--create < job-id > 定義sqoop job
--delete < job-id> 刪除sqoop job
--exec < job-id> 執行sqoop job
--show < job-id> 查看sqoop job狀態
--list 查看所有sqoop job


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM