999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx

基于Sqoop 的異構(gòu)環(huán)境數(shù)據(jù)遷移方法研究

2022-09-14 06:56:40王正迅
關(guān)鍵詞:數(shù)據(jù)庫

◎王正迅

引言

基于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的穩(wěn)定性,目前還有很多企業(yè)將數(shù)據(jù)存儲在關(guān)系型數(shù)據(jù)庫中,但是關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)模型較簡單,不適合表達(dá)復(fù)雜的數(shù)據(jù)關(guān)系,在處理大量數(shù)據(jù)、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),以及系統(tǒng)容錯(cuò)和系統(tǒng)擴(kuò)展性方面受到了一定的限制,Hadoop 下的系列工具則有較大優(yōu)勢,早期由于工具的缺乏,Hadoop 集群與傳統(tǒng)數(shù)據(jù)庫之間的數(shù)據(jù)傳輸非常困難。基于這些方面的考慮,需要一個(gè)能在傳統(tǒng)關(guān)系型數(shù)據(jù)庫和Hadoop 之間進(jìn)行數(shù)據(jù)遷移的工具,Sqoop 應(yīng)運(yùn)而生,Apache 提供的Sqoop 工具,能實(shí)現(xiàn)自動化數(shù)據(jù)遷移,依托于數(shù)據(jù)庫相關(guān)的schema 描述信息,遷移的過程則使用MapReduce(后面都簡寫為MR)來進(jìn)行。Sqoop 作為一個(gè)跨平臺抽取和輸出數(shù)據(jù)的工具,在關(guān)系型數(shù)據(jù)庫(MySQL、O-ralce 等)和大數(shù)據(jù)平臺(HDFS、Hive、HBase)之間常用。作為ETL 過程中重要的一環(huán),加載作業(yè)的性能也是需要關(guān)注和優(yōu)化的。本文將主要闡明如何在異構(gòu)環(huán)境中使用Sqoop 方法進(jìn)行數(shù)據(jù)遷移。

一、認(rèn)識Sqoop

Sqoop 是一款用于在Hadoop 和關(guān)系型數(shù)據(jù)庫之間高效遷移大批量數(shù)據(jù)的開源工具,類似于其他ETL 工具,Sqoop 使用元數(shù)據(jù)模型來判斷數(shù)據(jù)類型,并在數(shù)據(jù)從數(shù)據(jù)源轉(zhuǎn)移到Hadoop 時(shí)確保傳輸安全的數(shù)據(jù)處理,專為大數(shù)據(jù)批量傳輸設(shè)計(jì),能夠分割數(shù)據(jù)集并創(chuàng)建Maptask 任務(wù)來處理每個(gè)區(qū)塊。以RDBMS 和HDFS 之間數(shù)據(jù)傳輸為例,Sqoop 借助于MR 導(dǎo)入和導(dǎo)出數(shù)據(jù),用戶可以輕松地以命令行模式從RDBMS 如MySQL 或 Oracle 中導(dǎo)入數(shù)據(jù)到 HDFS 中,通過 Hadoop 的MR 模型計(jì)算完之后,將結(jié)果導(dǎo)回RDBMS,Sqoop 能夠自動完成整個(gè)過程中的大部分,并提供容錯(cuò)和并行化操作。

二、Sqoop 工作機(jī)制

Sqoop 本質(zhì)就是遷移數(shù)據(jù),用戶在使用Sqoop 在異構(gòu)環(huán)境間遷移數(shù)據(jù)時(shí),Sqoop Client 提供了CLI 和瀏覽器兩種方式提交請求,然后Sqoop Server 收到請求后,授權(quán)MR 執(zhí)行。這個(gè)過程它高度依賴Hadoop 并行導(dǎo)入數(shù)據(jù),充分利用了MR 的并行特點(diǎn),以批處理的方式加快數(shù)據(jù)的傳輸,同時(shí)也借助MR 實(shí)現(xiàn)了容錯(cuò)。

1.從關(guān)系型數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)到hadoop 上。

Sqoop 把關(guān)系型數(shù)據(jù)庫(以mysql 為例)的數(shù)據(jù)導(dǎo)人到HDFS 中,主要分為兩步:一是得到元數(shù)據(jù)(mysql 數(shù)據(jù)庫中的數(shù)據(jù)),二是提交Map。在這個(gè)過程中,sqoop 會通過jdbc來獲取需要的數(shù)據(jù)庫的元數(shù)據(jù)信息,例如:導(dǎo)入的表的列名,數(shù)據(jù)類型。這些數(shù)據(jù)庫的數(shù)據(jù)類型會被映射成為java 的數(shù)據(jù)類型,根據(jù)這些信息,sqoop 會生成一個(gè)與表名相同的類,用來完成序列化工作,最后使用Java 類進(jìn)行反序列化,MR并行寫數(shù)據(jù)到Hadoop 中,從而保存表中的每一行記錄。在導(dǎo)入數(shù)據(jù)時(shí),如果不想取出全部數(shù)據(jù),可以通過類似于where 的語句進(jìn)行限制。

圖1 Sqoop 數(shù)據(jù)導(dǎo)入機(jī)制

2.從Hadoop 上導(dǎo)出數(shù)據(jù)到關(guān)系型數(shù)據(jù)庫。

Sqoop 的導(dǎo)出通常是將 HDFS、HBase、Hive 中的數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫中,關(guān)系型數(shù)據(jù)庫中的表必須提前創(chuàng)建好。底層方面,同樣是通過jdbc 讀取HDFS/HBase/Hive 數(shù)據(jù),生成Java 類(這個(gè)類主要作用是解析文本中的數(shù)據(jù)),用于序列化,最后export 程序啟動,通過Java 類反序列化,同時(shí)啟動多個(gè)Map 將相應(yīng)值插入表中。

圖2 Sqoop 數(shù)據(jù)導(dǎo)出機(jī)制

三、Sqoop 數(shù)據(jù)遷移方法介紹

1.Sqoop 數(shù)據(jù)導(dǎo)入。

數(shù)據(jù)導(dǎo)入分全量導(dǎo)入和增量導(dǎo)入。

(1)全量導(dǎo)入數(shù)據(jù)。全量數(shù)據(jù)導(dǎo)入就是一次性將所有需要導(dǎo)入的數(shù)據(jù),從關(guān)系型數(shù)據(jù)庫一次性地導(dǎo)入到HDFS 中(也可以是HBase、Hive 等)。全量導(dǎo)入形式使用場景為一次性離線分析場景。用sqoop import 命令,具體如下:

(2)導(dǎo)入數(shù)據(jù)庫中的部分?jǐn)?shù)據(jù)。導(dǎo)入部分?jǐn)?shù)據(jù)可以在行與列的選取上添加參數(shù)完成,列選取上添加一個(gè)--columns參數(shù),指定數(shù)據(jù)庫中需要導(dǎo)入的列,如添加--columns id,name,age,sex;行選取上添加 --where 參數(shù),增加 where 條件篩選滿足條件的行,如--where "age >= 20" ;還可以使--query 參數(shù)查詢篩選需要導(dǎo)入的數(shù)據(jù),同時(shí)實(shí)現(xiàn)行、列的選取,如 --query"select id,name,age,sex from t_user_info where age>=20 and$CONDITIONS"。

(3)增量導(dǎo)入數(shù)據(jù)。在實(shí)際生產(chǎn)環(huán)境中,系統(tǒng)可能會定期從與業(yè)務(wù)相關(guān)的關(guān)系型數(shù)據(jù)庫向Hadoop 導(dǎo)入數(shù)據(jù),導(dǎo)入數(shù)據(jù)倉庫后進(jìn)行后續(xù)離線分析。數(shù)據(jù)量比較大,有的前期數(shù)據(jù)已經(jīng)被用于項(xiàng)目分析了,我們此時(shí)不可能再將所有數(shù)據(jù)重新導(dǎo)一遍,此時(shí)我們就需要增量數(shù)據(jù)導(dǎo)入這一模式了。增量數(shù)據(jù)導(dǎo)入分兩種,一是基于遞增列的增量數(shù)據(jù)導(dǎo)入(Append方式)。二是基于時(shí)間列的增量數(shù)據(jù)導(dǎo)入(LastModified 方式)。在--incremental 參數(shù)后通過指定Append 方式或LastModified 方式。

2.Sqoop 數(shù)據(jù)導(dǎo)出。

export 是HDFS 里的文件導(dǎo)出到關(guān)系型數(shù)據(jù)庫的工具,不能直接從hive、hbase 導(dǎo)出數(shù)據(jù)。如果要把hive 表數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫,需先把hive 表通過查詢寫入到一個(gè)暫存表,臨時(shí)用文本格式,然后再從該暫存表目錄里導(dǎo)出數(shù)據(jù)。

執(zhí)行數(shù)據(jù)導(dǎo)出前,數(shù)據(jù)庫中必須已經(jīng)存在要導(dǎo)入的目標(biāo)表,默認(rèn)操作是從將文件中的數(shù)據(jù)使用INSERT 語句插入到表中,也可選擇更新模式(Sqoop 將生成UPDATE 替換數(shù)據(jù)庫中現(xiàn)有記錄的語句)或調(diào)用模式(Sqoop 將為每條記錄創(chuàng)建一個(gè)存儲過程調(diào)用)。

默認(rèn)情況下,sqoop export 將每行輸入記錄轉(zhuǎn)換成一條INSERT 語句,添加到目標(biāo)數(shù)據(jù)庫表中。如果數(shù)據(jù)庫中的表具有約束條件(例如,其值必須唯一的主鍵列)并且已有數(shù)據(jù)存在,則必須注意避免插入違反這些約束條件的記錄。如果INSERT 語句失敗,導(dǎo)出過程將失敗。此模式主要用于將記錄導(dǎo)出到可以接收這些結(jié)果的空表中。通常用于全表數(shù)據(jù)導(dǎo)出。使用如下命令可完成:

更新模式導(dǎo)出,僅僅更新已存在的數(shù)據(jù)記錄,不會插入新記錄,該模式用于更新源表與目標(biāo)表中數(shù)據(jù)的不一致,即在不一致時(shí),將源表中的數(shù)據(jù)遷移至目標(biāo)表(如MySQL、Oracle 等的目標(biāo)表中),這種不一致是指一條記錄中存在的不一致,比如HDFS 表和MySQL 中都有一個(gè)id=1 的記錄,但是其中一個(gè)字段的取值不同,則該模式會將這種忽視差異。對于“你有我無”的記錄則不做處理,通過指定update-key 并在—update-mode 參數(shù)后指定是updateonly 模式。調(diào)用模式導(dǎo)出,會更新已存在的數(shù)據(jù)記錄,同時(shí)插入一個(gè)新記錄,實(shí)質(zhì)上是插入一個(gè)update+insert 的操作,同樣是通過指定update-key 并在—update-mode 參數(shù)后指定是allowinsert模式。

四、Sqoop 常見問題及解決辦法

Sqoop 作為一種重要的數(shù)據(jù)遷移工具,在使用過程中需要遵守?cái)?shù)據(jù)庫約束、數(shù)據(jù)庫連接機(jī)制,考慮空值、并行度、分隔符等原因?qū)е碌膫鬏斄袛?shù)和表的列數(shù)不一致等問題。

1.空值問題。

空值問題常見于Hive 與MySQL 數(shù)據(jù)遷移過程中發(fā)生。Hive 中的 Null 在底層是以“N”來存儲,而 MySQL 中的 Null在底層就是Null,這就導(dǎo)致了兩邊進(jìn)行數(shù)據(jù)遷移時(shí)存儲不一致問題,Sqoop 要求在數(shù)據(jù)遷移的時(shí)候嚴(yán)格保證兩端的數(shù)據(jù)格式、數(shù)據(jù)類型一致,否則會帶來異常。

為了保證數(shù)據(jù)兩端的一致性,數(shù)據(jù)遷移的過程中遇到null-string,null-non-string 數(shù)據(jù)都轉(zhuǎn)化成指定的類型,通常指定成"N"。依賴自身參數(shù)在導(dǎo)入數(shù)據(jù)時(shí)采用--null-string“\N”和--null-non-string“\N”,在導(dǎo)出數(shù)據(jù)時(shí)采用--input-null-string“\N”和 --input-null-non-string“\N”兩個(gè)參數(shù),在使用這些參數(shù)過程中,需要正確地將值N 轉(zhuǎn)義到\N。

2.數(shù)據(jù)一致性問題。

(1)任務(wù)失敗導(dǎo)致數(shù)據(jù)不一致。由于Sqoop 將導(dǎo)出過程分解為多個(gè)事務(wù),因此失敗的導(dǎo)出作業(yè)可能會導(dǎo)致將部分?jǐn)?shù)據(jù)提交到數(shù)據(jù)庫。在某些情況下,這可能會導(dǎo)致后續(xù)作業(yè)由于插入沖突而失敗,或者在其他情況下導(dǎo)致重復(fù)數(shù)據(jù)。如這樣一個(gè)場景:export 到 Mysql 時(shí),使用 6個(gè) Map 任務(wù),過程中有3個(gè)任務(wù)失敗,那此時(shí)MySQL 中存儲了另外三個(gè)Map任務(wù)導(dǎo)入的數(shù)據(jù),此時(shí)會生成一個(gè)不完整的報(bào)表數(shù)據(jù)。繼續(xù)調(diào)試問題并最終將全部數(shù)據(jù)正確的導(dǎo)入MySQL,會再次生成一個(gè)報(bào)表數(shù)據(jù),而這個(gè)報(bào)表數(shù)據(jù)與之前的報(bào)表數(shù)據(jù)是不一致,這在生產(chǎn)環(huán)境是不允許的。這種情況下,可以通過--staging-table 參數(shù)指定一個(gè)staging 表來克服這個(gè)問題,指定的這個(gè)staging 表在單個(gè)事務(wù)中,暫存數(shù)據(jù),等到事務(wù)完全處理完畢再移動到目標(biāo)表。為了使用暫存功能,必須在運(yùn)行導(dǎo)出作業(yè)之前創(chuàng)建暫存表,該表必須在結(jié)構(gòu)上與目標(biāo)表相同,這個(gè)表應(yīng)該在導(dǎo)出作業(yè)運(yùn)行之前為空,所以需要--clear-staging-table 這個(gè)參數(shù)配合起來使用。

(2)分隔符問題導(dǎo)致數(shù)據(jù)不一致。Sqoop 默認(rèn)字段與字段之間是用“,”分隔開,Hive 默認(rèn)的列分隔符是 ^A(001),行與行之間的分隔符是“ ”,當(dāng)然,在創(chuàng)建這些表(包括MySQL表)的時(shí)候也可以自己指定分隔符。在數(shù)據(jù)遷移過程中,由于分隔符的不一致會導(dǎo)致數(shù)據(jù)遷移失敗,由于導(dǎo)入的數(shù)據(jù)中有' ',hive 會認(rèn)為一行已經(jīng)結(jié)束,后面的數(shù)據(jù)被分割成下一行,也會導(dǎo)致數(shù)據(jù)不一致。這時(shí)可以使用--lines-terminated-by和--fields-terminated-by 這兩個(gè)參數(shù)來自定義行分隔符和列分隔符進(jìn)行解決。但是hive 只支持' '作為行分隔符,所以在關(guān)系型數(shù)據(jù)庫與Hive 進(jìn)行數(shù)據(jù)遷移時(shí),還需要加上--hive-delims-replacement或 --hive-drop-import-delims 這兩個(gè)參數(shù)把導(dǎo)入數(shù)據(jù)中包含的hive 默認(rèn)的分隔符去掉(這兩個(gè)參數(shù)項(xiàng)不能同時(shí)使用)。

--hive-delims-replacement :是將分隔符中的/0x01 和 /r/n 替換成

--hive-drop-import-delims:將分隔符中的/0x01 和/r/n去掉

3.數(shù)據(jù)傾斜問題。

在生產(chǎn)環(huán)境中,由于數(shù)據(jù)量巨大,數(shù)據(jù)結(jié)構(gòu)復(fù)雜,Sqoop導(dǎo)入數(shù)據(jù)報(bào)內(nèi)存溢出以及抽數(shù)時(shí)間過長,日志顯示有個(gè)別的reduce 執(zhí)行時(shí)間過長,卡在99%那個(gè)位置,例如有25個(gè)Map 中有24個(gè)Map 是在20 秒內(nèi)執(zhí)行完成,只有1個(gè)Map用了6 分多鐘,這種Map 分布不均勻,就是數(shù)據(jù)傾斜現(xiàn)象。導(dǎo)致數(shù)據(jù)傾斜的原因有可能是數(shù)據(jù)本身就不均勻,或是分隔符問題,或是數(shù)據(jù)類型不一致等。這時(shí)需要設(shè)置--split-by、--num-Mappers 和--split-Mappers 這三個(gè)參數(shù)。

在import 時(shí),指定--split-by 參數(shù),Sqoop 根據(jù)不同的split-by 參數(shù)值來進(jìn)行切分,然后將切分出來的區(qū)域分配到不同Map 中。每個(gè)Map 中再處理數(shù)據(jù)庫中獲取的一行一行的值,寫入到HDFS 中。split-by 根據(jù)不同的參數(shù)類型有不同的切分方法,最好使用較簡單的int 型。

通過設(shè)置Map 的個(gè)數(shù)來提高吞吐量,-num-Mappers后面設(shè)置的Maptask 數(shù)目大于1 的話,那么-split-by 后面必須跟字段,因?yàn)?num-Mappers 后面要是1 的話,那么-split-Mappers 后面跟不跟字段都沒有意義,因?yàn)椋粫右粋€(gè)Maptask 進(jìn)行數(shù)據(jù)處理。一般來說數(shù)據(jù)量與Map 的數(shù)量是相關(guān)的,一般建議在500w 以下使4個(gè)Map 即可,如果數(shù)據(jù)量在500w 以上可以使用8個(gè)Map,Map 數(shù)量太多會對數(shù)據(jù)庫增加運(yùn)壓力,造成其他場景使?性能降低。在使用并行度的時(shí)候需要了解主鍵的分布情況是否是有必要的。

五、結(jié)語

隨著大數(shù)據(jù)、云計(jì)算、物聯(lián)網(wǎng)的不斷發(fā)展,信息系統(tǒng)產(chǎn)生的數(shù)據(jù)規(guī)模與日俱增,以Hadoop 平臺為代表的海量數(shù)據(jù)處理平臺通過對海量數(shù)據(jù)進(jìn)行并行處理成為一種有效的解決方案,基于Sqoop 實(shí)現(xiàn)的在關(guān)系型數(shù)據(jù)庫與Hadoop 平臺之間進(jìn)行數(shù)據(jù)遷移,它可以高效、可靠地完成數(shù)據(jù)傳輸任務(wù),是數(shù)據(jù)分析處理及挖掘前的重要一環(huán)。本文從Sqoop 工作機(jī)制、遷移方法介紹、Sqoop 常見問題及解決辦法等方面進(jìn)行分析,解決了Sqoop 使用過程中的簡單問題,在實(shí)際使用過程中,還需要結(jié)合項(xiàng)目實(shí)際需求對Sqoop 做更進(jìn)一步的優(yōu)化。

猜你喜歡
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
兩種新的非確定數(shù)據(jù)庫上的Top-K查詢
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
404 Not Found

404 Not Found


nginx
主站蜘蛛池模板: 精品少妇人妻一区二区| 国产美女在线免费观看| 欧美日韩另类在线| 2020国产精品视频| 欧美一区日韩一区中文字幕页| 国产人成在线观看| 国内精自线i品一区202| 18禁高潮出水呻吟娇喘蜜芽| 精品亚洲欧美中文字幕在线看 | 四虎精品国产AV二区| 伊人激情综合网| 国产在线观看成人91| 国产精品一区二区在线播放| 日韩在线欧美在线| 老汉色老汉首页a亚洲| 国产视频久久久久| 一级福利视频| 日韩精品无码免费一区二区三区| 91精品人妻一区二区| 狠狠色狠狠综合久久| 天堂成人在线| 在线观看精品国产入口| 精品久久综合1区2区3区激情| 丝袜美女被出水视频一区| 99视频免费观看| 伊人色婷婷| 婷婷成人综合| 黑色丝袜高跟国产在线91| 亚洲成a人片| 狠狠做深爱婷婷久久一区| 在线日本国产成人免费的| 免费jizz在线播放| 91偷拍一区| 天天躁日日躁狠狠躁中文字幕| 97无码免费人妻超级碰碰碰| 精品自窥自偷在线看| 成年女人a毛片免费视频| 国产一区免费在线观看| 91午夜福利在线观看精品| 无码内射中文字幕岛国片 | www.日韩三级| 欧美午夜在线观看| 免费A∨中文乱码专区| 女人18一级毛片免费观看| 国产麻豆精品久久一二三| 免费日韩在线视频| 黄色在线不卡| 72种姿势欧美久久久大黄蕉| 国产精品视频a| 国产欧美日韩在线一区| V一区无码内射国产| 亚洲无码免费黄色网址| 九九九精品视频| 超清无码熟妇人妻AV在线绿巨人| 亚洲一级毛片在线观播放| 污污网站在线观看| 日本精品影院| 国产精品乱偷免费视频| 国产门事件在线| av在线无码浏览| 国产永久在线观看| 国产美女免费网站| 亚洲精品久综合蜜| 色偷偷一区二区三区| 97国产精品视频人人做人人爱| 免费无码又爽又黄又刺激网站 | 精品福利国产| 国产日韩精品欧美一区喷| 五月婷婷丁香综合| 国产情精品嫩草影院88av| 啪啪免费视频一区二区| 色婷婷综合激情视频免费看| 无码内射在线| 国产精品永久久久久| 国产成人免费| 久久频这里精品99香蕉久网址| 国产成人综合在线视频| 亚洲av无码牛牛影视在线二区| 国产精品人莉莉成在线播放| 欧美亚洲一二三区| 国产鲁鲁视频在线观看| 伊人丁香五月天久久综合|