Sqoop 快速指南



Sqoop - 簡介

傳統的應用程式管理系統,即應用程式與使用 RDBMS 的關係資料庫的互動,是大資料產生的來源之一。這種由 RDBMS 生成的大資料儲存在關係資料庫結構中的關係資料庫伺服器中。

當 Hadoop 生態系統中的 MapReduce、Hive、HBase、Cassandra、Pig 等大資料儲存和分析工具出現時,它們需要一個工具來與關係資料庫伺服器互動,以匯入和匯出駐留在其中的大資料。在這裡,Sqoop 在 Hadoop 生態系統中佔據一席之地,以提供關係資料庫伺服器和 Hadoop 的 HDFS 之間的可行互動。

Sqoop - “SQL 到 Hadoop 和 Hadoop 到 SQL”

Sqoop 是一種旨在在 Hadoop 和關係資料庫伺服器之間傳輸資料的工具。它用於將資料從關係資料庫(如 MySQL、Oracle)匯入到 Hadoop HDFS,以及將資料從 Hadoop 檔案系統匯出到關係資料庫。它由 Apache 軟體基金會提供。

Sqoop 如何工作?

下圖描述了 Sqoop 的工作流程。

Sqoop Work

Sqoop 匯入

匯入工具將 RDBMS 中的單個表匯入到 HDFS。表中的每一行都被視為 HDFS 中的一條記錄。所有記錄都以文字檔案的形式儲存為文字資料,或以 Avro 和 Sequence 檔案的形式儲存為二進位制資料。

Sqoop 匯出

匯出工具將 HDFS 中的一組檔案匯出回 RDBMS。作為 Sqoop 輸入的檔案包含記錄,這些記錄稱為表中的行。它們被讀取並解析成一組記錄,並以使用者指定的定界符分隔。

Sqoop - 安裝

由於 Sqoop 是 Hadoop 的一個子專案,因此它只能在 Linux 作業系統上執行。請按照以下步驟在您的系統上安裝 Sqoop。

步驟 1:驗證 JAVA 安裝

在安裝 Sqoop 之前,您需要在系統上安裝 Java。讓我們使用以下命令驗證 Java 安裝 -

$ java –version

如果 Java 已安裝在您的系統上,您將看到以下響應 -

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

如果 Java 未安裝在您的系統上,請按照以下步驟操作。

安裝 Java

按照以下簡單步驟在您的系統上安裝 Java。

步驟 1

透過訪問以下連結下載 Java(JDK <最新版本> - X64.tar.gz)。

然後 jdk-7u71-linux-x64.tar.gz 將下載到您的系統上。

步驟 2

通常,您可以在“下載”資料夾中找到下載的 Java 檔案。驗證它並使用以下命令解壓縮 jdk-7u71-linux-x64.gz 檔案。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz
$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

步驟 3

要使 Java 對所有使用者可用,您必須將其移動到“/usr/local/”位置。開啟 root,並鍵入以下命令。

$ su
password:

# mv jdk1.7.0_71 /usr/local/java
# exitStep IV:

步驟 4

要設定 PATH 和 JAVA_HOME 變數,請將以下命令新增到 ~/.bashrc 檔案中。

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin

現在將所有更改應用到當前正在執行的系統中。

$ source ~/.bashrc

步驟 5

使用以下命令配置 Java 備選方案 -

# alternatives --install /usr/bin/java java usr/local/java/bin/java 2
# alternatives --install /usr/bin/javac javac usr/local/java/bin/javac 2
# alternatives --install /usr/bin/jar jar usr/local/java/bin/jar 2

# alternatives --set java usr/local/java/bin/java
# alternatives --set javac usr/local/java/bin/javac
# alternatives --set jar usr/local/java/bin/jar

現在使用終端中的命令java -version驗證安裝,如上所述。

步驟 2:驗證 Hadoop 安裝

在安裝 Sqoop 之前,必須在您的系統上安裝 Hadoop。讓我們使用以下命令驗證 Hadoop 安裝 -

$ hadoop version

如果 Hadoop 已安裝在您的系統上,那麼您將獲得以下響應 -

Hadoop 2.4.1
--
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4

如果 Hadoop 未安裝在您的系統上,請繼續執行以下步驟 -

下載 Hadoop

使用以下命令從 Apache 軟體基金會下載並解壓縮 Hadoop 2.4.1。

$ su
password:

# cd /usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit

以偽分散式模式安裝 Hadoop

按照以下步驟以偽分散式模式安裝 Hadoop 2.4.1。

步驟 1:設定 Hadoop

您可以透過將以下命令附加到 ~/.bashrc 檔案來設定 Hadoop 環境變數。

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

現在,將所有更改應用到當前正在執行的系統中。

$ source ~/.bashrc

步驟 2:Hadoop 配置

您可以在“$HADOOP_HOME/etc/hadoop”位置找到所有 Hadoop 配置檔案。您需要根據您的 Hadoop 基礎架構對這些配置檔案進行適當的更改。

$ cd $HADOOP_HOME/etc/hadoop

為了使用 java 開發 Hadoop 程式,您必須透過將 JAVA_HOME 值替換為系統中 java 的位置來重置hadoop-env.sh檔案中的 java 環境變數。

export JAVA_HOME=/usr/local/java

以下是您需要編輯以配置 Hadoop 的檔案列表。

core-site.xml

core-site.xml 檔案包含諸如 Hadoop 例項使用的埠號、分配給檔案系統的記憶體、儲存資料的記憶體限制以及讀/寫緩衝區的大小等資訊。

開啟 core-site.xml 並將以下屬性新增到<configuration>和</configuration>標籤之間。

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://:9000 </value>
   </property>
</configuration>

hdfs-site.xml

hdfs-site.xml 檔案包含諸如複製資料的值、namenode 路徑和本地檔案系統的 datanode 路徑等資訊。這意味著您要儲存 Hadoop 基礎架構的位置。

讓我們假設以下資料。

dfs.replication (data replication value) = 1

(In the following path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode

開啟此檔案並在<configuration>、</configuration>標籤之間新增以下屬性。

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
   
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
   </property>
   
   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value>
   </property>
</configuration>

注意 - 在上述檔案中,所有屬性值都是使用者定義的,您可以根據您的 Hadoop 基礎架構進行更改。

yarn-site.xml

此檔案用於將 yarn 配置到 Hadoop 中。開啟 yarn-site.xml 檔案並在<configuration>、</configuration>標籤之間新增以下屬性。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

mapred-site.xml

此檔案用於指定我們正在使用哪個 MapReduce 框架。預設情況下,Hadoop 包含 yarn-site.xml 的模板。首先,您需要使用以下命令將檔案從 mapred-site.xml.template 複製到 mapred-site.xml 檔案。

$ cp mapred-site.xml.template mapred-site.xml

開啟 mapred-site.xml 檔案並在<configuration>、</configuration>標籤之間新增以下屬性。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

驗證 Hadoop 安裝

以下步驟用於驗證 Hadoop 安裝。

步驟 1:Name Node 設定

使用命令“hdfs namenode -format”設定 namenode,如下所示。

$ cd ~
$ hdfs namenode -format

預期結果如下。

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

步驟 2:驗證 Hadoop dfs

以下命令用於啟動 dfs。執行此命令將啟動您的 Hadoop 檔案系統。

$ start-dfs.sh

預期輸出如下 -

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

步驟 3:驗證 Yarn 指令碼

以下命令用於啟動 yarn 指令碼。執行此命令將啟動您的 yarn 守護程序。

$ start-yarn.sh

預期輸出如下 -

starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting node manager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

步驟 4:在瀏覽器中訪問 Hadoop

訪問 Hadoop 的預設埠號為 50070。使用以下 URL 在瀏覽器中獲取 Hadoop 服務。

https://:50070/

下圖顯示了一個 Hadoop 瀏覽器。

Accessing Hadoop on Browser

步驟 5:驗證叢集的所有應用程式

訪問叢集所有應用程式的預設埠號為 8088。使用以下 url 訪問此服務。

https://:8088/

下圖顯示了 Hadoop 叢集瀏覽器。

Hadoop Application Cluster

步驟 3:下載 Sqoop

我們可以從以下連結下載最新版本的 Sqoop。在本教程中,我們使用版本 1.4.5,即sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar.gz

步驟 4:安裝 Sqoop

以下命令用於解壓縮 Sqoop tar 包並將其移動到“/usr/lib/sqoop”目錄。

$tar -xvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz
$ su
password:

# mv sqoop-1.4.4.bin__hadoop-2.0.4-alpha /usr/lib/sqoop
#exit

步驟 5:配置 bashrc

您必須透過將以下行附加到 ~/.bashrc檔案來設定 Sqoop 環境 -

#Sqoop
export SQOOP_HOME=/usr/lib/sqoop export PATH=$PATH:$SQOOP_HOME/bin

以下命令用於執行 ~/.bashrc檔案。

$ source ~/.bashrc

步驟 6:配置 Sqoop

要將 Sqoop 與 Hadoop 配合使用,您需要編輯sqoop-env.sh檔案,該檔案位於$SQOOP_HOME/conf目錄中。首先,重定向到 Sqoop 配置目錄並使用以下命令複製模板檔案 -

$ cd $SQOOP_HOME/conf
$ mv sqoop-env-template.sh sqoop-env.sh

開啟sqoop-env.sh並編輯以下行 -

export HADOOP_COMMON_HOME=/usr/local/hadoop 
export HADOOP_MAPRED_HOME=/usr/local/hadoop

步驟 7:下載並配置 mysql-connector-java

我們可以從以下連結下載mysql-connector-java-5.1.30.tar.gz檔案。

以下命令用於解壓縮 mysql-connector-java tar 包並將mysql-connector-java-5.1.30-bin.jar移動到 /usr/lib/sqoop/lib 目錄。

$ tar -zxf mysql-connector-java-5.1.30.tar.gz
$ su
password:

# cd mysql-connector-java-5.1.30
# mv mysql-connector-java-5.1.30-bin.jar /usr/lib/sqoop/lib

步驟 8:驗證 Sqoop

以下命令用於驗證 Sqoop 版本。

$ cd $SQOOP_HOME/bin
$ sqoop-version

預期輸出 -

14/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
Sqoop 1.4.5 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2014

Sqoop 安裝已完成。

Sqoop - 匯入

本章介紹如何將資料從 MySQL 資料庫匯入到 Hadoop HDFS。“匯入工具”將 RDBMS 中的單個表匯入到 HDFS。表中的每一行都被視為 HDFS 中的一條記錄。所有記錄都以文字檔案的形式儲存為文字資料,或以 Avro 和 Sequence 檔案的形式儲存為二進位制資料。

語法

以下語法用於將資料匯入 HDFS。

$ sqoop import (generic-args) (import-args) 
$ sqoop-import (generic-args) (import-args)

示例

讓我們以三個名為empemp_addemp_contact的表為例,它們位於 MySQL 資料庫伺服器中名為 userdb 的資料庫中。

三個表及其資料如下所示。

emp

id name deg salary dept
1201 gopal manager 50,000 TP
1202 manisha Proof reader 50,000 TP
1203 khalil php dev 30,000 AC
1204 prasanth php dev 30,000 AC
1204 kranthi admin 20,000 TP

emp_add

idhnostreetcity
1201 288A vgiri jublee
1202 108I aoc sec-bad
1203 144Z pgutta hyd
1204 78B old city sec-bad
1205 720X hitec sec-bad

emp_contact

id phno email
1201 2356742 gopal@tp.com
1202 1661663 manisha@tp.com
1203 8887776 khalil@ac.com
1204 9988774 prasanth@ac.com
1205 1231231 kranthi@tp.com

匯入表

Sqoop 工具“匯入”用於將表資料從表匯入到 Hadoop 檔案系統作為文字檔案或二進位制檔案。

以下命令用於將emp表從 MySQL 資料庫伺服器匯入到 HDFS。

$ sqoop import \
--connect jdbc:mysql:///userdb \
--username root \
--table emp --m 1

如果成功執行,則您將獲得以下輸出。

14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
14/12/22 15:24:56 INFO tool.CodeGenTool: Beginning code generation
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: 
   SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: 
   SELECT t.* FROM `emp` AS t LIMIT 1
14/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
14/12/22 15:25:11 INFO orm.CompilationManager: Writing jar file: 
   /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:25:40 INFO mapreduce.Job: The url to track the job: 
   https://:8088/proxy/application_1419242001831_0001/
14/12/22 15:26:45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode : 
   false
14/12/22 15:26:45 INFO mapreduce.Job: map 0% reduce 0%
14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%
14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds 
   (0.8165 bytes/sec)
14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.

要驗證 HDFS 中匯入的資料,請使用以下命令。

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*

它向您顯示emp表資料,欄位以逗號 (,) 分隔。

1201, gopal,    manager, 50000, TP
1202, manisha,  preader, 50000, TP
1203, kalil,    php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi,  admin,   20000, TP

匯入到目標目錄

在將表資料匯入到 HDFS 時,我們可以使用 Sqoop 匯入工具指定目標目錄。

以下是將目標目錄作為選項指定給 Sqoop 匯入命令的語法。

--target-dir <new or exist directory in HDFS>

以下命令用於將emp_add表資料匯入到‘/queryresult’目錄。

$ sqoop import \
--connect jdbc:mysql:///userdb \
--username root \
--table emp_add \
--m 1 \
--target-dir /queryresult

以下命令用於驗證從emp_add表匯入到/queryresult目錄的資料。

$ $HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*

它將顯示emp_add表資料,欄位之間以逗號(,)分隔。

1201, 288A, vgiri,   jublee
1202, 108I, aoc,     sec-bad
1203, 144Z, pgutta,  hyd
1204, 78B,  oldcity, sec-bad
1205, 720C, hitech,  sec-bad

匯入表的子集資料

我們可以使用Sqoop匯入工具中的‘where’子句匯入表的子集。它在相應的資料庫伺服器上執行對應的SQL查詢,並將結果儲存到HDFS的目標目錄中。

where子句的語法如下所示。

--where <condition>

以下命令用於匯入emp_add表資料的子集。子集查詢用於檢索居住在Secunderabad市的員工的員工ID和地址。

$ sqoop import \
--connect jdbc:mysql:///userdb \
--username root \
--table emp_add \
--m 1 \
--where “city =’sec-bad’” \
--target-dir /wherequery

以下命令用於驗證從emp_add表匯入到/wherequery目錄的資料。

$ $HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*

它將顯示emp_add表資料,欄位之間以逗號(,)分隔。

1202, 108I, aoc,     sec-bad
1204, 78B,  oldcity, sec-bad
1205, 720C, hitech,  sec-bad

增量匯入

增量匯入是一種僅匯入表中新新增行的技術。需要新增‘incremental’、‘check-column’和‘last-value’選項來執行增量匯入。

以下語法用於Sqoop匯入命令中的增量選項。

--incremental <mode>
--check-column <column name>
--last value <last check column value>

假設新新增到emp表中的資料如下所示:

1206, satish p, grp des, 20000, GR

以下命令用於執行emp表的增量匯入。

$ sqoop import \
--connect jdbc:mysql:///userdb \
--username root \
--table emp \
--m 1 \
--incremental append \
--check-column id \
-last value 1205

以下命令用於驗證從emp表匯入到HDFS emp/目錄的資料。

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*

它將顯示emp表資料,欄位之間以逗號(,)分隔。

1201, gopal,    manager, 50000, TP
1202, manisha,  preader, 50000, TP
1203, kalil,    php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi,  admin,   20000, TP
1206, satish p, grp des, 20000, GR

以下命令用於檢視emp表中修改或新新增的行。

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1

它將顯示新新增到emp表中的行,欄位之間以逗號(,)分隔。

1206, satish p, grp des, 20000, GR

Sqoop - 匯入所有表

本章介紹如何將RDBMS資料庫伺服器中的所有表匯入到HDFS。每個表的資料都儲存在單獨的目錄中,並且目錄名稱與表名稱相同。

語法

以下語法用於匯入所有表。

$ sqoop import-all-tables (generic-args) (import-args) 
$ sqoop-import-all-tables (generic-args) (import-args)

示例

讓我們以從userdb資料庫匯入所有表為例。資料庫userdb包含的表列表如下所示。

 +--------------------+
 |      Tables        |
 +--------------------+
 |      emp           |
 |      emp_add       |
 |      emp_contact   |
 +--------------------+

以下命令用於從userdb資料庫匯入所有表。

$ sqoop import-all-tables \
--connect jdbc:mysql:///userdb \
--username root

注意 - 如果您使用import-all-tables,則該資料庫中的每個表都必須具有主鍵欄位。

以下命令用於驗證所有表資料到HDFS中的userdb資料庫。

$ $HADOOP_HOME/bin/hadoop fs -ls

它將顯示userdb資料庫中表名作為目錄的列表。

輸出

drwxr-xr-x - hadoop supergroup 0 2014-12-22 22:50 _sqoop
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:46 emp
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:50 emp_add
drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:52 emp_contact

Sqoop - 匯出

本章介紹如何將資料從HDFS匯出回RDBMS資料庫。目標表必須存在於目標資料庫中。作為Sqoop輸入的檔案包含記錄,在表中稱為行。這些記錄被讀取並解析成一組記錄,並以使用者指定的定界符分隔。

預設操作是使用INSERT語句將輸入檔案中的所有記錄插入到資料庫表中。在更新模式下,Sqoop會生成UPDATE語句,該語句會將現有記錄替換到資料庫中。

語法

以下是匯出命令的語法。

$ sqoop export (generic-args) (export-args) 
$ sqoop-export (generic-args) (export-args)

示例

讓我們以HDFS中檔案中的員工資料為例。員工資料位於HDFS中‘emp/’目錄下的emp_data檔案中。emp_data內容如下所示。

1201, gopal,     manager, 50000, TP
1202, manisha,   preader, 50000, TP
1203, kalil,     php dev, 30000, AC
1204, prasanth,  php dev, 30000, AC
1205, kranthi,   admin,   20000, TP
1206, satish p,  grp des, 20000, GR

必須手動建立要匯出的表,並且該表存在於要從中匯出資料的資料庫中。

以下查詢用於在mysql命令列中建立表‘employee’。

$ mysql
mysql> USE db;
mysql> CREATE TABLE employee ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT,
   dept VARCHAR(10));

以下命令用於將表資料(位於HDFS上的emp_data檔案)匯出到Mysql資料庫伺服器的db資料庫中的employee表。

$ sqoop export \
--connect jdbc:mysql:///db \
--username root \
--table employee \ 
--export-dir /emp/emp_data

以下命令用於在mysql命令列中驗證表。

mysql>select * from employee;

如果給定資料成功儲存,則您可以在以下表中找到給定員工資料。

+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | kalil        | php dev     | 30000             | AC     |
| 1204 | prasanth     | php dev     | 30000             | AC     |
| 1205 | kranthi      | admin       | 20000             | TP     |
| 1206 | satish p     | grp des     | 20000             | GR     |
+------+--------------+-------------+-------------------+--------+

Sqoop - 作業

本章介紹如何建立和維護Sqoop作業。Sqoop作業建立並儲存匯入和匯出命令。它指定引數來識別和呼叫已儲存的作業。此重新呼叫或重新執行用於增量匯入,該匯入可以將更新的行從RDBMS表匯入到HDFS。

語法

以下是建立Sqoop作業的語法。

$ sqoop job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

$ sqoop-job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

建立作業(--create)

在這裡,我們使用名稱myjob建立一個作業,該作業可以將表資料從RDBMS表匯入到HDFS。以下命令用於建立一個作業,該作業將db資料庫中的employee表中的資料匯入到HDFS檔案。

$ sqoop job --create myjob \
-- import \
--connect jdbc:mysql:///db \
--username root \
--table employee --m 1

驗證作業(--list)

‘--list’引數用於驗證已儲存的作業。以下命令用於驗證已儲存的Sqoop作業列表。

$ sqoop job --list

它顯示已儲存作業的列表。

Available jobs: 
   myjob

檢查作業(--show)

‘--show’引數用於檢查或驗證特定作業及其詳細資訊。以下命令和示例輸出用於驗證名為myjob的作業。

$ sqoop job --show myjob

它顯示了在myjob中使用的工具及其選項。

Job: myjob 
 Tool: import Options:
 ---------------------------- 
 direct.import = true
 codegen.input.delimiters.record = 0
 hdfs.append.dir = false 
 db.table = employee
 ...
 incremental.last.value = 1206
 ...

執行作業(--exec)

‘--exec’選項用於執行已儲存的作業。以下命令用於執行名為myjob的已儲存作業。

$ sqoop job --exec myjob

它將顯示以下輸出。

10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation 
...

Sqoop - 程式碼生成

本章介紹了‘codegen’工具的重要性。從面向物件應用程式的角度來看,每個資料庫表都具有一個DAO類,該類包含‘getter’和‘setter’方法來初始化物件。此工具(-codegen)會自動生成DAO類。

它根據表模式結構生成Java中的DAO類。Java定義在匯入過程中例項化。此工具的主要用途是檢查Java是否丟失了Java程式碼。如果是,它將使用欄位之間的預設分隔符建立Java的新版本。

語法

以下是Sqoop codegen命令的語法。

$ sqoop codegen (generic-args) (codegen-args) 
$ sqoop-codegen (generic-args) (codegen-args)

示例

讓我們以生成userdb資料庫中emp表的Java程式碼為例。

以下命令用於執行給定的示例。

$ sqoop codegen \
--connect jdbc:mysql:///userdb \
--username root \ 
--table emp

如果命令執行成功,則它將在終端上生成以下輸出。

14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation
……………….
14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
Note: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or 
   overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file: 
   /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar

驗證

讓我們看一下輸出。以粗體顯示的路徑是生成並存儲emp表Java程式碼的位置。讓我們使用以下命令驗證該位置中的檔案。

$ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/
$ ls
emp.class
emp.jar
emp.java

如果要深入驗證,請比較userdb資料庫中的emp表和以下目錄中的emp.java

/tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/。

Sqoop - Eval

本章介紹如何使用Sqoop的‘eval’工具。它允許使用者對相應的資料庫伺服器執行使用者定義的查詢,並在控制檯中預覽結果。因此,使用者可以預期要匯入的結果表資料。使用eval,我們可以評估任何型別的SQL查詢,該查詢可以是DDL或DML語句。

語法

以下是Sqoop eval命令的語法。

$ sqoop eval (generic-args) (eval-args) 
$ sqoop-eval (generic-args) (eval-args)

選擇查詢評估

使用eval工具,我們可以評估任何型別的SQL查詢。讓我們以在db資料庫的employee表中選擇有限行為例。以下命令用於使用SQL查詢評估給定的示例。

$ sqoop eval \
--connect jdbc:mysql:///db \
--username root \ 
--query “SELECT * FROM employee LIMIT 3”

如果命令執行成功,則它將在終端上生成以下輸出。

+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | khalil       | php dev     | 30000             | AC     |
+------+--------------+-------------+-------------------+--------+

插入查詢評估

Sqoop eval工具既適用於建模也適用於定義SQL語句。這意味著,我們也可以將eval用於insert語句。以下命令用於在db資料庫的employee表中插入新行。

$ sqoop eval \
--connect jdbc:mysql:///db \
--username root \ 
-e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”

如果命令執行成功,則它將在控制檯中顯示更新行的狀態。

或者,您可以在MySQL控制檯中驗證employee表。以下命令用於使用select’查詢驗證db資料庫的employee表的行。

mysql>
mysql> use db;
mysql> SELECT * FROM employee;
+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | khalil       | php dev     | 30000             | AC     |
| 1204 | prasanth     | php dev     | 30000             | AC     |
| 1205 | kranthi      | admin       | 20000             | TP     |
| 1206 | satish p     | grp des     | 20000             | GR     |
| 1207 | Raju         | UI dev      | 15000             | TP     |
+------+--------------+-------------+-------------------+--------+

Sqoop - 列出資料庫

本章介紹如何使用Sqoop列出資料庫。Sqoop list-databases工具解析並對資料庫伺服器執行‘SHOW DATABASES’查詢。然後,它列出伺服器上的現有資料庫。

語法

以下是Sqoop list-databases命令的語法。

$ sqoop list-databases (generic-args) (list-databases-args) 
$ sqoop-list-databases (generic-args) (list-databases-args)

示例查詢

以下命令用於列出MySQL資料庫伺服器中的所有資料庫。

$ sqoop list-databases \
--connect jdbc:mysql:/// \
--username root

如果命令執行成功,則它將顯示MySQL資料庫伺服器中的資料庫列表,如下所示。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

mysql
test
userdb
db

本章介紹如何使用Sqoop列出MySQL資料庫伺服器中特定資料庫的表。Sqoop list-tables工具解析並對特定資料庫執行‘SHOW TABLES’查詢。然後,它列出資料庫中的現有表。

語法

以下是Sqoop list-tables命令的語法。

$ sqoop list-tables (generic-args) (list-tables-args) 
$ sqoop-list-tables (generic-args) (list-tables-args)

示例查詢

以下命令用於列出MySQL資料庫伺服器的userdb資料庫中的所有表。

$ sqoop list-tables \
--connect jdbc:mysql:///userdb \
--username root

如果命令執行成功,則它將顯示userdb資料庫中的表列表,如下所示。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

emp
emp_add
emp_contact

Sqoop - 列出表

本章介紹如何使用Sqoop列出MySQL資料庫伺服器中特定資料庫的表。Sqoop list-tables工具解析並對特定資料庫執行‘SHOW TABLES’查詢。然後,它列出資料庫中的現有表。

語法

以下是Sqoop list-tables命令的語法。

$ sqoop list-tables (generic-args) (list-tables-args) 
$ sqoop-list-tables (generic-args) (list-tables-args)

示例查詢

以下命令用於列出MySQL資料庫伺服器的userdb資料庫中的所有表。

$ sqoop list-tables \
--connect jdbc:mysql:///userdb \
--username root

如果命令執行成功,則它將顯示userdb資料庫中的表列表,如下所示。

...
13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.

emp
emp_add
emp_contact
廣告