IT技術互動交流平臺

Apache Sqoop

作者:Overview——Sqoop 概述 - 林子系  來源:IT165收集  發布日期:2016-12-14 20:32:52

Apache Sqoop - Overview

Apache Sqoop 概述 

使用Hadoop來分析和處理數據需要將數據加載到集群中并且將它和企業生產數據庫中的其他數據進行結合處理。從生產系統加載大塊數據到Hadoop中或者從大型集群的map reduce應用中獲得數據是個挑戰。用戶必須意識到確保數據一致性,消耗生產系統資源,供應下游管道的數據預處理這些細節。用腳本來轉化數據是低效和耗時的方式。使用map reduce應用直接去獲取外部系統的數據使得應用變得復雜和增加了生產系統來自集群節點過度負載的風險。

這就是Apache Sqoop能夠做到的。Aapche Sqoop 目前是Apache軟件會的孵化項目。更多關于這個項目的信息可以在http://incubator.apache.org/sqoop查看

Sqoop能夠使得像關系型數據庫、企業數據倉庫和NoSQL系統那樣簡單地從結構化數據倉庫中導入導出數據。你可以使用Sqoop將數據從外部系統加載到HDFS,存儲在Hive和HBase表格中。Sqoop配合Ooozie能夠幫助你調度和自動運行導入導出任務。Sqoop使用基于支持插件來提供新的外部鏈接的連接器。

當你運行Sqoop的時候看起來是非常簡單的,但是表象底層下面發生了什么呢?數據集將被切片分到不同的partitions和運行一個只有map的作業來負責數據集的某個切片。因為Sqoop使用數據庫的元數據來推斷數據類型所以每條數據都以一種類型安全的方式來處理。

在這篇文章其余部分中我們將通過一個例子來展示Sqoop的各種使用方式。這篇文章的目標是提供Sqoop操作的一個概述而不是深入高級功能的細節。

導入數據

下面的命令用于將一個MySQL數據庫中名為ORDERS的表中所有數據導入到集群中
---
$ sqoop import --connect jdbc:mysql://localhost/acmedb
  --table ORDERS --username test --password ****
---

在這條命令中的各種選項解釋如下:

  • import: 指示Sqoop開始導入 --connect <connect string>, --username <user name>, --password <password>: 這些都是連接數據庫時需要的參數。這跟你通過JDBC連接數據庫時所使用的參數沒有區別 --table <table name>: 指定要導入哪個表

    導入操作通過下面Figure1所描繪的那兩步來完成。第一步,Sqoop從數據庫中獲取要導入的數據的元數據。第二步,Sqoop提交map-only作業到Hadoop集群中。第二步通過在前一步中獲取的元數據做實際的數據傳輸工作。

    Figure 1: Sqoop Import Overview

    導入的數據存儲在HDFS目錄下。正如Sqoop大多數操作一樣,用戶可以指定任何替換路徑來存儲導入的數據。

    默認情況下這些文檔包含用逗號分隔的字段,用新行來分隔不同的記錄。你可以明確地指定字段分隔符和記錄結束符容易地實現文件復制過程中的格式覆蓋。

    Sqoop也支持不同數據格式的數據導入。例如,你可以通過指定 --as-avrodatafile 選項的命令行來簡單地實現導入Avro 格式的數據。

    There are many other options that Sqoop provides which can be used to further tune the import operation to suit your specific requirements.

    Sqoop提供許多選項可以用來滿足指定需求的導入操作。

    導入數據到 Hive

    在許多情況下,導入數據到Hive就跟運行一個導入任務然后使用Hive創建和加載一個確定的表和partition。手動執行這個操作需要你要知道正確的數據類型映射和其他細節像序列化格式和分隔符。Sqoop負責將合適的表格元數據填充到Hive 元數據倉庫和調用必要的指令來加載table和partition。這些操作都可以通過簡單地在命令行中指定--hive-import 來實現。
    ----
    $ sqoop import --connect jdbc:mysql://localhost/acmedb
      --table ORDERS --username test --password **** --hive-import
    ----

    當你運行一個Hive import時,Sqoop將會將數據的類型從外部數據倉庫的原生數據類型轉換成Hive中對應的類型,Sqoop自動地選擇Hive使用的本地分隔符。如果被導入的數據中有新行或者有其他Hive分隔符,Sqoop允許你移除這些字符并且獲取導入到Hive的正確數據。

    一旦導入操作完成,你就像Hive其他表格一樣去查看和操作。

    導入數據到 HBase

    你可以使用Sqoop將數據插入到HBase表格中特定列族。跟Hive導入操作很像,可以通過指定一個額外的選項來指定要插入的HBase表格和列族。所有導入到HBase的數據將轉換成字符串并以UTF-8字節數組的格式插入到HBase中

    ----
    $ sqoop import --connect jdbc:mysql://localhost/acmedb
     --table ORDERS --username test --password ****
    --hbase-create-table --hbase-table ORDERS --column-family mysql
    ----
     

    下面是命令行中各種選項的解釋:

  • --hbase-create-table: 這個選項指示Sqoop創建HBase表. --hbase-table: 這個選項指定HBase表格的名字. --column-family: T這個選項指定列族的名字.

    剩下的選項跟普通的導入操作一樣。

    導出數據

    在一些情況中,通過Hadoop pipelines來處理數據可能需要