黃明輝
(湖北三峽職業(yè)技術(shù)學(xué)院電子信息學(xué)院,湖北 宜昌 443000)
Sqoop是一種旨在有效地在ApacheHadoop和關(guān)系數(shù)據(jù)庫等結(jié)構(gòu)化數(shù)據(jù)存儲之間傳輸大量數(shù)據(jù)的工具,結(jié)構(gòu)化數(shù)據(jù)可以是MySQL、Oracle等RDBMS。Sqoop底層用MapReduce程序?qū)崿F(xiàn)抽取、轉(zhuǎn)換、加載,MapReduce良好的特性保證了并行化和高容錯率,而且相比 Kettle等傳統(tǒng)ETL工具,任務(wù)運行在Hadoop集群上,減少了ETL服務(wù)器資源的使用情況。在特定場景上,抽取過程會有很大的性能提升。
可以使用Sqoop工具將數(shù)據(jù)從關(guān)系數(shù)據(jù)庫管理系統(tǒng)導(dǎo)入(import)到Hadoop分布式文件系統(tǒng)中,或者將Hadoop中數(shù)據(jù)轉(zhuǎn)換導(dǎo)出(export)關(guān)系數(shù)據(jù)庫管理系統(tǒng),其功能如圖1所示。
圖1 Sqoop功能
(1)導(dǎo)入原理。
在導(dǎo)入數(shù)據(jù)之前,Sqoop使用JDBC檢查導(dǎo)入的數(shù)據(jù)表,檢索出表的所有列以及列的SQL數(shù)據(jù)類型,并將這些SQL類型映射為Jave數(shù)據(jù)類型,在轉(zhuǎn)換后的MapReduce應(yīng)用中使用這些對應(yīng)的Jave類型來保存字段的值,Sqoop的代碼生成器使用這些信息來創(chuàng)建對應(yīng)表的類,用于保存從表中抽取的記錄。
(2)導(dǎo)出原理。
在導(dǎo)出數(shù)據(jù)之前,Sqoop會根據(jù)數(shù)據(jù)庫連接字符串來選擇一個導(dǎo)出方法,對于大部分系統(tǒng)來說,Sqoop會選擇JDBC。Sqoop會根據(jù)目標(biāo)表的定義生成一個Jave類,這個生成的類能夠從文本中解析出記錄數(shù)據(jù),并能夠向表中插入類型合適的值,然后啟動一個MapReduce作業(yè),從HDFS中讀取源數(shù)據(jù)文件,使用生成的類解析出記錄,并且執(zhí)行選定的導(dǎo)出方法。
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文件復(fù)制并重命名為 sqoopenv.sh,對該文件中的如下內(nèi)容進行修改。
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)境。另外在配置文件中還要根據(jù)需要自定義配置HBase、Hive和Zookeeper等環(huán)境變量。
為了后續(xù)方便Sqoop的使用和管理,可以配置Sqoop系統(tǒng)環(huán)境變量。使用“vi/etc/profile”指令進入profile文件,在文件底部進一步添加如下內(nèi)容類配置Sqoop系統(tǒng)環(huán)境變量。
export SQOOP_HOME=/export/servers/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
配置完成后直接保存退出,接著執(zhí)行“source/etc/profile”指令刷新配置文件即可。
當(dāng)完成前面Sqoop的相關(guān)配置后,還需要根據(jù)所操作的關(guān)系數(shù)據(jù)庫添加對應(yīng)的JDBC驅(qū)動包,用于數(shù)據(jù)庫連接。本文將針對MySQL數(shù)據(jù)庫進行遷移操作,所以需要將mysql-connector-java-5.1.23.jar包上傳至 Sqoop解壓包目錄的lib文件夾下。
(3)Sqoop效果測試。
執(zhí)行完上述 Sqoop的安裝配置操作后,就可以執(zhí)行Sqoop相關(guān)指令來驗證Sqoop的執(zhí)行效果了,具體指令如下。
$sqoop list-databases
-connect jdbc:mysql://localhost:3306
--username root–password 123456
上述指令中,sqooplist-databases用于輸出連接本地的MySQL數(shù)據(jù)庫中的所有數(shù)據(jù)庫名,如果正確返回指定地址的MySQL數(shù)據(jù)庫信息,那么說明Sqoop配置完成。
(1)數(shù)據(jù)準(zhǔn)備。
在MySQL中有一個表student,表的數(shù)據(jù)如下表:
表1 student數(shù)據(jù)表
確定HDFS、MySQL已啟動。
cd/usr/local/hadoop
./sbin/start-dfs.sh
Service mysql restart
mysql-u roop-p
(2)在MySQL中新建一張表并插入一些數(shù)據(jù)。
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');
導(dǎo)入表的所有數(shù)據(jù)至HDFS
./bin/sqoop import
--connect jdbc:mysql://localhost:3306/mysql
--username root
--password'hadoop'
--table student
-m l
--fields-terminated-by' '
檢查導(dǎo)入結(jié)果
通過hdfs命令檢查導(dǎo)入結(jié)果:
hdfs dfs-cat/user/hadoop/student/part-m-00000
10001,gopal,male
10002,andy,male
10003,lily,female
在導(dǎo)出前需要先創(chuàng)建待導(dǎo)出的表的結(jié)構(gòu),如果導(dǎo)出的表在數(shù)據(jù)庫中不存在會報錯;如果重復(fù)導(dǎo)出表,表中的數(shù)據(jù)也會重復(fù)出現(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)指定分隔符導(dǎo)出表的所有列。
./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查看導(dǎo)出表的數(shù)據(jù),如圖1所示。
圖1
說明:每執(zhí)行一次,數(shù)據(jù)都會插入MySQL中,所以在執(zhí)行之前根據(jù)需要將表中的數(shù)據(jù)刪除后再導(dǎo)入。