Sqoop(1)

skyme發表於2016-05-05

Hadoop平臺的一個強大的地方是它處理不同格式資料的能力。HDFS能夠穩定的儲存日誌和

其它很多種來源的資料,並且Mapreduce程式可以處理各種各樣的資料格式,然後抽取相關的資料並且組合各種各樣的資料成為一個有用的結果。

但是,和HDFS之外的儲存倉庫互動資料的時候,Mapreduce程式需要使用外部的API來得到這些資料。通常,有價值的資料儲存在RDBMS中。Sqoop是一個允許使用者從其它RDBMS中抽取資料到Hadoop中,以便進一步分析處理。對資料的分析處理,可以使用Mapreduce程式或者其它更高階的工具,例如Hive

當一個分析管道的最終結果出來的時候,Sqoop可以將這些結果導回到資料庫,以便其它的

客戶端使用這些資料。

本章,我們將研究Sqoop是怎樣工作的和在你的資料處理管道中怎樣使用它。

獲得Sqoop

Sqoop在很多地方可以下載到。http://github.com/cloudera/sqoop是專案的主頁。這個倉庫包括Sqoop的所有原始碼和文件。本網站上面有官方發行版本,同樣也有正在開發的版本,在它們的程式碼倉庫中包括編譯專案的指導。相應的,Cloudera的釋出Hadoop版本包括與Hadoop或其它的工具(像Hive)相容的Sqoop安裝包。

如果你從github上下載了版本,他會放在類似這樣的目錄下,/home/yourname/sqoop-x.y.z/。我們稱這個目錄為$SQOOP_HOME

你可以用可執行的script命令$SQOOP_HOME/bin/sqoop來執行Sqoop

如果你從Cloudra上安裝了版本,安裝包會把Sqoop的指令碼放在標準位置例

如:/usr/bin/sqoop。你可以在命令視窗敲入sqoop就可以執行Sqoop了。

Sqoop命令不帶任何引數的時候 是沒有很多意義的,

% sqoop

Try sqoop help for usage.

Sqoop是由一系列工具和命令組織成的。不選擇一個工具,Sqoop不知道做什麼。help是這

樣的一種工具,它能夠列印出可用的工具。

% sqoop help

usage: sqoop COMMAND [ARGS]

Available commands:

codegen Generate code to interact with database records

create-hive-table Import a table definition into Hive

eval Evaluate a SQL statement and display the results

export Export an HDFS directory to a database table

help List available commands

import Import a table from a database to HDFS

import-all-tables Import tables from a database to HDFS

list-databases List available databases on a server

list-tables List available tables in a database

version Display version information

當輸入如下的命令時,會列印出具體工具的使用說明。

% sqoop help import

usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS]

Common arguments:

–connect <jdbc-uri> Specify JDBC connect string

–driver <class-name> Manually specify JDBC driver class to use

–hadoop-home <dir> Override $HADOOP_HOME

–help Print usage instructions

-P Read password from console

–password <password> Set authentication password

–username <username> Set authentication username

–verbose Print more information while working

執行Sqoo工具的一個替代的方法是用tool-specific指令碼命令。類似sqoop-toolname的命令

,例如:sqoop-help, sqoop-import, etc.

匯入資料的一個例子

安裝完Sqoop之後,你就可以用它往Hadoop裡面匯入資料了。

使用Sqoop從資料庫中匯出資料,如果你還沒有安裝資料伺服器,你需要選擇一個,對於大多數平臺來說,MySql是一個簡便易用的資料庫。

安裝和配置MySql,參考下面的文件,http://dev.mysql.com/doc/refman/5.1/en/。第二章的內容會有幫助。Debin使用者使用如下命令安裝,sudo aptget install mysql-client mysql-server

RedHat使用者使用以下命令:sudo yum install mysql mysql-server

MySql安裝好之後,我們登入進去並且建立資料庫。

例子15-1:建立一個MySql資料庫模式。

% mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 349

Server version: 5.1.37-1ubuntu5.4 (Ubuntu)

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the current input

statement.

mysql> CREATE DATABASE hadoopguide;

Query OK, 1 row affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON hadoopguide.* TO ‘%’@’localhost`;

Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON hadoopguide.* TO ”@’localhost`;

Query OK, 0 rows affected (0.00 sec)

mysql> quit;

Bye

上面提到的密碼是你的root使用者密碼。一般是你的shell登入密碼。如果你執行的是Ubuntu

或其它的Linux版本,使用root密碼無法直接登入時,你就用安裝時候設定的密碼登入。

在這個會話中,我們建立了一個新的資料模式叫做,hadoopguide,在本章節中,我們將都

會用它。然後我們允許任何的本地使用者都可以檢視和修改hadoopguide的內容,並且關閉會

話。當然了,在生產開發中,我們需要更多的關心許可權的控制,但是我們這個伺服器是臨

時使用的。上面賦予的許可權也是假設你執行在偽分散式上面。如果你工作在分散式叢集中

,你需要保證至少一個使用者,啟用了遠端訪問,這個使用者用來執行通過Sqoop匯入和匯出。


Sqoop的匯入工具會執行一個Mapreduce job,這個job連線到MySQL資料庫並且讀取資料庫中的表。預設情況下,這個過程會併發的使用四個map tasks 來加快匯入資料的過程。每個 task 會把它的匯入結果寫入到一個不同的檔案中,但是,所有檔案都在同一個目錄下面。

在這個例子中,我們只匯入三行資料,所以我們指定Sqoop使用一個單獨的map task -m 1),這樣我們在HDFS中只生成一個檔案。

我們可以通過如下命令檢視檔案的內容:

% hadoop fs -cat widgets/part-m-00000

1,sprocket,0.25,2010-02-10,1,Connects two gizmos

2,gizmo,4.00,2009-11-30,4,null

3,gadget,99.99,1983-08-13,13,Our flagship product

例子中的連線字串(jdbc:mysql://localhost/hadoopguide)會從本機的資料庫中讀取資料。如果使用的是一個分散式的Hadoop叢集,那麼,在連線字串中不應該指定位localhost主機名(譯註:指定主機名後,就特定的只連線那臺主機);map tasks 沒有執行在相同的機器上面,因為連線資料庫可能失敗。只有當Sqoop與資料庫伺服器執行在同一個主機上面時,才應該指明完整的主機名。

在預設情況下,Sqoop會把我們匯入的資料,生成逗號分隔符分開的文字檔案。分隔符可以自己指定。命令列中的引數可以指定分隔符,檔案格式,壓縮格式,和更多的對匯入過程的細緻的控制。

注:文字和二進位制檔案格式

Sqoop可以匯入資料到一些不同的檔案格式。文字格式(預設格式)提供一種便於人閱讀的資料格式,這種格式平臺無關性,是最簡單的結構。

但是,這種檔案格式,不可以處理二進位制欄位(例如資料庫中列中的可變二進位制型別欄位);不能區分出空值和包含null的字串。

為了解決這種情況,你應該使用Sqoop的基於Sequence的檔案格式。序列化檔案的缺點是,他們是Java特定的,並且目前Sqoop版本不能將其匯入到Hive中。

但是,序列化檔案提供了,更精確的匯入資料的替代方法的可能性。它也允許資料壓縮,同時保持了Mapreduce平行的處理同一個檔案不同部分的能力。