idea工具

ApacheSqoop是用來實(shí)現(xiàn)結(jié)構(gòu)型數(shù)據(jù)(如關(guān)系數(shù)據(jù)庫)和Hadoop之間進(jìn)行數(shù)據(jù)遷移的工具。

Apache Sqoop是用來實(shí)現(xiàn)結(jié)構(gòu)型數(shù)據(jù)(如關(guān)系數(shù)據(jù)庫)和Hadoop之間進(jìn)行數(shù)據(jù)遷移的工具畏线。它充分利用了MapReduce的并行特點(diǎn)以批處理的方式加快數(shù)據(jù)的傳輸静盅,同時(shí)也借助MapReduce實(shí)現(xiàn)了容錯(cuò)。

項(xiàng)目地址: http://sqoop.apache.org/

目前為止寝殴,已經(jīng)演化出了2個(gè)版本:sqoop1和sqoop2蒿叠。

sqoop1的最新版本是1.4.5,sqoop2的最新版本是1.99.3杯矩;1.99.3和1.4.5是不兼容的栈虚,并且功能尚未開發(fā)完成,還不適合在生產(chǎn)環(huán)境部署史隆。

sqoop支持的數(shù)據(jù)庫:

Databaseversion--direct?support?connect string matches

HSQLDB1.8.0+Nojdbc:hsqldb:*//

MySQL5.0+Yesjdbc:mysql://

Oracle10.2.0+Nojdbc:oracle:*//

PostgreSQL8.3+Yes (import only)jdbc:postgresql:/

guojian@localtest:~/work$ sudo apt-get install sqoop

guojian@localtest:~/work$ sqoop help

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

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.

import是將關(guān)系數(shù)據(jù)庫遷移到HDFS上

guojian@localtest:~/work$ sqoop import --connectjdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds

guojian@localtest:~/work$ hadoop fs -ls /user/guojian/sds

Found 5 items

-rw-r--r--? 3 guojian cug_test? ? ? ? ? 0 2014-09-11 16:04 /user/guojian/sds/_SUCCESS

-rw-r--r--? 3 guojian cug_test? ? ? ? 483 2014-09-11 16:03 /user/guojian/sds/part-m-00000.snappy

-rw-r--r--? 3 guojian cug_test? ? ? ? 504 2014-09-11 16:04 /user/guojian/sds/part-m-00001.snappy

-rw-r--r--? 3 guojian cug_test? ? ? 1001 2014-09-11 16:03 /user/guojian/sds/part-m-00002.snappy

-rw-r--r--? 3 guojian cug_test? ? ? ? 952 2014-09-11 16:03 /user/guojian/sds/part-m-00003.snappy

可以通過--m設(shè)置并行數(shù)據(jù)魂务,即map的數(shù)據(jù),決定文件的個(gè)數(shù)。

默認(rèn)目錄是/user/${user.name}/${tablename}粘姜,可以通過--target-dir設(shè)置hdfs上的目標(biāo)目錄鬓照。

如果想要將整個(gè)數(shù)據(jù)庫中的表全部導(dǎo)入到hdfs上,可以使用import-all-tables命令孤紧。

sqoop import-all-tables –connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd

---------------------------------------------------------------

如果想要指定所需的列豺裆,使用如下:

sqoop import --connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --columns "SD_ID,CD_ID,LOCATION"

指定導(dǎo)出文件為SequenceFiles,并且將生成的類文件命名為com.ctrip.sds:

sqoop import --connect? ? jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --class-name com.ctrip.sds --as-sequencefile

導(dǎo)入文本時(shí)可以指定分隔符:

sqoop import --connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --fields-terminated-by '\t' --lines-terminated-by '\n' --optionally-enclosed-by '\"'

可以指定過濾條件:

sqoop import --connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --where "sd_id > 100"

export是import的反向過程号显,將hdfs上的數(shù)據(jù)導(dǎo)入到關(guān)系數(shù)據(jù)庫中

sqoop export --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds --export-dir /user/guojian/sds

上例中sqoop數(shù)據(jù)中的sds表需要先把表結(jié)構(gòu)創(chuàng)建出來臭猜,否則export操作會(huì)直接失敗。

由于sqoop是通過map完成數(shù)據(jù)的導(dǎo)入押蚤,各個(gè)map過程是獨(dú)立的蔑歌,沒有事物的概念,可能會(huì)有部分map數(shù)據(jù)導(dǎo)入失敗的情況揽碘。為了解決這一問題次屠,sqoop中有一個(gè)折中的辦法,即是指定中間 staging 表雳刺,成功后再由中間表導(dǎo)入到結(jié)果表劫灶。

這一功能是通過 --staging-table 指定,同時(shí)staging表結(jié)構(gòu)也是需要提前創(chuàng)建出來的:

sqoop export --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds --export-dir /user/guojian/sds --staging-table sds_tmp

需要說明的是掖桦,在使用 --direct 本昏, --update-key 或者--call存儲(chǔ)過程的選項(xiàng)時(shí)滞详,staging中間表是不可用的。

驗(yàn)證結(jié)果:

(1)數(shù)據(jù)會(huì)首先寫到sds_tmp表,導(dǎo)入操作成功后岸啡,再由sds_tmp表導(dǎo)入到sds結(jié)果表中赫编,同時(shí)會(huì)清除sds_tmp表擂送。

(2)如果有map失敗,則成功的map會(huì)將數(shù)據(jù)寫入tmp表搬味,export任務(wù)失敗碰纬,同時(shí)tmp表的數(shù)據(jù)會(huì)被保留。

(3)如果tmp中已有數(shù)據(jù)寿桨,則此export操作會(huì)直接失敗亭螟,可以使用 --clear-staging-table 指定在執(zhí)行前清除中間表预烙。

export選項(xiàng):

--direct直接使用?mysqlimport?工具導(dǎo)入mysql

--export-dir 需要export的hdfs數(shù)據(jù)路徑

-m,--num-mappers 并行export的map個(gè)數(shù)n

--table 導(dǎo)出到的目標(biāo)表

--call 調(diào)用存儲(chǔ)過程

--update-key 指定需要更新的列名陵刹,可以將數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù)進(jìn)行更新

--update-mode 更新模式衰琐,包括?updateonly?(默認(rèn))和allowinsert

前者只允許更新羡宙,后者允許新的列數(shù)據(jù)寫入

--input-null-string The string to be interpreted as null for string columns

--input-null-non-string The string to be interpreted as null for non-string columns

--staging-table 指定中間staging表

--clear-staging-table執(zhí)行export前將中間staging表數(shù)據(jù)清除

--batchUse batch mode for underlying statement execution.

ArgumentDescription

create-hive-table將關(guān)系數(shù)據(jù)庫表導(dǎo)入到hive表中

參數(shù)說明

–hive-home Hive的安裝目錄狗热,可以通過該參數(shù)覆蓋掉默認(rèn)的hive目錄

–hive-overwrite覆蓋掉在hive表中已經(jīng)存在的數(shù)據(jù)

–create-hive-table默認(rèn)是false,如果目標(biāo)表已經(jīng)存在了,那么創(chuàng)建任務(wù)會(huì)失敗

–hive-table后面接要?jiǎng)?chuàng)建的hive表

–table指定關(guān)系數(shù)據(jù)庫表名

sqoop create-hive-table --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds --hive-table sds_bak

默認(rèn)sds_bak是在default數(shù)據(jù)庫的僧凰。

這一步需要依賴HCatalog训措,需要先安裝HCatalog绩鸣,否則報(bào)如下錯(cuò)誤:

Hive history file=/tmp/guojian/hive_job_log_cfbe2de9-a358-4130-945c-b97c0add649d_1628102887.txt

FAILED: ParseException line 1:44 mismatched input ')' expecting Identifier near '(' in column specification

list-databases列出一臺(tái)server上可用的數(shù)據(jù)庫

sqoop list-databases --connect jdbc:mysql://192.168.81.176/ --username root -password passwd

list-tables列出一個(gè)數(shù)據(jù)庫中的表

sqoop list-tables --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd

codegen:將關(guān)系數(shù)據(jù)庫表映射為一個(gè)java文件呀闻、java class類捡多、以及相關(guān)的jar包

sqoop codegen --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds

Note: /tmp/sqoop-guojian/compile/d58f607b046a061593ba708ec5f3d608/sds.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecationfor details.

guojian@localtest:~/work$ ll /tmp/sqoop-guojian/compile/d58f607b046a061593ba708ec5f3d608/

total 48

drwxrwxr-x? 2 guojian guojian? 4096? 9月 1214:15 ./

drwxrwxr-x 11 guojian guojian? 4096? 9月 1214:15 ../

-rw-rw-r--? 1 guojian guojian 11978? 9月 1214:15 sds.class

-rw-rw-r--? 1 guojian guojian? 4811? 9月 12 14:15 sds.jar

-rw-rw-r--? 1 guojian guojian 17525? 9月 12 14:15 sds.java

merge是將兩個(gè)數(shù)據(jù)集合并的工具局服,對(duì)于相同的key會(huì)覆蓋老的值。

--class-name 指定merge job使用的類名稱

--jar-file 合并時(shí)引入的jar包山涡,該jar包是通過Codegen工具生成的jar包

--merge-key 指定作為merge key的列名

--new-data 指定newer數(shù)據(jù)目錄

--onto 指定older數(shù)據(jù)目錄

--target-dir 指定目標(biāo)輸出目錄

參數(shù)說明

sqoop merge --new-data /user/guojian/sds --onto /user/guojian/sqoop --target-dir /user/guojian/sds_new --jar-file sds.jar --class-name sds --merge-key SD_ID

值得注意的是鸭丛,--target-dir如果設(shè)置為已經(jīng)存在的目錄鳞溉,sqoop會(huì)報(bào)錯(cuò)退出鼠哥。

eval用戶可以很快的使用sql語句對(duì)數(shù)據(jù)庫進(jìn)行操作朴恳。這使得用戶在執(zhí)行import操作之前檢查sql語句是否正確。

sqoop eval --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --query "SELECT SD_ID,CD_ID,LOCATION FROM sds LIMIT 10"

job用來生成sqoop任務(wù)呆贿。

--create 創(chuàng)業(yè)一個(gè)新的sqoop作業(yè).

--delete 刪除一個(gè)sqoop job

--exec 執(zhí)行一個(gè)?--create?保存的作業(yè)

--show 顯示一個(gè)作業(yè)的參數(shù)

--list顯示所有創(chuàng)建的sqoop作業(yè)

參數(shù)說明

例子:

sqoop job --create myimportjob -- import --connectjdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table TBLS

guojian@localtest:~/work$ sqoop job --listAvailable jobs:

? myimportjob

guojian@localtest:~/work$ sqoop job --show myimportjob

Job: myimportjob

Tool: import

Options:----------------------------

verbose = false

db.connect.string =? ? jdbc:mysql://192.168.81.176/hivemeta2db

codegen.output.delimiters.escape = 0

codegen.output.delimiters.enclose.required = false

codegen.input.delimiters.field = 0

hbase.create.table = false

db.require.password = true

hdfs.append.dir = false

db.table = TBLS

import.fetch.size = null

accumulo.create.table = false

codegen.input.delimiters.escape = 0

codegen.input.delimiters.enclose.required = false

db.username = root

codegen.output.delimiters.record = 10

import.max.inline.lob.size = 16777216

hbase.bulk.load.enabled = false

hcatalog.create.table = false

db.clear.staging.table = false

codegen.input.delimiters.record = 0

enable.compression = false

hive.overwrite.table = false

hive.import = false

codegen.input.delimiters.enclose = 0

accumulo.batch.size = 10240000

hive.drop.delims = false

codegen.output.delimiters.enclose = 0

hdfs.delete-target.dir = false

codegen.output.dir = .

codegen.auto.compile.dir = true

mapreduce.num.mappers = 4

accumulo.max.latency = 5000

import.direct.split.size = 0

codegen.output.delimiters.field = 44

export.new.update = UpdateOnly

incremental.mode = None

hdfs.file.format = TextFile

codegen.compile.dir = /tmp/sqoop-guojian/compile/bd9c7f7b651276067b3f7b341b7fa4cb

direct.import = false

hive.fail.table.exists = false

db.batch = false

執(zhí)行:

sqoop job -exec myimportjob

metastore 配置sqoop job的共享元數(shù)據(jù)信息,這樣多個(gè)用戶定義和執(zhí)行sqoop job在這一 metastore中竟块。默認(rèn)存儲(chǔ)在~/.sqoop

啟動(dòng):sqoop metastore

關(guān)閉:sqoop metastore --shutdown

metastore文件的存儲(chǔ)位置是在 conf/sqoop-site.xml中sqoop.metastore.server.location 配置彩郊,指向本地文件蚪缀。

metastore可以通過TCP/IP訪問询枚,端口號(hào)可以通過sqoop.metastore.server.port 配置金蜀,默認(rèn)是16000。

客戶端可以通過 指定 sqoop.metastore.client.autoconnect.url 或使用 --meta-connect 尝胆,配置為 jdbc:hsqldb:hsql://:/sqoop护桦,例如 jdbc:hsqldb:hsql://metaserver.example.com:16000/sqoop 二庵。

更多說明見 http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末催享,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痰憎,更是在濱河造成了極大的恐慌铣耘,老刑警劉巖汁果,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳄乏,死亡現(xiàn)場(chǎng)離奇詭異棘利,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)水援,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門蜗元,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奕扣,“玉大人掌敬,你說我怎么就攤上這事】蓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵端考,是天一觀的道長(zhǎng)跛梗。 經(jīng)常有香客問我核偿,道長(zhǎng)顽染,這世上最難降的妖魔是什么粉寞? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任唧垦,我火速辦了婚禮,結(jié)果婚禮上振亮,老公的妹妹穿的比我還像新娘坊秸。我一直安慰自己,他們只是感情好阶牍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布走孽。 她就那樣靜靜地躺著琳状,像睡著了一般。 火紅的嫁衣襯著肌膚如雪生宛。 梳的紋絲不亂的頭發(fā)上肮柜,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天审洞,我揣著相機(jī)與錄音芒澜,去河邊找鬼。 笑死痴晦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的部凑。 我是一名探鬼主播碧浊,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼箱锐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了浩聋?” 一聲冷哼從身側(cè)響起赡勘,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤捞镰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后践樱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拷邢,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞭稼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欲虚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片复哆。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梯找,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锈锤,到底是詐尸還是另有隱情牙咏,我是刑警寧澤嘹裂,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布寄狼,位于F島的核電站,受9級(jí)特大地震影響伊磺,放射性物質(zhì)發(fā)生泄漏删咱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一摘能、第九天 我趴在偏房一處隱蔽的房頂上張望敲街。 院中可真熱鬧,春花似錦逻恐、人聲如沸复隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至样刷,卻和暖如春置鼻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箕母。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工钙勃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聂喇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓克饶,卻偏偏與公主長(zhǎng)得像矾湃,于是被迫代替她去往敵國和親邀跃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奈偏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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