【sqoop-部署】快速入門(安裝與使用)

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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末水孩,一起剝皮案震驚了整個(gè)濱河市镰矿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俘种,老刑警劉巖秤标,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宙刘,居然都是意外死亡苍姜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門悬包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衙猪,“玉大人,你說(shuō)我怎么就攤上這事∏停” “怎么了潘拨?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饶号。 經(jīng)常有香客問(wèn)我铁追,道長(zhǎng),這世上最難降的妖魔是什么茫船? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任琅束,我火速辦了婚禮,結(jié)果婚禮上算谈,老公的妹妹穿的比我還像新娘涩禀。我一直安慰自己洒扎,他們只是感情好羔沙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玩般,像睡著了一般高每。 火紅的嫁衣襯著肌膚如雪屿岂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天鲸匿,我揣著相機(jī)與錄音爷怀,去河邊找鬼。 笑死带欢,一個(gè)胖子當(dāng)著我的面吹牛运授,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乔煞,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吁朦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瘤缩?” 一聲冷哼從身側(cè)響起喇完,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伦泥,失蹤者是張志新(化名)和其女友劉穎剥啤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體不脯,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡府怯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了防楷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牺丙。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冲簿,到底是詐尸還是另有隱情粟判,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布峦剔,位于F島的核電站档礁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吝沫。R本人自食惡果不足惜呻澜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惨险。 院中可真熱鬧羹幸,春花似錦、人聲如沸辫愉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恭朗。三九已至窘疮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冀墨,已是汗流浹背闸衫。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诽嘉,地道東北人蔚出。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虫腋,于是被迫代替她去往敵國(guó)和親骄酗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,947評(píng)論 2 89
  • 上節(jié)課學(xué)習(xí)了Hadoop集群測(cè)試悦冀,這節(jié)課我們一起學(xué)習(xí)一下Sqoop趋翻,Sqoop是專門用來(lái)遷移數(shù)據(jù)的,它可以把數(shù)據(jù)庫(kù)...
    文子軒閱讀 6,941評(píng)論 1 9
  • 前言: Hadoop的課程已經(jīng)告一段落盒蟆,基本上在零基礎(chǔ)課程里不會(huì)再出現(xiàn)了踏烙,接下來(lái)的課程由若總來(lái)上,第一講Have历等。...
    ly稻草閱讀 3,646評(píng)論 1 9
  • 一座沒有愛的城市 這座城市叫東莞 一個(gè)稍不努力就吃不上飯的地方 熬不完的夜 交不完的房租 受不完的委屈 聽不完的謊...
    胡函閱讀 2,469評(píng)論 0 0
  • 從古至今讨惩,文字就是一個(gè)國(guó)家最根本的基礎(chǔ)。漢字就是中華民族的核心寒屯、精髓荐捻,漢字代表著一個(gè)國(guó)家的興亡黍少,如果沒有漢字,我無(wú)...
    天天向上s閱讀 575評(píng)論 0 2