Sqoop是一種用于在Hadoop和關(guān)系數(shù)據(jù)庫(kù)或大型機(jī)之間傳輸數(shù)據(jù)的工具二跋。您可以使用Sqoop從關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)(如MySQL麸锉、Oracle或大型機(jī))導(dǎo)入數(shù)據(jù)到Hadoop分布式文件系統(tǒng)(HDFS),在Hadoop MapReduce中轉(zhuǎn)換數(shù)據(jù)冀偶,然后將數(shù)據(jù)導(dǎo)出回RDBMS醒第。
一、安裝
測(cè)試環(huán)境:centos7进鸠、JDK8稠曼、hadoop2.7.2
step1: 下載安裝
到官網(wǎng)選擇適合鏡像地址下載 sqoop download
說(shuō)明:sqoop對(duì)應(yīng)hadoop2.x的版本不要求小本版號(hào)一致,無(wú)須糾結(jié)hadoop2.7.2和sqoop-1.4.7.bin__hadoop-2.6.0不兼容
wget http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
tar xvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt
ln -s /opt/sqoop-1.4.7.bin__hadoop-2.6.0/ /opt/apps/sqoop
step2: 修改配置
sqoop啟動(dòng)環(huán)境配置文件
cp /opt/apps/sqoop/conf/sqoop-env-template.sh /opt/apps/sqoop/conf/sqoop-env.sh
在bin/configure-sqoop去掉未安裝的服務(wù)如(HCatalog客年、Accumulo)霞幅。否則使用時(shí)會(huì)報(bào)相應(yīng)未安裝服務(wù)的錯(cuò)誤信息。
vi /opt/apps/sqoop/bin/configure-sqoop
134 ## Moved to be a runtime check in sqoop.
135 #if [ ! -d "${HCAT_HOME}" ]; then
136 # echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
137 # echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
138 #fi
139 #
140 #if [ ! -d "${ACCUMULO_HOME}" ]; then
141 # echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
142 # echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
143 #fi
原文件如下:
image.png
setp3: 添加驅(qū)動(dòng)
以mysql驅(qū)動(dòng)為例量瓜,驅(qū)動(dòng)下載地址
將驅(qū)動(dòng)包添加到lib/目錄下
wget -P /opt/apps/sqoop/lib/ http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.40/mysql-connector-java-5.1.40.jar
step4: 配置環(huán)境變量(可選)
若不配置環(huán)境變量司恳,需到sqoop安裝目錄的bin目錄下執(zhí)行sqoop命令
vi /etc/profile
export SQOOP_HOME=/opt/apps/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
source /etc/profile
二、使用介紹
使用help命令查看sqoop命令幫助
# ./bin/sqoop help
18/12/02 09:33:12 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
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.
由上可知命令格式:sqoop COMMAND [ARGS]
2.1 參數(shù)介紹
2.1.1 sqoop import
- 連接數(shù)據(jù)庫(kù)參數(shù)
參數(shù) | 描述 |
---|---|
--connect <jdbc-uri> | 指定JDBC連接字符串 |
--connection-manager <class-name> | 指定要使用的連接管理器類 |
--driver <class-name> | 手動(dòng)指定要使用的JDBC驅(qū)動(dòng)程序類 |
--hadoop-mapred-home <dir> | 覆蓋$HADOOP_MAPRED_HOME變量 |
--help | 打印使用說(shuō)明 |
--password-file | 為包含身份驗(yàn)證密碼的文件設(shè)置路徑 |
-P | 從控制臺(tái)讀取密碼 |
--password <password> | 設(shè)置身份驗(yàn)證密碼 |
--username <username> | 設(shè)置身份驗(yàn)證用戶名 |
--verbose | 工作時(shí)打印更多信息 |
--connection-param-file <filename> | 提供連接參數(shù)的可選屬性文件 |
--relaxed-isolation | 設(shè)置連接事務(wù)隔離榔至,以便為映射器讀取未提交的數(shù)據(jù)抵赢。 |
a、默認(rèn)情況下唧取,Sqoop使用映射器中的讀提交事務(wù)隔離來(lái)導(dǎo)入數(shù)據(jù)铅鲤。這在所有ETL工作流中可能不是理想的,可能需要減少隔離保證枫弟。
--relaxed-isolation
選項(xiàng)可用于指示Sqoop使用read uncommitted隔離級(jí)別邢享。所有數(shù)據(jù)庫(kù)(例如Oracle)不支持讀取未提交(read uncommitted)的隔離級(jí)別,因此指定選項(xiàng)--relaxed-isolation
可能不支持所有數(shù)據(jù)庫(kù)淡诗。
eg:
sqoop import --connect jdbc:mysql://database.example.com/employees --username aaron --password 12345
#Sqoop將讀取密碼文件的全部?jī)?nèi)容骇塘,并將其用作密碼。這將包括任何尾隨的空白字符韩容,例如大多數(shù)文本編輯器默認(rèn)添加的新行字符款违。您需要確保您的密碼文件只包含屬于您的密碼的字符。
#在命令行上群凶,您可以使用帶有開關(guān)-n的命令echo來(lái)存儲(chǔ)密碼插爹,而不需要任何尾隨的空格字符。例如,要存儲(chǔ)密碼secret赠尾,可以調(diào)用echo -n“secret”> .file力穗。
$ sqoop import --connect jdbc:mysql://database.example.com/employees --username venkatesh --password-file ${user.home}/.password
- 更詳細(xì)的驗(yàn)證參數(shù)
參數(shù) | 描述 |
---|---|
--validate | 啟用數(shù)據(jù)復(fù)制的驗(yàn)證,只支持單表復(fù)制气嫁。 |
--validator <class-name> | 指定要使用的validator類当窗。 |
--validation-threshold <class-name> | 指定要使用的驗(yàn)證閾值類。 |
--validation-failurehandler <class-name> | 指定要使用的驗(yàn)證失敗處理程序類寸宵。 |
- 導(dǎo)入控制參數(shù)
參數(shù) | 描述 |
---|---|
--append | 將數(shù)據(jù)附加到HDFS中的現(xiàn)有數(shù)據(jù)集 |
--as-avrodatafile | 導(dǎo)入數(shù)據(jù)到Avro數(shù)據(jù)文件 |
--as-sequencefile | 將數(shù)據(jù)導(dǎo)入sequencefile |
--as-textfile | 將數(shù)據(jù)導(dǎo)入為純文本(默認(rèn)) |
--as-parquetfile | 將數(shù)據(jù)導(dǎo)入拼花地板文件 |
--boundary-query <statement> | 用于創(chuàng)建分割的邊界查詢 |
--columns <col,col,col…> | 要從表導(dǎo)入的列 |
--delete-target-dir | 如果導(dǎo)入目標(biāo)目錄存在則刪除 |
--direct | 如果數(shù)據(jù)庫(kù)存在崖面,則使用direct(直)連接器 |
--fetch-size <n> | 一次從數(shù)據(jù)庫(kù)讀取的條目數(shù)。 |
--inline-lob-limit <n> | 設(shè)置內(nèi)聯(lián)LOB的最大大小 |
-m,--num-mappers <n> | 使用n個(gè)映射任務(wù)并行導(dǎo)入 |
-e,--query <statement> | 導(dǎo)入語(yǔ)句的結(jié)果梯影。 |
--split-by <column-name> | 用于分隔工作單元的表的列嘶朱。不能與--autoreset-to-one-mapper選項(xiàng)一起使用。 |
--split-limit <n> | 每個(gè)分割大小的上限光酣。這只適用于整型和日期列疏遏。對(duì)于日期或時(shí)間戳字段,它以秒計(jì)算救军。 |
--autoreset-to-one-mapper | 如果一個(gè)表沒有主鍵财异,也沒有提供按列拆分,導(dǎo)入應(yīng)該使用一個(gè)映射器唱遭。不能與--split-by <col>選項(xiàng)一起使用戳寸。 |
--table <table-name> | 要讀的表 |
--target-dir <dir> | HDFS目的地dir |
--temporary-rootdir <dir> | 用于導(dǎo)入期間創(chuàng)建的臨時(shí)文件的HDFS目錄(覆蓋默認(rèn)的“_sqoop”) |
--warehouse-dir <dir> | 表目標(biāo)的HDFS父節(jié)點(diǎn) |
--where <where clause> | 在導(dǎo)入過(guò)程中使用WHERE子句 |
-z,--compress | 啟用壓縮 |
--compression-codec <c> | 使用Hadoop編解碼器(默認(rèn)gzip) |
--null-string <null-string> | 為字符串列的空值編寫的字符串 |
--null-non-string <null-string> | 為非字符串列的null值編寫的字符串 |
a、 --null-string和--null-non-string 參數(shù)是可選的拷泽。如果沒有指定疫鹊,那么將使用字符串“null”。
b司致、 當(dāng)通過(guò)Oozie啟動(dòng)Sqoop命令時(shí)拆吆,使用選項(xiàng)--skip-dist-cache
將跳過(guò)Sqoop將依賴項(xiàng)復(fù)制到作業(yè)緩存并保存大量I/O的步驟。(控制分布式緩存)
c脂矫、默認(rèn)情況下枣耀,導(dǎo)入過(guò)程將使用JDBC,一些數(shù)據(jù)庫(kù)可以使用特定于數(shù)據(jù)庫(kù)的數(shù)據(jù)移動(dòng)工具以更高性能的方式執(zhí)行導(dǎo)入庭再。例如捞奕,MySQL提供了mysqldump工具,它可以非持羟幔快速地將數(shù)據(jù)從MySQL導(dǎo)出到其他系統(tǒng)颅围。通過(guò)提--direct參數(shù)
,您指定Sqoop應(yīng)該嘗試直接導(dǎo)入通道恨搓。這個(gè)通道可能比使用JDBC的性能更高院促。
d、默認(rèn)情況下,Sqoop會(huì)將一個(gè)名為foo的表導(dǎo)入到HDFS中主目錄中的一個(gè)名為foo的目錄中一疯。例如,如果您的用戶名是someuser夺姑,那么導(dǎo)入工具將寫入/user/someuser/foo/(files)墩邀。您可以使用--warehouse-dir
參數(shù)調(diào)整導(dǎo)入的父目錄≌嫡悖或者顯式地指定目標(biāo)目錄--target-dir
眉睹。--target-dir
和--warehouse-dir
互不兼容。
e废膘、默認(rèn)情況下竹海,導(dǎo)入將轉(zhuǎn)到新的目標(biāo)位置。如果目標(biāo)目錄已經(jīng)存在于HDFS中丐黄,Sqoop將拒絕導(dǎo)入和覆蓋該目錄的內(nèi)容斋配。如果使用——append參數(shù),Sqoop將把數(shù)據(jù)導(dǎo)入臨時(shí)目錄灌闺,然后將文件重命名為普通目標(biāo)目錄艰争,其方式不會(huì)與該目錄中的現(xiàn)有文件名沖突。
f桂对、當(dāng)sqoop從企業(yè)存儲(chǔ)導(dǎo)入數(shù)據(jù)時(shí)甩卓,表名和列名可能具有不是有效Java標(biāo)識(shí)符或Avro/Parquet標(biāo)識(shí)符的字符。為了解決這個(gè)問(wèn)題蕉斜,sqoop將這些字符轉(zhuǎn)換為作為模式創(chuàng)建的一部分逾柿。任何以(下劃線)字符開頭的列名都將被轉(zhuǎn)換為兩個(gè)下劃線字符。例如宅此,_AVRO將被轉(zhuǎn)換為__AVRO机错。在HCatalog導(dǎo)入的情況下,當(dāng)映射到HCatalog列時(shí)父腕,列名將轉(zhuǎn)換為小寫毡熏。這種情況在未來(lái)可能會(huì)改變。
g侣诵、默認(rèn)情況下痢法,數(shù)據(jù)沒有壓縮。您可以使用-z或-compress參數(shù)的deflate (gzip)算法壓縮數(shù)據(jù)杜顺,或者使用-compression-codec
參數(shù)指定任何Hadoop壓縮編解碼器财搁。這適用于SequenceFile、text和Avro文件躬络。
h尖奔、分隔文本是默認(rèn)的導(dǎo)入格式。您還可以使用--as-textfile
參數(shù)顯式地指定它。該參數(shù)將把每個(gè)記錄的基于字符串的表示形式寫入輸出文件提茁,在各個(gè)列和行之間使用分隔符淹禾。這些分隔符可以是逗號(hào)、制表符或其他字符茴扁。(可以選擇分隔符
eg:
選擇列數(shù)據(jù)導(dǎo)入
sqoop import ... --columns "name,employee_id,jobtitle" --where "id > 400" ...
自由格式的查詢導(dǎo)入
sqoop import --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' --split-by a.id --target-dir /user/foo/joinresults
sqoop import --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' -m 1 --target-dir /user/foo/joinresults
在使用direct模式時(shí)铃岔,可以指定應(yīng)該傳遞給底層工具的其他參數(shù)。如果參數(shù)--
在命令行上給出峭火,那么后續(xù)參數(shù)將直接發(fā)送到底層工具毁习。例如,下面調(diào)整mysqldump使用的字符集:
sqoop import --connect jdbc:mysql://server.foo.com/db --table bar --direct -- --default-character-set=latin1
注意:
$CONDITIONS是必須條件存在于--query
a卖丸、如果使用雙引號(hào)(")包裝查詢纺且,則必須使用\$CONDITIONS而不是僅使用$CONDITIONS來(lái)禁止shell將其視為shell變量(即使用斜桿轉(zhuǎn)義)。例如稍浆,雙引號(hào)查詢可能類似于:“SELECT * FROM x WHERE a='foo' AND \$CONDITIONS”载碌。
b、在當(dāng)前版本的Sqoop中使用自由形式查詢的功能僅限于簡(jiǎn)單查詢衅枫,其中沒有不明確的投影恐仑,where子句中沒有OR條件。使用復(fù)雜的查詢(例如具有子查詢或連接的查詢)會(huì)導(dǎo)致不明確的投影为鳄,從而導(dǎo)致意外的結(jié)果裳仆。
- 控制類型映射參數(shù)
參數(shù) | 描述 |
---|---|
--map-column-java <mapping> | 為已配置列覆蓋從SQL到Java類型的映射。 |
--map-column-hive <mapping> | 為配置的列覆蓋從SQL到Hive類型的映射孤钦。 |
eg: <name of column>=<new type>
sqoop import ... --map-column-java id=String,value=Integer
- 增量導(dǎo)入?yún)?shù)
參數(shù) | 描述 |
---|---|
--check-column (col) | 指定在決定導(dǎo)入哪些行時(shí)要檢查的列歧斟。(該列不應(yīng)該是CHAR/NCHAR/VARCHAR/VARNCHAR/ LONGVARCHAR/LONGNVARCHAR類型) |
--incremental (mode) | 指定Sqoop如何確定哪些行是新的。模式的合法值包括append和lastmodified偏形。 |
--last-value (value) | 指定上一個(gè)導(dǎo)入的檢查列的最大值静袖。 |
- 大對(duì)象
參數(shù) | 描述 |
---|---|
輸出行格式化參數(shù): | |
--enclosed-by <char> | 設(shè)置所需的字段包圍字符 |
--escaped-by <char> | 設(shè)置轉(zhuǎn)義字符 |
--fields-terminated-by <char> | 設(shè)置字段分隔符字符\b (backspace) \n (newline) \r (carriage return) \t (tab) " (double-quote) \' (single-quote) \ (backslash) \0 (NUL) |
--lines-terminated-by <char> | 設(shè)置行尾字符 |
--mysql-delimiters | 使用MySQL的默認(rèn)分隔符set: fields:, lines: \n escape -by: \ option -enclosed-by: ' |
--optionally-enclosed-by <char> | 設(shè)置一個(gè)字段包圍字符 |
輸入解析參數(shù): | |
--input-enclosed-by <char> | 設(shè)置所需的字段外殼 |
--input-escaped-by <char> | 設(shè)置輸入轉(zhuǎn)義字符 |
--input-fields-terminated-by <char> | 設(shè)置輸入字段分隔符 |
--input-lines-terminated-by <char> | 設(shè)置輸入行結(jié)束符 |
--input-optionally-enclosed-by <char> | 設(shè)置一個(gè)字段包圍字符 |
a俊扭、Sqoop以特定的方式處理大型對(duì)象(BLOB和CLOB列)队橙。如果這個(gè)數(shù)據(jù)確實(shí)很大,那么這些列不應(yīng)該像大多數(shù)列那樣在內(nèi)存中完全物化以便操作萨惑。相反捐康,它們的數(shù)據(jù)以流方式處理。大型對(duì)象可以與其他數(shù)據(jù)一起內(nèi)聯(lián)存儲(chǔ)庸蔼,在這種情況下解总,它們?cè)诿看卧L問(wèn)時(shí)都在內(nèi)存中完全物化,或者它們可以存儲(chǔ)在連接到主數(shù)據(jù)存儲(chǔ)的輔助存儲(chǔ)文件中姐仅。默認(rèn)情況下花枫,小于16mb的大型對(duì)象與其他數(shù)據(jù)一起存儲(chǔ)刻盐。在較大的尺寸下,它們存儲(chǔ)在導(dǎo)入目標(biāo)目錄的_lobs子目錄中的文件中劳翰。這些文件存儲(chǔ)在一個(gè)單獨(dú)的格式優(yōu)化大型記錄存儲(chǔ),可容納2 ^ 63字節(jié)的記錄敦锌。lob溢出到單獨(dú)文件中的大小由
--inline-lob-limit
參數(shù)控制,該參數(shù)接受一個(gè)參數(shù)佳簸,該參數(shù)指定要保持內(nèi)聯(lián)的最大lob大小(以字節(jié)為單位)乙墙。如果將內(nèi)聯(lián)LOB限制設(shè)置為0,則所有大型對(duì)象都將放置在外部存儲(chǔ)中溺蕉。
b、即使Hive支持轉(zhuǎn)義字符悼做,它也不能處理?yè)Q行字符的轉(zhuǎn)義疯特。此外,它不支持在封閉的字符串中包含字段分隔符的封閉字符的概念肛走。因此漓雅,建議您在使用Hive時(shí)選擇無(wú)歧義字段和記錄終止分隔符,而不需要轉(zhuǎn)義和包圍字符;這是由于Hive的輸入解析能力的限制
c朽色、當(dāng)Sqoop將數(shù)據(jù)導(dǎo)入到HDFS時(shí)邻吞,它會(huì)生成一個(gè)Java類,該類可以重新解釋在執(zhí)行分隔格式導(dǎo)入時(shí)創(chuàng)建的文本文件葫男。分隔符是用參數(shù)選擇的抱冷,例如--fields-terminated-by
;它控制如何將數(shù)據(jù)寫到磁盤,以及生成的parse()方法如何重新解釋這些數(shù)據(jù)梢褐。parse()方法使用的分隔符可以獨(dú)立于輸出參數(shù)進(jìn)行選擇旺遮,方法是使用--input-field -terminated-by
,等等盈咳。例如耿眉,這對(duì)于生成可以解析用一組分隔符創(chuàng)建的記錄并發(fā)出t的類非常有用
eg:
sqoop import --optionally-enclosed-by '\"' (the rest as above)...
- 將數(shù)據(jù)導(dǎo)入Hive參數(shù)
參數(shù) | 描述 |
---|---|
--hive-home <dir> | 重寫覆蓋$HIVE_HOME變量 |
--hive-import | 將表導(dǎo)入Hive(如果沒有設(shè)置任何分隔符,則使用Hive的默認(rèn)分隔符)鱼响。 |
--hive-overwrite | 覆蓋Hive表中的現(xiàn)有數(shù)據(jù)鸣剪。 |
--create-hive-table | 如果設(shè)置,那么如果目標(biāo)hive表存在丈积,作業(yè)將失敗筐骇。默認(rèn)情況下,此屬性為false江滨。 |
--hive-table <table-name> | 設(shè)置導(dǎo)入到Hive時(shí)要使用的表名拥褂。 |
--hive-drop-import-delims | 將\n、\r和\01從字符串字段導(dǎo)入到Hive時(shí)去除牙寞。 |
--hive-delims-replacement | 將\n饺鹃、\r和\01從字符串字段導(dǎo)入到Hive時(shí)用用戶定義的字符串替換莫秆。 |
--hive-partition-key | 要分區(qū)的hive字段的名稱被切分 |
--hive-partition-value <v> | 字符串值,作為在此作業(yè)中導(dǎo)入到hive的分區(qū)鍵悔详。 |
--map-column-hive <map> | 為配置的列覆蓋從SQL類型到Hive類型的默認(rèn)映射镊屎。如果在這個(gè)參數(shù)中指定逗號(hào),則使用URL編碼的鍵和值茄螃,例如缝驳,使用DECIMAL(1%2C%201)而不是DECIMAL(1,1)。 |
Sqoop導(dǎo)入工具的主要功能是將數(shù)據(jù)上傳到HDFS中的文件中归苍。如果您有一個(gè)與HDFS集群關(guān)聯(lián)的Hive元數(shù)據(jù)存儲(chǔ)用狱,Sqoop還可以通過(guò)生成和執(zhí)行CREATE TABLE語(yǔ)句將數(shù)據(jù)導(dǎo)入到Hive中,以定義數(shù)據(jù)在Hive中的布局拼弃。將數(shù)據(jù)導(dǎo)入Hive非常簡(jiǎn)單夏伊,只需--hive-import
選項(xiàng)添加到Sqoop命令行即可。
如果Hive表已經(jīng)存在吻氧,您可以指定--hive-overwrite
選項(xiàng)溺忧,以指示必須替換Hive中現(xiàn)有的表。將數(shù)據(jù)導(dǎo)入HDFS或省略此步驟后盯孙,Sqoop將生成一個(gè)Hive腳本鲁森,其中包含一個(gè)使用Hive類型定義列的CREATE TABLE操作,以及一個(gè)LOAD DATA INPATH
語(yǔ)句振惰,用于將數(shù)據(jù)文件移動(dòng)到Hive 的 warehouse目錄中歌溉。腳本將通過(guò)調(diào)用Sqoop運(yùn)行的機(jī)器上安裝的hive副本來(lái)執(zhí)行。如果您有多個(gè)Hive安裝骑晶,或者Hive不在$PATH中研底,請(qǐng)使用--hive-home
選項(xiàng)來(lái)標(biāo)識(shí)Hive安裝目錄。Sqoop將從這里使用$HIVE_HOME/bin/hive
透罢。
注意:
a榜晦、導(dǎo)入hive不兼容--as-avrodatafile 和 --as-sequencefile參數(shù)。
即使Hive支持轉(zhuǎn)義字符羽圃,它也不能處理?yè)Q行字符的轉(zhuǎn)義乾胶。此外,它不支持在封閉的字符串中包含字段分隔符的封閉字符的概念朽寞。因此识窿,建議您在使用Hive時(shí)選擇無(wú)歧義字段和記錄終止分隔符,而不需要轉(zhuǎn)義和包圍字符;這是由于Hive的輸入解析能力的限制脑融。如果在將數(shù)據(jù)導(dǎo)入Hive時(shí)確實(shí)使用了-escape -by喻频、- encloed -by或-option - encloed -by, Sqoop將打印一條警告消息。
如果數(shù)據(jù)庫(kù)的行包含包含Hive默認(rèn)行分隔符(\n和\r字符)或列分隔符(\01字符)的字符串字段肘迎,那么Hive在使用sqoop導(dǎo)入的數(shù)據(jù)時(shí)會(huì)遇到問(wèn)題甥温《突停可以使用-hive-drop-import-delims
選項(xiàng)在導(dǎo)入時(shí)刪除這些字符,以提供與hive兼容的文本數(shù)據(jù)姻蚓∷挝啵或者,您可以使用--hive-delims-replacement
選項(xiàng)狰挡,在導(dǎo)入時(shí)將這些字符替換為用戶定義的字符串捂龄,以提供與hive兼容的文本數(shù)據(jù)。只有在使用Hive的默認(rèn)分隔符時(shí)才應(yīng)該使用這些選項(xiàng)加叁,如果指定了不同的分隔符倦沧,則不應(yīng)該使用這些選項(xiàng)。
Sqoop將字段和記錄分隔符傳遞到Hive它匕。如果你不設(shè)置任何分隔符和使用--hive-import
,字段分隔符將被設(shè)置為^A
和記錄分隔符將被設(shè)置為\ n
與hive的默認(rèn)分隔符是一致的展融。
Sqoop將默認(rèn)導(dǎo)入NULL值作為字符串NULL。然而超凳,Hive使用字符串\N
來(lái)表示NULL值愈污,因此處理NULL(比如is NULL)的謂詞將不能正確工作耀态。如果您希望正確地保留NULL值轮傍,那么在導(dǎo)入作業(yè)中應(yīng)該附加參數(shù)--null-string
和--null-non-string
,或者在導(dǎo)出作業(yè)中附加參數(shù)--input-null-string
和--input-null-non-string
首装。由于sqoop在生成的代碼中使用了這些參數(shù)创夜,您需要正確地將值\N
轉(zhuǎn)義到\\N
:
sqoop import ... --null-string '\\N' --null-non-string '\\N'
默認(rèn)情況下,Hive中使用的表名與源表的表名相同仙逻。您可以使用--hive-table
選項(xiàng)控制輸出表名驰吓。
Hive可以將數(shù)據(jù)放入分區(qū),以獲得更高效的查詢性能系奉。通過(guò)指定—分分區(qū)鍵和—分分區(qū)值參數(shù)檬贰,可以告訴Sqoop作業(yè)將Hive的數(shù)據(jù)導(dǎo)入到特定分區(qū)。分區(qū)值必須是字符串缺亮。有關(guān)分區(qū)的詳細(xì)信息翁涤,請(qǐng)參閱Hive文檔。
您可以使用--compress
和--compression-codec
選項(xiàng)將壓縮表導(dǎo)入Hive萌踱。壓縮導(dǎo)入到Hive中的表的一個(gè)缺點(diǎn)是葵礼,許多編解碼器不能通過(guò)并行映射任務(wù)進(jìn)行處理。然而并鸵,lzop編解碼器支持拆分鸳粉。使用此編解碼器導(dǎo)入表時(shí),Sqoop將自動(dòng)索引文件园担,以便使用正確的InputFormat拆分和配置新的Hive表届谈。這個(gè)特性目前要求用lzop編解碼器壓縮表的所有分區(qū)枯夜。
- 將數(shù)據(jù)導(dǎo)入Hbase參數(shù)
參數(shù) | 描述 |
---|---|
--column-family <family> | 為導(dǎo)入設(shè)置目標(biāo)列族 |
--hbase-create-table | 如果指定,則創(chuàng)建丟失的HBase表 |
--hbase-row-key <col> | 指定將哪個(gè)輸入列用作行鍵疼约。如果輸入表包含復(fù)合鍵卤档,那么<col>必須以逗號(hào)分隔的復(fù)合鍵屬性列表的形式出現(xiàn) |
--hbase-table <table-name> | 指定要用作目標(biāo)的HBase表,而不是HDFS |
--hbase-bulkload | 支持批量加載 |
通過(guò)指定--hbase-table
程剥,可以指示Sqoop導(dǎo)入HBase中的表劝枣,而不是HDFS中的目錄。Sqoop將數(shù)據(jù)導(dǎo)入到指定的表中织鲸,作為-hbase-table
的參數(shù)舔腾。輸入表的每一行將被轉(zhuǎn)換為輸出表的一行的HBase Put操作。每一行的鍵是從輸入的一列中獲取的搂擦。默認(rèn)情況下稳诚,Sqoop將使用按分列作為行鍵列。如果沒有指定瀑踢,它將嘗試標(biāo)識(shí)源表的主鍵列(如果有的話)扳还。您可以使--hbase-row-key
手動(dòng)指定行鍵列。每個(gè)輸出列將放置在相同的列族中橱夭,必須使用--column-family
指定氨距。
注意:
導(dǎo)入hbase不支持--direct
參數(shù)
如果輸入表具有復(fù)合鍵,那么--hbase-row-key
必須以逗號(hào)分隔的復(fù)合鍵屬性列表的形式出現(xiàn)棘劣。在這種情況下俏让,HBase行的行鍵將通過(guò)使用下劃線作為分隔符組合組合鍵屬性的值生成。注意:只有在指定了參--hbase-row-key
時(shí)茬暇,具有組合鍵的表的Sqoop導(dǎo)入才能工作首昔。
如果目標(biāo)表和列族不存在,Sqoop作業(yè)將退出糙俗,并出現(xiàn)錯(cuò)誤勒奇。您應(yīng)該在運(yùn)行導(dǎo)入之前創(chuàng)建目標(biāo)表和列系列。如果指定--hbase-create-table
, Sqoop將使用HBase配置中的默認(rèn)參數(shù)巧骚,在目標(biāo)表和列系列不存在的情況下創(chuàng)建它們赊颠。
Sqoop當(dāng)前將所有值序列化為HBase,方法是將每個(gè)字段轉(zhuǎn)換為其字符串表示形式(就像以文本模式導(dǎo)入HDFS一樣)网缝,然后將該字符串的UTF-8字節(jié)插入目標(biāo)單元格巨税。Sqoop將跳過(guò)除行鍵列之外的所有列中包含空值的所有行。
為了減少hbase上的負(fù)載粉臊,Sqoop可以進(jìn)行批量加載草添,而不是直接寫操作。若要使用批量加載扼仲,請(qǐng)啟--hbase-bulkload
远寸。
導(dǎo)入數(shù)據(jù)到Accumulo
略抄淑,詳情>>其他導(dǎo)入屬性配置
參數(shù) | 描述 |
---|---|
sqoop.bigdecimal.format.string | 控件將BigDecimal列存儲(chǔ)為字符串時(shí)如何格式化。true(默認(rèn)值)將使用toPlainString來(lái)存儲(chǔ)它們驰后,而不使用指數(shù)組件(0.0000001);而false的值將使用toString肆资,該字符串可能包含指數(shù)(1E-7) |
sqoop.hbase.add.row.key | 當(dāng)設(shè)置為false(默認(rèn))時(shí),Sqoop不會(huì)將用作行鍵的列添加到HBase中的行數(shù)據(jù)中灶芝。當(dāng)設(shè)置為true時(shí)郑原,用作行鍵的列將被添加到HBase中的行數(shù)據(jù)中。 |
sqoop import -D property.name=property.value ...
或者修改conf/sqoop-site.xml
<property>
<name>property.name</name>
<value>property.value</value>
</property>
完整示例1:mysql導(dǎo)入hbase
import
--connect
jdbc:mysql://host:3306/database
--username
'user'
--password
'pwd'
--query
'SELECT concat_ws("_",meter_id,DATE_FORMAT(create_time,"%Y%m%d%H%i%s")) AS row_key,meter_id,active_quan,create_time,flag FROM elec_meter_data_2018 WHERE create_time>="2018-09-01 00:00:00" AND create_time<"2018-10-01 00:00:00" AND $CONDITIONS'
--hbase-table
elec_meter_data
--hbase-create-table
--hbase-row-key
row_key
-m
3
--column-family
cf1
--split-by
create_time
2.1.2 sqoop-export
- 連接數(shù)據(jù)庫(kù)參數(shù)
參數(shù) | 描述 |
---|---|
--connect <jdbc-uri> | 指定JDBC連接字符串 |
--connection-manager <class-name> | 指定要使用的連接管理器類 |
--driver <class-name> | 手動(dòng)指定要使用的JDBC驅(qū)動(dòng)程序類 |
--hadoop-mapred-home <dir> | 覆蓋$HADOOP_MAPRED_HOME變量 |
--help | 打印使用說(shuō)明 |
--password-file | 為包含身份驗(yàn)證密碼的文件設(shè)置路徑 |
-P | 從控制臺(tái)讀取密碼 |
--password <password> | 設(shè)置身份驗(yàn)證密碼 |
--username <username> | 設(shè)置身份驗(yàn)證用戶名 |
--verbose | 工作時(shí)打印更多信息 |
--connection-param-file <filename> | 提供連接參數(shù)的可選屬性文件 |
--relaxed-isolation | 設(shè)置連接事務(wù)隔離夜涕,以便為映射器讀取未提交的數(shù)據(jù)犯犁。 |
- 更詳細(xì)的驗(yàn)證參數(shù)
參數(shù) | 描述 |
---|---|
--validate | 啟用數(shù)據(jù)復(fù)制的驗(yàn)證,只支持單表復(fù)制女器。 |
--validator <class-name> | 指定要使用的validator類酸役。 |
--validation-threshold <class-name> | 指定要使用的驗(yàn)證閾值類。 |
--validation-failurehandler <class-name> | 指定要使用的驗(yàn)證失敗處理程序類驾胆。 |
- 導(dǎo)出控制參數(shù)
參數(shù) | 描述 |
---|---|
--columns <col,col,col…> | 要導(dǎo)出到表的列 |
--direct | 使用直接導(dǎo)出快捷路徑 |
--export-dir <dir> | 導(dǎo)出的HDFS源路徑 |
-m,--num-mappers <n> | 使用n個(gè)映射任務(wù)并行導(dǎo)出 |
--table <table-name> | 導(dǎo)出寫入的表 |
--call <stored-proc-name> | 要調(diào)用的存儲(chǔ)過(guò)程 |
--update-key <col-name> | 用于更新的固定列涣澡。如果有多個(gè)列,則使用逗號(hào)分隔的列列表丧诺。 |
--update-mode <mode> | 指定在數(shù)據(jù)庫(kù)中發(fā)現(xiàn)具有不匹配鍵的新行時(shí)如何執(zhí)行更新入桂。模式的合法值包括updateonly(默認(rèn)值)和allowinsert |
--input-null-string <null-string> | 字符串列被解釋為null的字符串 |
--input-null-non-string <null-string> | 對(duì)于非字符串列,要解釋為null的字符串 |
--staging-table <staging-table-name> | 數(shù)據(jù)插入目標(biāo)表之前將在其中分段的表锅必。 |
--clear-staging-table | 指示可以刪除暫存表中出現(xiàn)的任何數(shù)據(jù)事格。 |
--batch | 使用批處理模式執(zhí)行底層語(yǔ)句惕艳。 |
a搞隐、默認(rèn)情況下,選擇表中的所有列進(jìn)行導(dǎo)出远搪×痈伲可以使用
--columns
參數(shù)選擇列的子集并控制它們的順序。這應(yīng)該包括一個(gè)以逗號(hào)分隔的要導(dǎo)出的列列表谁鳍。例如:--columns “col1癞季、col2、col3”
倘潜。注意--columns
參數(shù)中不包含的列需要定義默認(rèn)值或允許空值绷柒。否則,您的數(shù)據(jù)庫(kù)將拒絕導(dǎo)入的數(shù)據(jù)涮因,從而導(dǎo)致Sqoop作業(yè)失敗废睦。
b、直接導(dǎo)出并不總是支持將數(shù)據(jù)推入目標(biāo)表之前的分段數(shù)據(jù)养泡。當(dāng)使用·--update-key·選項(xiàng)(用于更新現(xiàn)有數(shù)據(jù))調(diào)用導(dǎo)出時(shí)嗜湃,以及當(dāng)使用存儲(chǔ)過(guò)程插入數(shù)據(jù)時(shí)奈应,它也不可用。 It is best to check the Section 25, “Notes for specific connectors” section to validate.
- 更新和插入(Inserts vs. Updates)
默認(rèn)情況下购披,sqoop-export向表添加新行;將每個(gè)輸入記錄轉(zhuǎn)換為一條INSERT語(yǔ)句杖挣,該語(yǔ)句將一行添加到目標(biāo)數(shù)據(jù)庫(kù)表中。如果您的表有約束(例如刚陡,主鍵列的值必須是惟一的)惩妇,并且已經(jīng)包含數(shù)據(jù),則必須小心避免插入違反這些約束的記錄筐乳。如果插入語(yǔ)句失敗屿附,導(dǎo)出過(guò)程將失敗。如果指定
--update-key
參數(shù)哥童,Sqoop將修改數(shù)據(jù)庫(kù)中的現(xiàn)有數(shù)據(jù)集挺份。每個(gè)輸入記錄都被視為修改現(xiàn)有行的UPDATE語(yǔ)句。語(yǔ)句修改的行由--update-key
指定的列名確定贮懈。
- 輸入解析參數(shù)
參數(shù) | 描述 |
---|---|
--input-enclosed-by <char> | 設(shè)置所需的字段外殼 |
--input-escaped-by <char> | 設(shè)置輸入轉(zhuǎn)義字符 |
--input-fields-terminated-by <char> | 設(shè)置輸入字段分隔符 |
--input-lines-terminated-by <char> | 設(shè)置輸入行結(jié)束符 |
--input-optionally-enclosed-by <char> | 設(shè)置一個(gè)字段包圍字符 |
- 輸出行格式化參數(shù)
參數(shù) | 描述 |
---|---|
--enclosed-by <char> | 設(shè)置所需的字段包圍字符 |
--escaped-by <char> | 設(shè)置轉(zhuǎn)義字符 |
--fields-terminated-by <char> | 設(shè)置字段分隔符字符\b (backspace) \n (newline) \r (carriage return) \t (tab) " (double-quote) ' (single-quote) \ (backslash) \0 (NUL) |
--lines-terminated-by <char> | 設(shè)置行尾字符 |
--mysql-delimiters | 使用MySQL的默認(rèn)分隔符set: fields:匀泊, lines: \n escape -by: \ option -enclosed-by: ' |
--optionally-enclosed-by <char> | 設(shè)置一個(gè)字段包圍字符 |
- 代碼生成參數(shù)
參數(shù) | 描述 |
---|---|
--bindir <dir> | 編譯對(duì)象的輸出目錄 |
--class-name <name> | 設(shè)置生成的類名。這個(gè)覆蓋--package-name朵你。當(dāng)與--jar-file組合時(shí)各聘,設(shè)置輸入類。 |
--jar-file <file> | 禁用代碼生成;使用指定的jar |
--outdir <dir> | 生成代碼的輸出目錄 |
--package-name <name> | 將自動(dòng)生成的類放到這個(gè)包中 |
--map-column-java <m> | 為已配置列覆蓋從SQL類型到Java類型的默認(rèn)映射抡医。 |
示例1: 導(dǎo)出hive到mysql
export
--connect
jdbc:mysql://xxx:3306/xxx
--username
xxx
--password
xxx
--table
hive_tbname
--direct
--export-dir
/output/t_class --driver com.mysql.jdbc.Driver
--input-fields-terminated-by
'\t'
--lines-terminated-by
'\n'
2.1.3 sqoop-job
作業(yè)記住用于指定作業(yè)的參數(shù)躲因,因此可以通過(guò)調(diào)用作業(yè)的句柄重新執(zhí)行這些參數(shù)。
如果將保存的作業(yè)配置為執(zhí)行增量導(dǎo)入忌傻,則有關(guān)最近導(dǎo)入的行的狀態(tài)將在保存的作業(yè)中更新大脉,以允許作業(yè)僅持續(xù)導(dǎo)入最新的行。
待續(xù)