教程 | 使用Sqoop從MySQL匯入資料到Hive和HBase

來源:互聯網
上載者:User

標籤:oop   ns2   tom   primary   tar   images   oat   load   one   

基礎環境

sqoop:sqoop-1.4.5+cdh5.3.6+78,

hive:hive-0.13.1+cdh5.3.6+397,

hbase:hbase-0.98.6+cdh5.3.6+115

Sqool和Hive、HBase簡介

Sqoop

Sqoop是一個用來將Hadoop和關係型資料庫中的資料相互轉移的開源工具,可以將一個關係型資料庫(例如 : MySQL ,Oracle ,Postgres等)中的資料導進到Hadoop的HDFS中,也可以將HDFS的資料導進到關係型資料庫中。

Hive

不想用程式語言開發MapReduce的朋友比如DB們,熟悉SQL的朋友可以使用Hive開離線的進行資料處理與分析工作。Hive是基於Hadoop的一個資料倉儲工具,可以將結構化的資料檔案映射為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。注意Hive現在適合在離線下進行資料的操作,就是說不適合在掛在真實的生產環境中進行即時的線上查詢或操作,因為一個字“慢”。

Hive起源於FaceBook,在Hadoop中扮演資料倉儲的角色。建立在Hadoop叢集的最頂層,對儲存在Hadoop群上的資料提供類SQL的介面進行操作。你可以用 HiveQL進行select、join,等等操作。如果你有資料倉儲的需求並且你擅長寫SQL並且不想寫MapReduce jobs就可以用Hive代替。

Hive的內建資料類型可以分為兩大類:

(1)、基礎資料類型;

(2)、複雜資料類型。

其中,基礎資料類型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。

下面的表格列出這些基礎類型所佔的位元組以及從什麼版本開始支援這些類型。

複雜類型包括ARRAY、MAP、STRUCT、UNION,這些複雜類型是由基礎類型組成的。

HBase

HBase作為面向列的資料庫運行在HDFS之上,HDFS缺乏隨即讀寫操作,HBase正是為此而出現。HBase以Google BigTable為藍本,以索引值對的形式儲存。項目的目標就是快速在主機內數十億行資料中定位所需的資料並訪問它。

HBase是一個資料庫,一個NoSql的資料庫,像其他資料庫一樣提供隨即讀寫功能,Hadoop不能滿足即時需要,HBase正可以滿足。如果你需要即時訪問一些資料,就把它存入HBase。

你可以用Hive作為待用資料倉庫,HBase作為資料存放區,放那些進行一些會改變的資料。在Hive中,普通表是儲存在HDFS中,而你可以通過建立EXTERNAL TABLE外表來指定資料存放區位置,可以是系統目錄,也可以是Elasticsearch,還可以是HBase。

在使用Sqoop從Mysql匯出資料入Hadoop時,就需要考慮是直接入Hive(此時是普通表),還是匯入資料到HBase,Sqoop同時支援匯入這兩種匯入。

測試Sqoop

以上Sqoop語句執行過後,可以確認Sqoop運行正常,Sqoop串連MySQL正常。

使用Sqoop從MySQL匯入資料到Hive

使用複雜SQL

注意:

由於使用Sqoop從MySQL匯入資料到Hive需要指定target-dir,因此匯入的是普通表而不能為外部表格。

以下簡要列舉了Sqoop的執行過程:

可以看出,--split-by設定後,job按設定值切分,切分個數為-m設定值(-m 5 不設定的話預設job切分數是4)。經檢驗,此種較複雜的SQL語句,Sqoop支援得很好。

調整Hive資料類型

上面任務執行成功後,經過檢測,發現Hive表結構中的資料類型與MySQL對應列有如下關係:

可以看出MySQL的decimal類型變成了Hive中的double類型。此時需要在匯入時通過--map-column-hive 作出映射關係指定,如下所示:

以上命令可以執行成功,然而Hive列類型設定為DECIMAL時,從Mysql[decimal(12,2)]-->Hive[decimal]會導致匯入後小數丟失。

注意:

對於cost="DECIMAL(10,2)"這樣指定精確度的映射語句的執行,在Sqoop1.4.5中執行失敗。這是Sqoop1.4.5的一個BUG,詳情見:https://issues.apache.org/jira/browse/SQOOP-2103,它在1.4.7版本中修複。

不斷更新

將上面Sqoop語句執行兩次,在執行第二次時會出現錯誤:

這表示HDFS中已經存在相應儲存,此時需要執行Sqoop-Hive的增量匯入語句。

注意:

由於Hive沒有rowkey,其hdfs儲存決定了Sqoop-Hive只能添加,update更新匯入無法進行。

使用Sqoop從MySQL匯入資料到HBase

使用複雜SQL

上面SQL語句較簡單。經檢驗,更複雜的SQL語句,Sqoop支援得很好,匯入正常。

不斷更新

以上指定了HBase的Rowkey後,再次執行從MySQL匯入資料到HBase的Sqoop語句,基於相同的Rowkey值,HBase內相應的行會進行更新替換。

Hive使用HBase資料

關於Hive使用儲存在HBase中的資料,更多詳細資料可以查看《使用Hive或Impala執行SQL語句,對儲存在HBase中的資料操作》一文。

關於Sqoop2

架構上,Sqoop1使用MapOnly作業進行Hadoop(HDFS/HBase/Hive)同關聯式資料庫進行資料的匯入匯出,使用者使用命令列方式與之互動,資料轉送和資料格式緊密耦合;易用性欠佳,Connector資料格式支援有限,安全性不好,對Connector的限制過死。Sqoop2則建立了集中化的服務,負責管理完整的MapReduce作業,提供多種使用者互動方式(CLI/WebUI/RESTAPI),具有許可權管理機制,具有正常化的Connector,使得它更加易用,更加安全,更加專註。

綜上所述

使用Sqoop從MySQL匯入資料到HBase要比匯入到Hive方便,使用Hive對HBase資料操作時,也無decimal精度相關BUG,並且可以很好的支援更新。因此建議使用Sqoop從MySQL匯入資料到HBase,而非直接Hive。

經過測試,使用Sqoop從MySQL匯入資料到HBase,100萬條需花費7~12分鐘。impala對於hbase的查詢效率也沒有對hdfs效率高。

總結

在大資料領域浸染的多了,才知道當前社會上的公司對於大資料方向的技術都是什麼樣的理解。有的公司資料量足夠大,但資料並無價值或者價值不夠大,我們稱之為LU(large but unavailable)類型公司;有的公司資料量不多,但都價值連城,我們稱之為SV(small but valuable)類型公司;有的公司資料量很大,資料也都很有價值,我們稱之為LV(large and valuable)類型公司。

LU公司市場上有很多,造成資料無價值的因素可能是有資料本身的原因,也有產品的原因,他們也經常想要在當前環境下試下大資料的水,這便要細心甄別。SV公司也有不少,對於他們而言,好的資料分析師比大資料平台更重要,欲要試水大資料,還是要對資料量有清晰的預估。LV公司是最需要搭建大資料平台的,但又往往他們沒有技術與慾望去做這件事,這也比較可恨。

簡而言之,想做的不一定需要,不做的不一定不需要。

End.


精選留言

該文章作者已設定需關注才可以留言

寫留言

    該文章作者已設定需關注才可以留言

    寫留言

    載入中以上留言由公眾號篩選後顯示

    瞭解留言功能詳情

    掃一掃
    關注該公眾號



    來自為知筆記(Wiz)

    教程 | 使用Sqoop從MySQL匯入資料到Hive和HBase

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.