如何將資料從Hadoop匯出到關係型和NoSQL資料庫?

大資料頻道發表於2018-10-29

資料庫通常是Hadoop資料輸出的目標之一,企業通常將資料移回生產資料庫以供生產系統使用,或者將資料移動到OLAP資料庫以執行商業智慧和分析功能。

(注:本文為《Hadoop從入門到精通》大型專題的第五章內容,本專題的其他文章見文末連結,專題的上半部也將於不久之後與大家見面,請持續關注本專題!)

5.3.3 資料庫

本節,我們將使用Apache Sqoop將資料從Hadoop匯出到MySQL資料庫。Sqoop是一種簡單的資料庫匯入和匯出工具。我們會介紹將資料從HDFS匯出到Sqoop的過程。我們還將介紹使用常規聯結器的方法,以及如何使用快速聯結器執行批次匯入。

實踐:使用Sqoop將資料匯出到MySQL

Hadoop擅長與大多數關係型資料庫打交道,因此將OLTP資料提取到HDFS,執行一些分析,然後將其匯出回資料庫是很常見的。

問題

希望將資料寫入關聯式資料庫,同時確保寫入是冪等的。

解決方案

此技術介紹瞭如何使用Sqoop將文字檔案匯出到關聯式資料庫,還介紹瞭如何配置Sqoop以使用具有自定義欄位和記錄分隔符的檔案。我們還將介紹冪等匯出,以確保失敗的匯出不會使資料庫處於不一致狀態。

討論

這種技術假設已經安裝MySQL並建立模式。

Sqoop匯出要求匯出資料庫表已存在,Sqoop可以支援表中行的插入和更新。

將資料匯出到資料庫共享

我們在匯入部分檢查的許多引數,不同之處在於export需要使用--export-dir引數來確定要匯出的HDFS目錄,還將為匯出建立另一個選項檔案,以防止在命令列上不安全地提供密碼:

第一步是將資料從MySQL匯出到HDFS,以確保有一個良好的起點,如以下命令所示:

Sqoop匯入的結果是HDFS中有許多CSV檔案,可以在以下程式碼中看到:

對於從HDFS到MySQL的Sqoop匯出,將指定目標表應該是stocks_export並且應該從HDFS庫目錄匯出資料:

預設情況下,Sqoop匯出將對目標資料庫表執行INSERT,可以使用--update-mode引數支援更新。值updateonly意味著如果沒有匹配的金鑰,更新將失敗。如果匹配的鍵不存在,則allowInsert的值將直接插入。用於執行更新的表列名稱在--update-key引數中提供。

以下示例表明只應使用主鍵嘗試更新:

輸入資料格式

可以使用多個選項覆蓋用於解析輸入資料的預設Sqoop設定,表5.7列出了這些選項。

表5.7 輸入資料的格式選項

冪等輸出

執行輸出的Sqoop map任務使用多個事務進行資料庫寫入。如果Sqoop匯出MapReduce作業失敗,則表可能包含部分寫入。對於冪等資料庫寫入,可以指示Sqoop執行MapReduce寫入臨時表。成功完成作業後,臨時表將在單個事務中移動到目標表,該事務是冪等的,可以在圖5.19中看到事件順序。

圖5.19  Sqoop分段事件序列,有助於確保冪等輸出

在下面的示例中,臨時表是stocks_staging,還告訴Sqoop在MapReduce作業以--clear-staging-table引數啟動之前清除它:

直接輸出

在匯入技術中使用快速聯結器,這是使用mysqldump實用程式的最佳化。Sqoop匯出也支援使用mysqlimport工具的快速聯結器。與mysqldump一樣,叢集中的所有節點都需要安裝mysqlimport,並且在用於執行MapReduce任務的使用者路徑中可用。與匯入一樣, - diand引數可以使用快速聯結器:

使用mysqlimport進行冪等輸出

Sqoop不支援將快速聯結器與臨時表結合使用,這就是使用常規聯結器實現冪等輸入的方法。但是仍然可以透過快速聯結器實現冪等輸入,並在最後進行一些額外的工作。需要使用快速聯結器寫入臨時表,然後觸發INSERT語句,該語句將資料原子複製到目標表中,步驟如下所示:

這打破了關於在命令列上公開憑證的早期規則,但是編寫可以從配置檔案中讀取這些設定的指令碼很容易。

總結

與使用MapReduce中提供的DBInputFormat格式類相比,Sqoop提供了簡化的使用模型。但是,使用DBInputFormat類將為在執行資料庫匯出的同一MapReduce作業中轉換或預處理資料提供額外的靈活性。Sqoop的優點是不需要編寫任何程式碼,並且有一些有用的概念,比如分段,以幫助實現冪等。

5.3.4 NoSQL

MapReduce是一種將資料批次載入到外部系統的強大而有效的方法。到目前為止,我們已經介紹瞭如何使用Sqoop載入關係資料,現在我們將看看NoSQL系統,特別是HBase。

Apache HBase是一個分散式key/value,面向列的資料儲存。在本章的前半部分,我們研究瞭如何將HBase中的資料匯入HDFS,以及如何將HBase用作MapReduce作業的資料來源。將資料載入到HBase的最有效方法是透過其內建的批次載入機制,但是這種方法繞過了預寫日誌(WAL),這意味著正在載入的資料不會複製到從屬HBase節點。

HBase還附帶了一個org.apache.hadoop.hbase.mapreduce.Export類,它將從HDFS載入HBase表,類似於本章前面的冪等輸出工作方式。但是,我們必須以SequenceFile形式提供資料,這種方式有缺點,包括不支援版本控制,可以在自己的MapReduce作業中使用TableOutputFormat類將資料匯出到HBase,但這種方法比批次載入工具慢。

我們現在已經完成了對Hadoop輸出工具的檢查。我們介紹瞭如何使用HDFS File Slurper將資料移出到檔案系統以及如何使用Sqoop對關聯式資料庫進行冪等輸入,我們總結了將Hadoop資料輸入HBase的方法。

5.4 本章總結

將資料移入和移出是Hadoop架構的關鍵部分。本章,我們介紹了可用於執行資料輸入和輸出以及與各種資料來源一起使用的各種技術。值得注意的是,我們介紹了Flume,一種資料收集和分發解決方案,Sqoop,一種用於將關係資料移入和移出Hadoop的工具,以及Camus,一種用於將Kafka資料匯入HDFS的工具。現在,是時候檢視一些可應用於資料的有趣處理模式。

相關文章:

1、《第一章:Hadoop生態系統及執行MapReduce任務介紹!》連結:  http://blog.itpub.net/31077337/viewspace-2213549/

2、《學習Hadoop生態第一步:Yarn基本原理和資源排程解析!》連結:  http://blog.itpub.net/31077337/viewspace-2213602/

3、《MapReduce如何作為Yarn應用程式執行?》連結:  http://blog.itpub.net/31077337/viewspace-2213676/

4、《Hadoop生態系統各元件與Yarn的相容性如何?》連結:  http://blog.itpub.net/31077337/viewspace-2213960/

5、《MapReduce資料序列化讀寫概念淺析!》連結:  http://blog.itpub.net/31077337/viewspace-2214151/

6、《MapReuce中對大資料處理最合適的資料格式是什麼?》連結:  http://blog.itpub.net/31077337/viewspace-2214325/

7、《如何在MapReduce中使用SequenceFile資料格式?》連結:  http://blog.itpub.net/31077337/viewspace-2214505/

8、《如何在MapReduce中使用Avro資料格式?》連結:  http://blog.itpub.net/31077337/viewspace-2214709/

9、《企業自有資料格式雜亂,MapReduce如何搞定?》連結:  http://blog.itpub.net/31077337/viewspace-2214826/

10、《企業使用Hadoop的重大挑戰:如何在HDFS中組織和使用資料?》連結:  http://blog.itpub.net/31545816/viewspace-2215158/  

11、《如何在HDFS中進行資料壓縮以實現高效儲存?》連結:   http://blog.itpub.net/31545816/viewspace-2215281/

12、《Hadoop資料傳輸:如何將資料移入和移出Hadoop?》連結:  http://blog.itpub.net/31545816/viewspace-2215580/

13、《如何將日誌和二進位制檔案連續移入HDFS?》連結:  http://blog.itpub.net/31545816/viewspace-2215948/

14、《如何將傳統關聯式資料庫的資料匯入Hadoop?》連結:  http://blog.itpub.net/31545816/viewspace-2216000/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545816/viewspace-2216458/,如需轉載,請註明出處,否則將追究法律責任。

相關文章