溫馨提示×

溫馨提示×

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

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

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

發(fā)布時(shí)間:2022-01-15 11:15:14 來源:億速云 閱讀:240 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹了怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

大多數(shù)企業(yè)的關(guān)鍵數(shù)據(jù)存在于OLTP數(shù)據(jù)庫中,存儲在這些數(shù)據(jù)庫中的數(shù)據(jù)包含有關(guān)用戶,產(chǎn)品和其他有用信息。如果要分析此數(shù)據(jù),傳統(tǒng)方法是定期將該數(shù)據(jù)復(fù)制到OLAP數(shù)據(jù)倉庫中。Hadoop已經(jīng)出現(xiàn)在這個(gè)領(lǐng)域并扮演了兩個(gè)角色:數(shù)據(jù)倉庫的替代品;結(jié)構(gòu)化、非結(jié)構(gòu)化數(shù)據(jù)和數(shù)據(jù)倉庫之間的橋梁。圖5.8顯示了第一個(gè)角色,其中Hadoop在將數(shù)據(jù)導(dǎo)到OLAP系統(tǒng)(BI應(yīng)用程序的常用平臺)之前用作大規(guī)模加入和聚合工具。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

圖5.8 使用Hadoop進(jìn)行OLAP數(shù)據(jù)輸入輸出和處理

以Facebook為例,該企業(yè)已成功利用Hadoop和Hive作為OLAP平臺來處理數(shù)PB數(shù)據(jù)。圖5.9顯示了類似于Facebook的架構(gòu)。該體系結(jié)構(gòu)還包括OLTP系統(tǒng)的反饋循環(huán),可用于推送在Hadoop中發(fā)現(xiàn)的洞察,例如為用戶提供建議。

在任一使用模型中,我們都需要一種將關(guān)系數(shù)據(jù)引入Hadoop的方法,還需要將其輸出到關(guān)系數(shù)據(jù)庫中。本節(jié),我們將使用Sqoop簡化將關(guān)系數(shù)據(jù)輸出到Hadoop的過程。

實(shí)踐:使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)

Sqoop是一個(gè)可用于將關(guān)系數(shù)據(jù)輸入和輸出Hadoop的項(xiàng)目。它是一個(gè)很好的高級工具,封裝了與關(guān)系數(shù)據(jù)移動到Hadoop相關(guān)的邏輯,我們需要做的就是為Sqoop提供確定輸出哪些數(shù)據(jù)的SQL查詢。該技術(shù)提供了有關(guān)如何使用Sqoop將MySQL中的某些數(shù)據(jù)移動到HDFS的詳細(xì)信息。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

圖5.9 使用Hadoop進(jìn)行OLAP并反饋到OLTP系統(tǒng)

本節(jié)使用Sqoop 1.4.4版本,此技術(shù)中使用的代碼和腳本可能無法與其他版本的Sqoop一起使用,尤其是Sqoop 2,它是作為Web應(yīng)用程序?qū)崿F(xiàn)的。

問題

將關(guān)系數(shù)據(jù)加載到集群中,并確保寫入有效且冪等。

解決方案

在這種技術(shù)中,我們將看到如何使用Sqoop作為將關(guān)系數(shù)據(jù)引入Hadoop集群的簡單機(jī)制。我們會介紹將數(shù)據(jù)從MySQL導(dǎo)入Sqoop的過程,還將介紹使用快速連接器的批量導(dǎo)入(連接器是提供數(shù)據(jù)庫讀寫訪問的特定于數(shù)據(jù)庫的組件)。

討論

Sqoop是一個(gè)關(guān)系數(shù)據(jù)庫輸入和輸出系統(tǒng),由Cloudera創(chuàng)建,目前是Apache項(xiàng)目。

執(zhí)行導(dǎo)入時(shí),Sqoop可以寫入HDFS、Hive和HBase,對于輸出,它可以執(zhí)行相反操作。導(dǎo)入分為兩部分:連接到數(shù)據(jù)源以收集統(tǒng)計(jì)信息,然后觸發(fā)執(zhí)行實(shí)際導(dǎo)入的MapReduce作業(yè)。圖5.10顯示了這些步驟。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

圖5.10 Sqoop導(dǎo)入:連接到數(shù)據(jù)源并使用MapReduce

Sqoop有連接器的概念,它包含讀寫外部系統(tǒng)所需的專用邏輯。Sqoop提供兩類連接器:用于常規(guī)讀取和寫入的通用連接器,以及使用數(shù)據(jù)庫專有批處理機(jī)制進(jìn)行高效導(dǎo)入的快速連接器。圖5.11顯示了這兩類連接器及其支持的數(shù)據(jù)庫。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

圖5.11用于讀寫外部系統(tǒng)的Sqoop連接器

在繼續(xù)之前,我們需要訪問MySQL數(shù)據(jù)庫,并且MySQL JDBC JAR需要可用。以下腳本將創(chuàng)建必要的MySQL用戶和模式并加載數(shù)據(jù)。該腳本創(chuàng)建了一個(gè)hip_sqoop_user MySQL用戶,并創(chuàng)建了包含三個(gè)表的sqoop_test數(shù)據(jù)庫:stocks,stocks_export和stocks_staging。然后,它將stock樣本數(shù)據(jù)加載到表中。所有這些步驟都通過運(yùn)行以下命令來執(zhí)行:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

這是快速瀏覽腳本功能:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

第一個(gè)Sqoop命令是基本導(dǎo)入,在其中指定MySQL數(shù)據(jù)庫和要導(dǎo)出的表連接信息:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

MySQL表名稱

Linux中的MySQL表名稱區(qū)分大小寫,確保在Sqoop命令中提供的表名使用正確的大小寫。

默認(rèn)情況下,Sqoop使用表名作為HDFS中的目標(biāo)目錄,用于執(zhí)行導(dǎo)入的MapReduce作業(yè)。如果再次運(yùn)行相同的命令,MapReduce作業(yè)將失敗,因?yàn)樵撃夸浺汛嬖凇?/p>

我們來看看HDFS中的stocks目錄:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

導(dǎo)入數(shù)據(jù)格式

Sqoop已將數(shù)據(jù)導(dǎo)入為逗號分隔的文本文件。它支持許多其他文件格式,可以使用表5.6中列出的參數(shù)激活它們。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

表5.6 控制導(dǎo)入文件格式的Sqoop參數(shù)

如果要導(dǎo)入大量數(shù)據(jù),則可能需要使用Avro等文件格式,這是一種緊湊的數(shù)據(jù)格式,并將其與壓縮結(jié)合使用。以下示例將Snappy壓縮編解碼器與Avro文件結(jié)合使用。它還使用--target-dir選項(xiàng)將輸出寫入表名的不同目錄,并指定應(yīng)使用--where選項(xiàng)導(dǎo)入行的子集??梢允褂?-columns指定要提取的特定列:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

請注意,必須在io.compression.codecs屬性下的配置文件core-site.xml中定義在命令行上提供的壓縮。Snappy壓縮編解碼器要求安裝Hadoop本機(jī)庫。有關(guān)壓縮設(shè)置和配置等更多詳細(xì)信息,請參見第4章,鏈接見文末。

可以通過引入AvroDump工具來了解Avro文件結(jié)構(gòu),以了解Sqoop如何布局記錄。Sqoop使用Avro的GenericRecord進(jìn)行記錄級存儲(有關(guān)詳細(xì)信息,請參閱第3章,鏈接見文末)。如果針對HDFS中Sqoop生成的文件運(yùn)行AvroDump,將看到以下內(nèi)容:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

將Sqoop與SequenceFiles結(jié)合使用

SequenceFiles難以使用的一個(gè)原因是,沒有通用的方法來訪問SequenceFile中的數(shù)據(jù)。必須有權(quán)訪問用于寫入數(shù)據(jù)的Writable類。在Sqoop的情況下,代碼可生成此文件,這引入了一個(gè)主要問題:如果轉(zhuǎn)移到較新版本的Sqoop,并且該版本修改了代碼生成器,那么舊代碼生成的類可能無法與SequenceFiles一起使用。需要將所有舊的SequenceFiles遷移到新版本,或者具有可以使用這些SequenceFiles不同版本的代碼。由于此限制,不建議將SequenceFiles與Sqoop一起使用。如果正在尋找有關(guān)SequenceFiles如何工作的更多信息,請運(yùn)行Sqoop導(dǎo)入工具并查看在工作目錄中生成的stocks.java文件。

可以更進(jìn)一步,使用--query選項(xiàng)指定整個(gè)查詢,如下所示:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

保護(hù)密碼

到目前為止,我們一直在命令行中使用明文密碼,這是一個(gè)安全漏洞,因?yàn)橹鳈C(jī)上的其他用戶可以輕松列出正在運(yùn)行的進(jìn)程并查看密碼。幸運(yùn)的是,Sqoop有一些機(jī)制可以用來避免密碼泄露。

第一種方法是使用-P選項(xiàng),這將導(dǎo)致Sqoop提示輸入密碼。這是最安全的方法,因?yàn)樗恍枰鎯γ艽a,但這意味著無法自動執(zhí)行Sqoop命令。

第二種方法是使用--password-file選項(xiàng),可以在其中指定包含密碼的文件。請注意,此文件必須存在于已配置的文件系統(tǒng)中(通常可能是HDFS),而不是存在于Sqoop客戶端本地磁盤上。你可能希望鎖定文件,以便只有你對此文件具有讀取權(quán)限。 這仍然不是最安全的選項(xiàng),因?yàn)槲募到y(tǒng)上的root用戶仍然可以窺探文件,除非運(yùn)行安全級別較高的Hadoop,否則即使非root用戶也可以輕松訪問。

最后一個(gè)選項(xiàng)是使用選項(xiàng)文件。創(chuàng)建一個(gè)名為?/.sqoop-import-opts的文件:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

不要忘記鎖定文件以避免用戶窺探:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

然后,我們可以通過--options-file選項(xiàng)將此文件名提供給Sqoop作業(yè),Sqoop將讀取文件中指定的選項(xiàng),這意味著無需在命令行上提供它們:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

數(shù)據(jù)拆分

Sqoop如何在多個(gè)mapper之間并行化導(dǎo)入?在圖5.10中,我展示了Sqoop的第一步是如何從數(shù)據(jù)庫中提取元數(shù)據(jù)。它檢查導(dǎo)入的表以確定主鍵,并運(yùn)行查詢以確定表中數(shù)據(jù)的下限和上限(見圖5.12)。Sqoop假設(shè)在最小和最大鍵內(nèi)的數(shù)據(jù)接近均勻分布,因?yàn)樗鼘elta(最小和最大鍵之間的范圍)按照mapper數(shù)量拆分。然后,為每個(gè)mapper提供包含一系列主鍵的唯一查詢。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

圖5.12 確定查詢拆分的Sqoop預(yù)處理步驟

我們可以將Sqoop配置為使用帶有--split-by參數(shù)的非主鍵,這在最小值和最大值之間沒有均勻分布的情況下非常有用。但是,對于大型表,需要注意--split-by中指定的列已編制索引以確保最佳導(dǎo)入時(shí)間,可以使用--boundary-query參數(shù)構(gòu)造備用查詢以確定最小值和最大值。

增量導(dǎo)入

Sqoop支持兩種導(dǎo)入類型:追加用于隨時(shí)間遞增的數(shù)值數(shù)據(jù),例如自動增量鍵;lastmodified適用于帶時(shí)間戳的數(shù)據(jù)。在這兩種情況下,都需要使用--check-column指定列,通過--incremental參數(shù)指定模式(值必須是append或lastmodified),以及用于通過--last-value確定增量更改的實(shí)際值。

例如,如果要導(dǎo)入2005年1月1日更新的stock數(shù)據(jù),則執(zhí)行以下操作:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

假設(shè)還有另一個(gè)系統(tǒng)繼續(xù)寫入該表,可以使用此作業(yè)的--last-value輸出作為后續(xù)Sqoop作業(yè)的輸入,這樣只會導(dǎo)入比該日期更新的行。

Sqoop作業(yè)和Metastore

可以在命令輸出中看到增量列的最后一個(gè)值。如何才能最好地自動化可以重用該值的流程?Sqoop有一個(gè)作業(yè)的概念,可以保存這些信息并在后續(xù)執(zhí)行中重復(fù)使用:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

執(zhí)行上述命令會在Sqoop Metastore中創(chuàng)建一個(gè)命名作業(yè),該作業(yè)會跟蹤所有作業(yè)。默認(rèn)情況下,Metastore包含在.sqoop下的主目錄中,僅用于自己的作業(yè)。如果要在用戶和團(tuán)隊(duì)之間共享作業(yè),則需要為Sqoop的Metastore安裝符合JDBC的數(shù)據(jù)庫,并在發(fā)出作業(yè)命令時(shí)使用--meta-connect參數(shù)指定其位置。

在上一個(gè)示例中執(zhí)行的作業(yè)創(chuàng)建命令除了將作業(yè)添加到Metastore之外沒有做任何其他操作。要運(yùn)行作業(yè),需要顯式執(zhí)行,如下所示:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

--show參數(shù)顯示的元數(shù)據(jù)包括增量列的最后一個(gè)值。這實(shí)際上是執(zhí)行命令的時(shí)間,而不是表中的最后一個(gè)值。如果正在使用此功能,請確保數(shù)據(jù)庫服務(wù)器和與服務(wù)器(包括Sqoop客戶端)交互的任何客戶端的時(shí)鐘與網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)同步。

Sqoop將在運(yùn)行作業(yè)時(shí)提示輸入密碼。要使其在自動腳本中運(yùn)行,需要使用Expect(一種Linux自動化工具)在檢測到Sqoop提示輸入密碼時(shí)從本地文件提供密碼,可以在GitHub上找到與Sqoop一起使用的Expect腳本,網(wǎng)址為:https://github.com/alexholmes/hadoop-book/blob/master/bin/sqoop-job.exp。

Sqoop作業(yè)也可以刪除,如下所示:

$ sqoop job --delete stock_increment

快速M(fèi)ySQL導(dǎo)入

如果想完全繞過JDBC并使用快速M(fèi)ySQL Sqoop連接器進(jìn)行HDFS的高吞吐量加載,該怎么辦?該方法使用MySQL附帶的mysqldump實(shí)用程序來執(zhí)行加載。必須確保mysqldump位于運(yùn)行MapReduce作業(yè)的用戶路徑中。要啟用快速連接器,必須指定--direct參數(shù):

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

快速連接器有哪些缺點(diǎn)? 快速連接器僅適用于文本輸出文件 ,指定Avro或SequenceFile,因?yàn)閷?dǎo)入的輸出格式不起作用。

導(dǎo)入到Hive

此技術(shù)的最后一步是使用Sqoop將數(shù)據(jù)導(dǎo)入Hive表。HDFS導(dǎo)入和Hive導(dǎo)入之間的唯一區(qū)別是Hive導(dǎo)入有一個(gè)后處理步驟,其中創(chuàng)建并加載Hive表,如圖5.13所示。

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

圖5.13 Sqoop Hive導(dǎo)入事件序列

當(dāng)數(shù)據(jù)從HDFS文件或目錄加載到Hive時(shí),如Sqoop Hive導(dǎo)入的情況(圖中的步驟4),Hive將目錄移動到其倉庫而不是復(fù)制數(shù)據(jù)(步驟5)以提高效率。導(dǎo)入后,Sqoop MapReduce作業(yè)寫入的HDFS目錄將不存在。

Hive導(dǎo)入是通過--hive-import參數(shù)觸發(fā)的。就像快速連接器一樣,此選項(xiàng)與--as-avrodatafile和--as -sequencefile選項(xiàng)不兼容:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

導(dǎo)入包含Hive分隔符的字符串

如果要導(dǎo)入可以包含任何Hive分隔符(\n,\r和\01字符)的列,則可能會出現(xiàn)下游處理問題。在這種情況下,有兩種選擇:指定--hive-drop-import-delims,它將刪除導(dǎo)入部分的沖突字符,或指定--hive-delims-replacement,它將用不同的字符替換它們。

如果Hive表已存在,則數(shù)據(jù)將附加到現(xiàn)有表。如果這不是所需的行為,則可以使用--hive-overwrite參數(shù)指示應(yīng)使用導(dǎo)入的數(shù)據(jù)替換現(xiàn)有表。Sqoop目前僅支持Hive的文本輸出,因此LZOP壓縮編解碼器是最佳選擇,因?yàn)樗梢栽贖adoop中拆分(詳見第4章)。以下示例顯示如何結(jié)合使用--hive-overwrite LZOP壓縮。為此,我們需要在集群上構(gòu)建并安裝LZOP,因?yàn)槟J(rèn)情況下它不與Hadoop(或CDH)捆綁在一起。有關(guān)詳細(xì)信息,請參閱第4章(鏈接見文末):

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

最后,我們可以使用--hive-partition-key和--hive-partition-value參數(shù)根據(jù)要導(dǎo)入的列的值創(chuàng)建不同的Hive分區(qū)。例如,如果要按stock名稱對輸入進(jìn)行分區(qū),請執(zhí)行以下操作:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

現(xiàn)在,前面的例子無論如何都不是最優(yōu)的。理想情況下,單個(gè)導(dǎo)入將能夠創(chuàng)建多個(gè)Hive分區(qū)。因?yàn)閮H限于指定單個(gè)鍵和值,所以每個(gè)唯一的分區(qū)值需要運(yùn)行一次導(dǎo)入,這很費(fèi)力。最好導(dǎo)入到未分區(qū)的Hive表中,然后在加載后在表上追溯創(chuàng)建分區(qū)。

此外,提供給Sqoop的SQL查詢還必須注意過濾掉結(jié)果,以便僅包含與分區(qū)匹配的那些。換句話說,如果Sqoop用符號=“AAPL”更新WHERE子句,那將會很有用。

連續(xù)Sqoop執(zhí)行

如果需要定期安排導(dǎo)入HDFS,Oozie可以進(jìn)行Sqoop集成,允許定期執(zhí)行導(dǎo)入和導(dǎo)出。Oozie workflow.xml示例如下:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

<command>元素中不支持單引號和雙引號,因此如果需要指定包含空格的參數(shù),則需要使用<arg>元素:

怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop

使用Oozie的Sqoop時(shí)的另一個(gè)考慮因素是需要為Oozie提供JDBC驅(qū)動程序JAR。我們可以將JAR復(fù)制到工作流的lib/目錄中,也可以使用JAR更新Hadoop安裝的lib目錄。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么將傳統(tǒng)關(guān)系數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入Hadoop”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向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