黃明輝
(湖北三峽職業(yè)技術學院電子信息學院,湖北 宜昌 443000)
Sqoop是一種旨在有效地在ApacheHadoop和關系數據庫等結構化數據存儲之間傳輸大量數據的工具,結構化數據可以是MySQL、Oracle等RDBMS。Sqoop底層用MapReduce程序實現(xiàn)抽取、轉換、加載,MapReduce良好的特性保證了并行化和高容錯率,而且相比 Kettle等傳統(tǒng)ETL工具,任務運行在Hadoop集群上,減少了ETL服務器資源的使用情況。在特定場景上,抽取過程會有很大的性能提升。
可以使用Sqoop工具將數據從關系數據庫管理系統(tǒng)導入(import)到Hadoop分布式文件系統(tǒng)中,或者將Hadoop中數據轉換導出(export)關系數據庫管理系統(tǒng),其功能如圖1所示。

圖1 Sqoop功能
(1)導入原理。
在導入數據之前,Sqoop使用JDBC檢查導入的數據表,檢索出表的所有列以及列的SQL數據類型,并將這些SQL類型映射為Jave數據類型,在轉換后的MapReduce應用中使用這些對應的Jave類型來保存字段的值,Sqoop的代碼生成器使用這些信息來創(chuàng)建對應表的類,用于保存從表中抽取的記錄。
(2)導出原理。
在導出數據之前,Sqoop會根據數據庫連接字符串來選擇一個導出方法,對于大部分系統(tǒng)來說,Sqoop會選擇JDBC。Sqoop會根據目標表的定義生成一個Jave類,這個生成的類能夠從文本中解析出記錄數據,并能夠向表中插入類型合適的值,然后啟動一個MapReduce作業(yè),從HDFS中讀取源數據文件,使用生成的類解析出記錄,并且執(zhí)行選定的導出方法。
Sqoop的安裝配置非常簡單,前提是部署Sqoop工具的機器需要具備Jave和Hadoop的運行環(huán)境。本文是以穩(wěn)定版本Sqoop-1.4.6為例。
(1)Sqoop安裝。
將安裝包上傳至Hadoop01主點的/export/software目錄中,并解壓至/export/serers路徑下,然后對解壓包進行重命名,具體指令如下:
$tar–zxvf sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz–C/export/servers/
$mv sqoop-1.4.6.bin_hadoop-2.0.4-alpha/dqoop-1.4.6
執(zhí)行完上述Sqoop的下載解壓后,就完成了Sqoop的安裝。
(2)Sqoop配置。
先進入Sqoop解壓包目錄中的conf文件夾目錄下,將 sqoop-env-template.sh文件復制并重命名為 sqoopenv.sh,對該文件中的如下內容進行修改。
exportHDAOOOP_COMMON_HOME=/export/servers/hadoop-2.7.4
export HDAOOOP_MAPRED_HOME=/export/servers/hadoop-2.7.4
export HIVE_HOME=/export/servers/hadoop-1.2.1-bin
在sqooop-evn.sh配置文件中,需要配置的是Sqoop運行時必環(huán)境的安裝目錄,Sqoop運行在Hadoop之上,因此必須指定Hadoop環(huán)境。另外在配置文件中還要根據需要自定義配置HBase、Hive和Zookeeper等環(huán)境變量。
為了后續(xù)方便Sqoop的使用和管理,可以配置Sqoop系統(tǒng)環(huán)境變量。使用“vi/etc/profile”指令進入profile文件,在文件底部進一步添加如下內容類配置Sqoop系統(tǒng)環(huán)境變量。
export SQOOP_HOME=/export/servers/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
配置完成后直接保存退出,接著執(zhí)行“source/etc/profile”指令刷新配置文件即可。
當完成前面Sqoop的相關配置后,還需要根據所操作的關系數據庫添加對應的JDBC驅動包,用于數據庫連接。本文將針對MySQL數據庫進行遷移操作,所以需要將mysql-connector-java-5.1.23.jar包上傳至 Sqoop解壓包目錄的lib文件夾下。
(3)Sqoop效果測試。
執(zhí)行完上述 Sqoop的安裝配置操作后,就可以執(zhí)行Sqoop相關指令來驗證Sqoop的執(zhí)行效果了,具體指令如下。
$sqoop list-databases
-connect jdbc:mysql://localhost:3306
--username root–password 123456
上述指令中,sqooplist-databases用于輸出連接本地的MySQL數據庫中的所有數據庫名,如果正確返回指定地址的MySQL數據庫信息,那么說明Sqoop配置完成。
(1)數據準備。
在MySQL中有一個表student,表的數據如下表:

表1 student數據表
確定HDFS、MySQL已啟動。
cd/usr/local/hadoop
./sbin/start-dfs.sh
Service mysql restart
mysql-u roop-p
(2)在MySQL中新建一張表并插入一些數據。
use mysql;
create table student(
sid char(10)primary key,
sname char(10)not null,
sex varchar(10)null,
birthday date null,
class char(16)null,
dep varchar(20)null
);
insert into student values(10001,'gopal','male','2002-06-02','1','computer');
insertintostudentvalues(10002,'andy','male','2002-01-05','2','electromechanical');
insert into student values(10003,'lily','female','2001-05-06','3','computer');
導入表的所有數據至HDFS
./bin/sqoop import
--connect jdbc:mysql://localhost:3306/mysql
--username root
--password'hadoop'
--table student
-m l
--fields-terminated-by' '
檢查導入結果
通過hdfs命令檢查導入結果:
hdfs dfs-cat/user/hadoop/student/part-m-00000
10001,gopal,male
10002,andy,male
10003,lily,female
在導出前需要先創(chuàng)建待導出的表的結構,如果導出的表在數據庫中不存在會報錯;如果重復導出表,表中的數據也會重復出現(xiàn)。
(1)在MySQL下創(chuàng)建表。
create table student_demo(
sid char(10)primary key,
sname char(10)not null,
sex varchar(10)null,
birthday date null,
class char(16)null,
dep varchar(20)null
);
(2)指定分隔符導出表的所有列。
./bin/sqoop export
--connect jdbc:mysql://localhost:3306/mysql
--username root
--password'hadoop'
--table student_demo
--fields-terminated-by' '
--lines-terminated-by' '
--export-dir path/user/hadoop/student
-m l
在MySQL Shell界面輸入select*from student_demo查看導出表的數據,如圖1所示。

圖1
說明:每執(zhí)行一次,數據都會插入MySQL中,所以在執(zhí)行之前根據需要將表中的數據刪除后再導入。