溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

sqoop導(dǎo)入數(shù)據(jù)、全庫導(dǎo)入和創(chuàng)建job以及實(shí)現(xiàn)定時(shí)增量導(dǎo)入的示例分析

發(fā)布時(shí)間:2021-12-18 13:38:54 來源:億速云 閱讀:523 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)sqoop導(dǎo)入數(shù)據(jù)、全庫導(dǎo)入和創(chuàng)建job以及實(shí)現(xiàn)定時(shí)增量導(dǎo)入的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

先從功能簡單的開始介紹,

  1. sqoop導(dǎo)入單個表到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)錯,加入--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

將一個數(shù)據(jù)庫內(nèi)的表都導(dǎo)入一個hive庫中,假如這個庫中所有的表都有主鍵,則不需要最后一行的--autoreset-to-one-mapper。

假如需要將每個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)錯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í)行兩遍,會看到兩個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í)行這個sqoop語句,比如你指定了last-value為2019-08-28 17:31:58,執(zhí)行這個sqoop語句的時(shí)間是2021-1-8 15:00:00,但是數(shù)據(jù)庫里有個數(shù)據(jù)時(shí)間是2022-2-4 12:31:21,這個數(shù)據(jù)是不會被導(dǎo)入進(jìn)來的。在打印的日志里面能夠看到:

sqoop導(dǎo)入數(shù)據(jù)、全庫導(dǎo)入和創(chuàng)建job以及實(shí)現(xiàn)定時(shí)增量導(dǎo)入的示例分析

假如執(zhí)行沒有報(bào)錯,重復(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í)行這個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。

編寫一個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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI