如何將傳統關聯式資料庫的資料匯入Hadoop?
大多數企業的關鍵資料存在於OLTP資料庫中,儲存在這些資料庫中的資料包含有關使用者,產品和其他有用資訊。如果要分析此資料,傳統方法是定期將該資料複製到OLAP資料倉儲中。Hadoop已經出現在這個領域並扮演了兩個角色:資料倉儲的替代品;結構化、非結構化資料和資料倉儲之間的橋樑。圖5.8顯示了第一個角色,其中Hadoop在將資料導到OLAP系統(BI應用程式的常用平臺)之前用作大規模加入和聚合工具。
(注:本文為《Hadoop從入門到精通》大型專題的第五章內容,本專題的其他文章見文末連結,專題的上半部也將於不久之後與大家見面,請持續關注本專題!)
圖5.8 使用Hadoop進行OLAP資料輸入輸出和處理
以Facebook為例,該企業已成功利用Hadoop和Hive作為OLAP平臺來處理數PB資料。圖5.9顯示了類似於Facebook的架構。該體系結構還包括OLTP系統的反饋迴圈,可用於推送在Hadoop中發現的洞察,例如為使用者提供建議。
在任一使用模型中,我們都需要一種將關係資料引入Hadoop的方法,還需要將其輸出到關聯式資料庫中。本節,我們將使用Sqoop簡化將關係資料輸出到Hadoop的過程。
實踐:使用Sqoop從MySQL匯入資料
Sqoop是一個可用於將關係資料輸入和輸出Hadoop的專案。它是一個很好的高階工具,封裝了與關係資料移動到Hadoop相關的邏輯,我們需要做的就是為Sqoop提供確定輸出哪些資料的SQL查詢。該技術提供了有關如何使用Sqoop將MySQL中的某些資料移動到HDFS的詳細資訊。
圖5.9 使用Hadoop進行OLAP並反饋到OLTP系統
本節使用Sqoop 1.4.4版本,此技術中使用的程式碼和指令碼可能無法與其他版本的Sqoop一起使用,尤其是Sqoop 2,它是作為Web應用程式實現的。
問題
將關係資料載入到叢集中,並確保寫入有效且冪等。
解決方案
在這種技術中,我們將看到如何使用Sqoop作為將關係資料引入Hadoop叢集的簡單機制。我們會介紹將資料從MySQL匯入Sqoop的過程,還將介紹使用快速聯結器的批次匯入(聯結器是提供資料庫讀寫訪問的特定於資料庫的元件)。
討論
Sqoop是一個關聯式資料庫輸入和輸出系統,由Cloudera建立,目前是Apache專案。
執行匯入時,Sqoop可以寫入HDFS、Hive和HBase,對於輸出,它可以執行相反操作。匯入分為兩部分:連線到資料來源以收集統計資訊,然後觸發執行實際匯入的MapReduce作業。圖5.10顯示了這些步驟。
圖5.10 Sqoop匯入:連線到資料來源並使用MapReduce
Sqoop有聯結器的概念,它包含讀寫外部系統所需的專用邏輯。Sqoop提供兩類聯結器:用於常規讀取和寫入的通用聯結器,以及使用資料庫專有批處理機制進行高效匯入的快速聯結器。圖5.11顯示了這兩類聯結器及其支援的資料庫。
圖5.11用於讀寫外部系統的Sqoop聯結器
在繼續之前,我們需要訪問MySQL資料庫,並且MySQL JDBC JAR需要可用。以下指令碼將建立必要的MySQL使用者和模式並載入資料。該指令碼建立了一個hip_sqoop_user MySQL使用者,並建立了包含三個表的sqoop_test資料庫:stocks,stocks_export和stocks_staging。然後,它將stock樣本資料載入到表中。所有這些步驟都透過執行以下命令來執行:
這是快速瀏覽指令碼功能:
第一個Sqoop命令是基本匯入,在其中指定MySQL資料庫和要匯出的表連線資訊:
MySQL表名稱
Linux中的MySQL表名稱區分大小寫,確保在Sqoop命令中提供的表名使用正確的大小寫。
預設情況下,Sqoop使用表名作為HDFS中的目標目錄,用於執行匯入的MapReduce作業。如果再次執行相同的命令,MapReduce作業將失敗,因為該目錄已存在。
我們來看看HDFS中的stocks目錄:
匯入資料格式
Sqoop已將資料匯入為逗號分隔的文字檔案。它支援許多其他檔案格式,可以使用表5.6中列出的引數啟用它們。
表5.6 控制匯入檔案格式的Sqoop引數
如果要匯入大量資料,則可能需要使用Avro等檔案格式,這是一種緊湊的資料格式,並將其與壓縮結合使用。以下示例將Snappy壓縮編解碼器與Avro檔案結合使用。它還使用--target-dir選項將輸出寫入表名的不同目錄,並指定應使用--where選項匯入行的子集。可以使用--columns指定要提取的特定列:
請注意,必須在io.compression.codecs屬性下的配置檔案core-site.xml中定義在命令列上提供的壓縮。Snappy壓縮編解碼器要求安裝Hadoop本機庫。有關壓縮設定和配置等更多詳細資訊,請參見第4章,連結見文末。
可以透過引入AvroDump工具來了解Avro檔案結構,以瞭解Sqoop如何佈局記錄。Sqoop使用Avro的GenericRecord進行記錄級儲存(有關詳細資訊,請參閱第3章,連結見文末)。如果針對HDFS中Sqoop生成的檔案執行AvroDump,將看到以下內容:
將Sqoop與SequenceFiles結合使用
SequenceFiles難以使用的一個原因是,沒有通用的方法來訪問SequenceFile中的資料。必須有權訪問用於寫入資料的Writable類。在Sqoop的情況下,程式碼可生成此檔案,這引入了一個主要問題:如果轉移到較新版本的Sqoop,並且該版本修改了程式碼生成器,那麼舊程式碼生成的類可能無法與SequenceFiles一起使用。需要將所有舊的SequenceFiles遷移到新版本,或者具有可以使用這些SequenceFiles不同版本的程式碼。由於此限制,不建議將SequenceFiles與Sqoop一起使用。如果正在尋找有關SequenceFiles如何工作的更多資訊,請執行Sqoop匯入工具並檢視在工作目錄中生成的stocks.java檔案。
可以更進一步,使用--query選項指定整個查詢,如下所示:
保護密碼
到目前為止,我們一直在命令列中使用明文密碼,這是一個安全漏洞,因為主機上的其他使用者可以輕鬆列出正在執行的程式並檢視密碼。幸運的是,Sqoop有一些機制可以用來避免密碼洩露。
第一種方法是使用-P選項,這將導致Sqoop提示輸入密碼。這是最安全的方法,因為它不需要儲存密碼,但這意味著無法自動執行Sqoop命令。
第二種方法是使用--password-file選項,可以在其中指定包含密碼的檔案。請注意,此檔案必須存在於已配置的檔案系統中(通常可能是HDFS),而不是存在於Sqoop客戶端本地磁碟上。你可能希望鎖定檔案,以便只有你對此檔案具有讀取許可權。 這仍然不是最安全的選項,因為檔案系統上的root使用者仍然可以窺探檔案,除非執行安全級別較高的Hadoop,否則即使非root使用者也可以輕鬆訪問。
最後一個選項是使用選項檔案。建立一個名為〜/.sqoop-import-opts的檔案:
不要忘記鎖定檔案以避免使用者窺探:
然後,我們可以透過--options-file選項將此檔名提供給Sqoop作業,Sqoop將讀取檔案中指定的選項,這意味著無需在命令列上提供它們:
資料拆分
Sqoop如何在多個mapper之間並行化匯入?在圖5.10中,我展示了Sqoop的第一步是如何從資料庫中提取後設資料。它檢查匯入的表以確定主鍵,並執行查詢以確定表中資料的下限和上限(見圖5.12)。Sqoop假設在最小和最大鍵內的資料接近均勻分佈,因為它將delta(最小和最大鍵之間的範圍)按照mapper數量拆分。然後,為每個mapper提供包含一系列主鍵的唯一查詢。
圖5.12 確定查詢拆分的Sqoop預處理步驟
我們可以將Sqoop配置為使用帶有--split-by引數的非主鍵,這在最小值和最大值之間沒有均勻分佈的情況下非常有用。但是,對於大型表,需要注意--split-by中指定的列已編制索引以確保最佳匯入時間,可以使用--boundary-query引數構造備用查詢以確定最小值和最大值。
增量匯入
Sqoop支援兩種匯入型別:追加用於隨時間遞增的數值資料,例如自動增量鍵;lastmodified適用於帶時間戳的資料。在這兩種情況下,都需要使用--check-column指定列,透過--incremental引數指定模式(值必須是append或lastmodified),以及用於透過--last-value確定增量更改的實際值。
例如,如果要匯入2005年1月1日更新的stock資料,則執行以下操作:
假設還有另一個系統繼續寫入該表,可以使用此作業的--last-value輸出作為後續Sqoop作業的輸入,這樣只會匯入比該日期更新的行。
Sqoop作業和Metastore
可以在命令輸出中看到增量列的最後一個值。如何才能最好地自動化可以重用該值的流程?Sqoop有一個作業的概念,可以儲存這些資訊並在後續執行中重複使用:
執行上述命令會在Sqoop Metastore中建立一個命名作業,該作業會跟蹤所有作業。預設情況下,Metastore包含在.sqoop下的主目錄中,僅用於自己的作業。如果要在使用者和團隊之間共享作業,則需要為Sqoop的Metastore安裝符合JDBC的資料庫,並在發出作業命令時使用--meta-connect引數指定其位置。
在上一個示例中執行的作業建立命令除了將作業新增到Metastore之外沒有做任何其他操作。要執行作業,需要顯式執行,如下所示:
--show引數顯示的後設資料包括增量列的最後一個值。這實際上是執行命令的時間,而不是表中的最後一個值。如果正在使用此功能,請確保資料庫伺服器和與伺服器(包括Sqoop客戶端)互動的任何客戶端的時鐘與網路時間協議(NTP)同步。
Sqoop將在執行作業時提示輸入密碼。要使其在自動指令碼中執行,需要使用Expect(一種Linux自動化工具)在檢測到Sqoop提示輸入密碼時從本地檔案提供密碼,可以在GitHub上找到與Sqoop一起使用的Expect指令碼,網址為:。
Sqoop作業也可以刪除,如下所示:
$ sqoop job --delete stock_increment
快速MySQL匯入
如果想完全繞過JDBC並使用快速MySQL Sqoop聯結器進行HDFS的高吞吐量載入,該怎麼辦?該方法使用MySQL附帶的mysqldump實用程式來執行載入。必須確保mysqldump位於執行MapReduce作業的使用者路徑中。要啟用快速聯結器,必須指定--direct引數:
快速聯結器有哪些缺點? 快速聯結器僅適用於文字輸出檔案 ,指定Avro或SequenceFile,因為匯入的輸出格式不起作用。
匯入到Hive
此技術的最後一步是使用Sqoop將資料匯入Hive表。HDFS匯入和Hive匯入之間的唯一區別是Hive匯入有一個後處理步驟,其中建立並載入Hive表,如圖5.13所示。
圖5.13 Sqoop Hive匯入事件序列
當資料從HDFS檔案或目錄載入到Hive時,如Sqoop Hive匯入的情況(圖中的步驟4),Hive將目錄移動到其倉庫而不是複製資料(步驟5)以提高效率。匯入後,Sqoop MapReduce作業寫入的HDFS目錄將不存在。
Hive匯入是透過--hive-import引數觸發的。就像快速聯結器一樣,此選項與--as-avrodatafile和--as -sequencefile選項不相容:
匯入包含Hive分隔符的字串
如果要匯入可以包含任何Hive分隔符(\n,\r和\01字元)的列,則可能會出現下游處理問題。在這種情況下,有兩種選擇:指定--hive-drop-import-delims,它將刪除匯入部分的衝突字元,或指定--hive-delims-replacement,它將用不同的字元替換它們。
如果Hive表已存在,則資料將附加到現有表。如果這不是所需的行為,則可以使用--hive-overwrite引數指示應使用匯入的資料替換現有表。Sqoop目前僅支援Hive的文字輸出,因此LZOP壓縮編解碼器是最佳選擇,因為它可以在Hadoop中拆分(詳見第4章)。以下示例顯示如何結合使用--hive-overwrite LZOP壓縮。為此,我們需要在叢集上構建並安裝LZOP,因為預設情況下它不與Hadoop(或CDH)捆綁在一起。有關詳細資訊,請參閱第4章(連結見文末):
最後,我們可以使用--hive-partition-key和--hive-partition-value引數根據要匯入的列的值建立不同的Hive分割槽。例如,如果要按stock名稱對輸入進行分割槽,請執行以下操作:
現在,前面的例子無論如何都不是最優的。理想情況下,單個匯入將能夠建立多個Hive分割槽。因為僅限於指定單個鍵和值,所以每個唯一的分割槽值需要執行一次匯入,這很費力。最好匯入到未分割槽的Hive表中,然後在載入後在表上追溯建立分割槽。
此外,提供給Sqoop的SQL查詢還必須注意過濾掉結果,以便僅包含與分割槽匹配的那些。換句話說,如果Sqoop用符號=“AAPL”更新WHERE子句,那將會很有用。
連續Sqoop執行
如果需要定期安排匯入HDFS,Oozie可以進行Sqoop整合,允許定期執行匯入和匯出。Oozie workflow.xml示例如下:
<command>元素中不支援單引號和雙引號,因此如果需要指定包含空格的引數,則需要使用<arg>元素:
使用Oozie的Sqoop時的另一個考慮因素是需要為Oozie提供JDBC驅動程式JAR。我們可以將JAR複製到工作流的lib/目錄中,也可以使用JAR更新Hadoop安裝的lib目錄。
總結
顯然,要使Sqoop工作,Hadoop叢集節點需要能夠訪問MySQL資料庫。常見的錯誤來源是錯誤配置或缺少Hadoop節點的連線。登入到其中一個Hadoop節點並嘗試使用MySQL客戶端連線到MySQL伺服器或嘗試使用mysqldump實用程式(如果使用的是快速聯結器)可能是明智的。
使用快速聯結器的另一個重點是,假設mysqldump安裝在每個Hadoop節點上,並且位於執行map任務的使用者路徑中。本節內容的重點是將傳統關聯式資料庫的資料匯入Hadoop,接下來,我們將從關係儲存轉換到NoSQL儲存—HBase,後者擅長與Hadoop的資料互操作,因為它使用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/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545816/viewspace-2216000/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何將資料從Hadoop匯出到關係型和NoSQL資料庫?HadoopSQL資料庫
- 如何將kafka中的資料快速匯入Hadoop?KafkaHadoop
- 如何將Excl內資料匯入資料庫?資料庫
- Hadoop資料傳輸:如何將資料移入和移出Hadoop?Hadoop
- 如何將外部資料庫 匯入到系統的SQL中資料庫SQL
- 資料匯入終章:如何將HBase的資料匯入HDFS?
- 將資料庫中資料匯入至solr索引庫資料庫Solr索引
- 100萬資料,如何快速的匯入資料庫?資料庫
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- 事件溯源將顛覆關聯式資料庫! - Remy事件資料庫REM
- TP5.1excel匯入資料庫的程式碼?php excel如何匯入資料庫?Excel資料庫PHP
- 如何將 EXCEL 資料寫入資料庫Excel資料庫
- 關聯式資料庫很快會替代向量資料庫資料庫
- 關聯式資料庫與文件資料庫對比資料庫
- Web Sql 關聯式資料庫WebSQL資料庫
- 大文字資料,匯入匯出到資料庫資料庫
- 資料庫系統原理-關聯式資料庫的規範化理論總結資料庫
- 教你兩種資料庫覆蓋式資料匯入方法資料庫
- Transmit教程|如何將Transmit傳輸到新的Mac並匯入資料MITMac
- 關聯式資料庫 Query_Execution資料庫
- 匯豐銀行從65個關聯式資料庫遷移到一個全球MongoDB資料庫 - diginomica資料庫MongoDB
- PostgreSQL資料庫匯入大量資料時如何最佳化SQL資料庫
- GeoRapter工具將shapefile資料匯入到Oracle空間資料庫中APTOracle資料庫
- python將目標檢測資料匯入到指定資料庫中Python資料庫
- SQL資料庫的匯入和匯出SQL資料庫
- 教你如何將二進位制檔案匯入到資料庫資料庫
- 將資料庫中資料匯出為excel表格資料庫Excel
- 事件溯源超越關聯式資料庫 - confluent事件資料庫
- Access 匯入 oracle 資料庫Oracle資料庫
- excel 匯入sqlyog資料庫ExcelSQL資料庫
- Mysql 資料庫匯入與匯出MySql資料庫
- Python使用pymysql和xlrd2將Excel資料匯入MySQL資料庫PythonMySqlExcel資料庫
- 匯入excel資源到資料庫Excel資料庫
- 寫給關聯式資料庫開發者的 TDengine 入門指南資料庫
- python如何將資料插入資料庫Python資料庫
- 10W資料匯入該如何與庫中資料去重?
- 厲害了!12秒將百萬資料透過EasyExcel匯入MySQL資料庫中ExcelMySql資料庫
- 陽振坤:OceanBase如何跨越關聯式資料庫的“死亡之谷”資料庫