當前位置:
首頁 > 知識 > 如何將數據從Hadoop導出到關係型和NoSQL資料庫?

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

資料庫通常是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目錄,還將為導出創建另一個選項文件,以防止在命令行上不安全地提供密碼:


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

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

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

Sqoop導入的結果是HDFS中有許多CSV文件,可以在以下代碼中看到:

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

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

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

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

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

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

輸入數據格式

可以使用多個選項覆蓋用於解析輸入數據的默認Sqoop設置,表5.7列出了這些選項。

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

表5.7 輸入數據的格式選項

冪等輸出

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

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

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

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

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

直接輸出

在導入技術中使用快速連接器,這是使用mysqldump實用程序的優化。Sqoop導出也支持使用mysqlimport工具的快速連接器。與mysqldump一樣,集群中的所有節點都需要安裝mysqlimport,並且在用於運行MapReduce任務的用戶路徑中可用。與導入一樣, - diand參數可以使用快速連接器:

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

使用mysqlimport進行冪等輸出

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

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

這打破了關於在命令行上公開憑證的早期規則,但是編寫可以從配置文件中讀取這些設置的腳本很容易。

總結

與使用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的方法。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT168企業級 的精彩文章:

黃陳宏:跨國企業不要把自己當外人
SACC 2018之人工智慧篇:AI在不同企業場景下的應用和探索

TAG:IT168企業級 |