您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關sqoop導入數據、全庫導入和創建job以及實現定時增量導入的示例分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
先從功能簡單的開始介紹,
sqoop導入單個表到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表導入hive中,沒有指定hive表名,默認在default庫,表名和mysql表同名。sqoop也可以通過sql語句來從多表中選擇自己想要的數據,比如:
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導入sqlserver數據庫的數據,通過query查詢出自己想要的數據,將這些數據導入hive中。 $CONDITIONS 是不能缺少的,有查詢條件的時候查詢條件和and連接,沒有查詢條件的時候放在where中就可以了。
通過sqoop導入數據到hive中,有以下一些特點:
1)指定的hive表可以存在也可以不存在,不存在則會自動創建,表存在假如沒有數據則會將數據導入,數據格式不對會報錯,加入--hive-overwrite會將hive表進行重寫。
2)通過sqoop創建的hive表只能是內部表,即使通過--target-dir指定了數據在hdfs中存儲的路徑,實際上在hdfs中只會創建文件夾,數據默認是放在/user/hive/warehouse/里面。
3)同一張hive表通過--fields-terminated-by指定的分隔符要統一,否則后導入的數據會擠到一列,無法分開。
2.sqoop全庫導入
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
將一個數據庫內的表都導入一個hive庫中,假如這個庫中所有的表都有主鍵,則不需要最后一行的--autoreset-to-one-mapper。
假如需要將每個hive表進行一定規律的改名,比如以前的表名是table,希望導入的表名叫ods_table,是無法通過sqoop來實現的,需要自己寫腳本來導入。
我在執行全庫導入時,全庫為133張表,實際導入為80張表。可能是我參數哪里有問題,多次執行都是這樣。所以建議導入之后檢查一下數量是否正確。
3.sqoop增量導入
由于hive表沒有主鍵,所以hive表無法實現update,只能將新插入的數據添加進來,也就是增量導入。
增量導入有兩種方式,一種是append,一種是incremental lastmodified。
增量導入只能導入到hdfs中,不能導入到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數據,所以需要用target-dir指定hdfs路徑。沒有加時區可能會報錯Establishing SSL connection without server's identity verification is not recommended.但是加了時區,在傳遞時間類型的數據時,假如設置不正確,可能會將hive中得到的數據比mysql中的數據快/慢。在設置的時候要先查詢自己數據庫的時區設置,一般mysql默認時區是UTC。
&zeroDateTimeBehavior=CONVERT_TO_NULL參數和時區原因一致,不加的話無法連接到mysql數據庫。假如不加就能連到mysql數據庫的話,不加也可以。
指定增量方式為append,檢查列為id,設定值為3,所以id比3大(不含等于)的數據都會被導入。不會合并重復數據,所以如果你連續執行兩遍,會看到兩個id為4的數據。
檢查列不能是字符,必須是數字或者是時間。append方式官方推薦用數字,時間建議用lastmodified方式導入。
lastmodified方式又分兩種增量導入方式,一種是不合并重復數據(append),一種會合并重復數據(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列所有時間大于等于2019-08-30 16:49:12的數據都會被導入。
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重復的數據都會合并,無論是否是本次增量導入添加的。
要注意一點,導入的數據實際時間范圍是你指定的last-value到執行這個sqoop語句,比如你指定了last-value為2019-08-28 17:31:58,執行這個sqoop語句的時間是2021-1-8 15:00:00,但是數據庫里有個數據時間是2022-2-4 12:31:21,這個數據是不會被導入進來的。在打印的日志里面能夠看到:
假如執行沒有報錯,重復數據也合并了,但是數據沒有更新也沒有新導入,建議檢查一下hdfs文件路徑是否正確。
4.將增量導入創建為job,并建立定時任務
sqoop可以將一些sqoop操作保存下來作為job,方便以后執行。之后創建定時任務,來達到定時增量導入的目的。
創建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
這樣就創建了名為one.more.time的job了。
查看job:
sqoop job --list
通過job來執行定時增量導入,第一次執行的last-value值為你指定的值,之后運行會記錄你執行這個job的時間,來作為下次last-value的參數,實現動態配置last-value,避免重復導入。
執行job:
sqoop job --exec one.more.time
創建定時任務:
先檢查是否安裝了crontab
rpm -qa | grep crontab
沒有的話安裝crontab,centos為yum install crontabs。
編寫一個shell腳本,來執行job。
為當前用戶創建定時任務:
crontab -e
進入編輯
40 08 * * 1-5 ls /home/software/sqoop-script/maybe.sh
表示周一至周五,每天8:40執行maybe.sh。更多的crontab時間編寫規范請看 Linux基礎之定時任務。
這樣就實現定時增量同步了。
關于sqoop導入數據、全庫導入和創建job以及實現定時增量導入的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。