這篇文章將為大家詳細(xì)講解有關(guān)sqoop導(dǎo)入數(shù)據(jù)、全庫導(dǎo)入和創(chuàng)建job以及實(shí)現(xiàn)定時(shí)增量導(dǎo)入的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了行唐免費(fèi)建站歡迎大家使用!
先從功能簡單的開始介紹,
sqoop導(dǎo)入單個(gè)表到hive:
sqoop import \ --connect jdbc:MySQL://192.168.49.214:3306/mysqlcdc --username root \ --password 123456 \ --table data \ --hive-import \ --fields-terminated-by '\t' \ -m 1
這是最簡單的將mysql表導(dǎo)入hive中,沒有指定hive表名,默認(rèn)在default庫,表名和mysql表同名。sqoop也可以通過sql語句來從多表中選擇自己想要的數(shù)據(jù),比如:
sqoop import \ --connect 'jdbc:sqlserver://192.168.49.180:1433;database=rcscounty_qn' \ --username sa \ --password 123456! \ --fields-terminated-by '\t' \ --hive-import \ --hive-table rcs.user_orgname \ --m 1 \ --query 'SELECT u.USER_ID as id, u.USER_NAME as name, u.ORG_ID as orgId, o.ORG_NAME as orgName FROM USER u , ORG o where o.ORG_ID = u.ORG_ID and $CONDITIONS'
通過sqoop導(dǎo)入sqlserver數(shù)據(jù)庫的數(shù)據(jù),通過query查詢出自己想要的數(shù)據(jù),將這些數(shù)據(jù)導(dǎo)入hive中。 $CONDITIONS 是不能缺少的,有查詢條件的時(shí)候查詢條件和and連接,沒有查詢條件的時(shí)候放在where中就可以了。
通過sqoop導(dǎo)入數(shù)據(jù)到hive中,有以下一些特點(diǎn):
1)指定的hive表可以存在也可以不存在,不存在則會自動創(chuàng)建,表存在假如沒有數(shù)據(jù)則會將數(shù)據(jù)導(dǎo)入,數(shù)據(jù)格式不對會報(bào)錯(cuò),加入--hive-overwrite會將hive表進(jìn)行重寫。
2)通過sqoop創(chuàng)建的hive表只能是內(nèi)部表,即使通過--target-dir指定了數(shù)據(jù)在hdfs中存儲的路徑,實(shí)際上在hdfs中只會創(chuàng)建文件夾,數(shù)據(jù)默認(rèn)是放在/user/hive/warehouse/里面。
3)同一張hive表通過--fields-terminated-by指定的分隔符要統(tǒng)一,否則后導(dǎo)入的數(shù)據(jù)會擠到一列,無法分開。
2.sqoop全庫導(dǎo)入
sqoop import-all-tables "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \ --connect 'jdbc:sqlserver://192.168.49.180:1433;database=rcscounty_qn' \ --username sa \ --password 123456 \ --fields-terminated-by '\t' \ --hive-database ods_quannan \ -m 10 \ --create-hive-table \ --hive-import \ --hive-overwrite \ --autoreset-to-one-mapper
將一個(gè)數(shù)據(jù)庫內(nèi)的表都導(dǎo)入一個(gè)hive庫中,假如這個(gè)庫中所有的表都有主鍵,則不需要最后一行的--autoreset-to-one-mapper。
假如需要將每個(gè)hive表進(jìn)行一定規(guī)律的改名,比如以前的表名是table,希望導(dǎo)入的表名叫ods_table,是無法通過sqoop來實(shí)現(xiàn)的,需要自己寫腳本來導(dǎo)入。
我在執(zhí)行全庫導(dǎo)入時(shí),全庫為133張表,實(shí)際導(dǎo)入為80張表??赡苁俏覅?shù)哪里有問題,多次執(zhí)行都是這樣。所以建議導(dǎo)入之后檢查一下數(shù)量是否正確。
3.sqoop增量導(dǎo)入
由于hive表沒有主鍵,所以hive表無法實(shí)現(xiàn)update,只能將新插入的數(shù)據(jù)添加進(jìn)來,也就是增量導(dǎo)入。
增量導(dǎo)入有兩種方式,一種是append,一種是incremental lastmodified。
增量導(dǎo)入只能導(dǎo)入到hdfs中,不能導(dǎo)入到hive中,所以語句中不要有--hive import。
append方式:
sqoop import \ --connect 'jdbc:mysql://192.168.49.201:3307/blade?serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL' \ --username root \ --password 123456 \ --table blade_blog \ --target-dir '/user/hive/warehouse/ods.db/blade_blog' \ --incremental append \ --check-column id \ --last-value 3 \ -m 1
由于修改的是hdfs數(shù)據(jù),所以需要用target-dir指定hdfs路徑。沒有加時(shí)區(qū)可能會報(bào)錯(cuò)Establishing SSL connection without server's identity verification is not recommended.但是加了時(shí)區(qū),在傳遞時(shí)間類型的數(shù)據(jù)時(shí),假如設(shè)置不正確,可能會將hive中得到的數(shù)據(jù)比mysql中的數(shù)據(jù)快/慢。在設(shè)置的時(shí)候要先查詢自己數(shù)據(jù)庫的時(shí)區(qū)設(shè)置,一般mysql默認(rèn)時(shí)區(qū)是UTC。
&zeroDateTimeBehavior=CONVERT_TO_NULL參數(shù)和時(shí)區(qū)原因一致,不加的話無法連接到mysql數(shù)據(jù)庫。假如不加就能連到mysql數(shù)據(jù)庫的話,不加也可以。
指定增量方式為append,檢查列為id,設(shè)定值為3,所以id比3大(不含等于)的數(shù)據(jù)都會被導(dǎo)入。不會合并重復(fù)數(shù)據(jù),所以如果你連續(xù)執(zhí)行兩遍,會看到兩個(gè)id為4的數(shù)據(jù)。
檢查列不能是字符,必須是數(shù)字或者是時(shí)間。append方式官方推薦用數(shù)字,時(shí)間建議用lastmodified方式導(dǎo)入。
lastmodified方式又分兩種增量導(dǎo)入方式,一種是不合并重復(fù)數(shù)據(jù)(append),一種會合并重復(fù)數(shù)據(jù)(merge-key) ,例子如下
append方式
sqoop import --connect 'jdbc:mysql://192.168.49.214:3306/mysqlcdc?serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL' \ --username root \ --password 123456 \ --table data \ --target-dir '/user/hive/warehouse/data' \ --check-column last_mod \ --incremental lastmodified \ --last-value '2019-08-30 16:49:12' \ --m 1 \ --append
last_mod列所有時(shí)間大于等于2019-08-30 16:49:12的數(shù)據(jù)都會被導(dǎo)入。
merge-key方式:
sqoop import --connect 'jdbc:mysql://192.168.49.214:3306/mysqlcdc?serverTimezone=CST&zeroDateTimeBehavior=CONVERT_TO_NULL' \ --username root \ --password 123456 \ --table data \ --target-dir '/user/hive/warehouse/data' \ --check-column last_mod \ --incremental lastmodified \ --fields-terminated-by ',' \ --last-value '2019-08-28 17:31:58' \ --m 1 \ --merge-key id
指定merge-key為id,hive表中所有id重復(fù)的數(shù)據(jù)都會合并,無論是否是本次增量導(dǎo)入添加的。
要注意一點(diǎn),導(dǎo)入的數(shù)據(jù)實(shí)際時(shí)間范圍是你指定的last-value到執(zhí)行這個(gè)sqoop語句,比如你指定了last-value為2019-08-28 17:31:58,執(zhí)行這個(gè)sqoop語句的時(shí)間是2021-1-8 15:00:00,但是數(shù)據(jù)庫里有個(gè)數(shù)據(jù)時(shí)間是2022-2-4 12:31:21,這個(gè)數(shù)據(jù)是不會被導(dǎo)入進(jìn)來的。在打印的日志里面能夠看到:
假如執(zhí)行沒有報(bào)錯(cuò),重復(fù)數(shù)據(jù)也合并了,但是數(shù)據(jù)沒有更新也沒有新導(dǎo)入,建議檢查一下hdfs文件路徑是否正確。
4.將增量導(dǎo)入創(chuàng)建為job,并建立定時(shí)任務(wù)
sqoop可以將一些sqoop操作保存下來作為job,方便以后執(zhí)行。之后創(chuàng)建定時(shí)任務(wù),來達(dá)到定時(shí)增量導(dǎo)入的目的。
創(chuàng)建sqoop job:
sqoop job \ --create one.more.time \ -- import \ --connect 'jdbc:mysql://192.168.49.101:3307/maybe?serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL' \ --username root \ --password 123456 \ --table blade_blog \ --target-dir '/user/hive/warehouse/ods.db/b_blog' \ --fields-terminated-by '\t' \ --m 1 \ --check-column update_time \ --incremental lastmodified \ --last-value '2020-01-16 15:34:01' \ --merge-key id
這樣就創(chuàng)建了名為one.more.time的job了。
查看job:
sqoop job --list
通過job來執(zhí)行定時(shí)增量導(dǎo)入,第一次執(zhí)行的last-value值為你指定的值,之后運(yùn)行會記錄你執(zhí)行這個(gè)job的時(shí)間,來作為下次last-value的參數(shù),實(shí)現(xiàn)動態(tài)配置last-value,避免重復(fù)導(dǎo)入。
執(zhí)行job:
sqoop job --exec one.more.time
創(chuàng)建定時(shí)任務(wù):
先檢查是否安裝了crontab
rpm -qa | grep crontab
沒有的話安裝crontab,centos為yum install crontabs。
編寫一個(gè)shell腳本,來執(zhí)行job。
為當(dāng)前用戶創(chuàng)建定時(shí)任務(wù):
crontab -e
進(jìn)入編輯
40 08 * * 1-5 ls /home/software/sqoop-script/maybe.sh
表示周一至周五,每天8:40執(zhí)行maybe.sh。更多的crontab時(shí)間編寫規(guī)范請看 Linux基礎(chǔ)之定時(shí)任務(wù)。
這樣就實(shí)現(xiàn)定時(shí)增量同步了。
關(guān)于sqoop導(dǎo)入數(shù)據(jù)、全庫導(dǎo)入和創(chuàng)建job以及實(shí)現(xiàn)定時(shí)增量導(dǎo)入的示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。