要想通過sqoop將數據同hadoop2.5.2的HDFS上導入導出到oracle數據庫中,需要明白的是有兩件事:1、sqoop可以跟oracle相互之間可以連接connection的通。2、sqoop跟hadoop之間可以相互訪問。其中最重要的就是第一件事情。下面我們主要講講第一件事情怎么實現:
第一件事情的實現:
它的實現主要是在linux上安裝oracle的客戶端,能夠實現遠程訪問服務器的oracle數據庫即可。這一塊的內容主要可以參考:http://www.cnblogs.com/ljy2013/articles/4386530.html 這篇文章。
第二件事情跟hadoop之間的交互,由於sqoop是hadoop的一個組件,因此它們之間只需要配置一下即可。下面主要記載一下sqoop的安裝配置問題:
sqoop采用的是sqoop1,其版本是1.4.5.首先從官網上下載sqoop:sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar
sqoop2系列是:sqoop-1.99.X-bin-hadoop200.tar系列。這里sqoop1和sqoop2之間的區別有待進一步查詢。
安裝配置sqoop1的步驟:
(1)解壓縮sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar文件
mv sqoop-1.4.5.bin__hadoop-2.0.4-alpha sqoop-1.4.5
(2)添加環境變量 vi .bash_profile (由於我的用grid用戶來操作hadoop的,因此將sqoop的環境變量配置到用戶的.bash_profile的環境變量文件當中)
export SQOOP_HOME=$HOME/sqoop-1.4.5
export LOGDIR=$SQOOP_HOME/logs
export PATH=$PATH:$SQOOP_HOME/bin
(3)配置文件
進入到sqoop的解壓縮目錄/home/grid/sqoop-1.4.5/下:進入conf目錄下,執行:
cp sqoop-env-template.sh sqoop-env.sh
cp sqoop-site-template.xml sqoop-site.xml
vi sqoop-env.sh,在sqoop-env.sh中添加如下代碼:
#Set path to where bin/hadoop is available export HADOOP_COMMON_HOME=/home/grid/hadoop-2.5.2 //這里是hadoop的安裝主目錄 #Set path to where hadoop-*-core.jar is available export HADOOP_MAPRED_HOME=/home/grid/hadoop-2.5.2 //這里是hadoop的安裝主目錄
#set the path to where bin/hbase is available //下面三項由於暫時沒有涉及,因此暫時不配置
#export HBASE_HOME=
#Set the path to where bin/hive is available
#export HIVE_HOME=
#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
(4)復制相應的jar包
1) 將/home/grid/hadoop-2.5.2/share/hadoop 文件夾下以及子目錄下所有各部分中的jar包都復制到/home/grid/sqoop-1.4.5/lib/下。主要包括:
/home/grid/hadoop-2.5.2/share/hadoop/common/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/common/lib/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/hdfs/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/hdfs/lib/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/httpfs/tomcat/lib/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/mapreduce/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/mapreduce/lib/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/tools/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/tools/lib/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/yarn/*.jar,
/home/grid/hadoop-2.5.2/share/hadoop/yarn/lib/*.jar.
將這些jar包都復制到/home/grid/sqoop-1.4.5/lib/下。
2)將sqoop-1.4.5.jar和oracle驅動包ojdbc6.jar,該包在oracle的安裝目錄下D:\app\liujiyu\product\11.2.0\dbhome_1\jdbc\lib\目錄下。
(5)此時,安裝配置工作已經完畢,下面就是測試是否能連上oracle數據庫:
1)測試是否能遠程連接oracle數據庫,執行下面的代碼:
sqoop list-databases --connect jdbc:oracle:thin:@//192.168.27.235:1521/ORCL --username DATACENTER -P (oracle)
sqoop list-databases --connect jdbc:mysql://192.168.27.236:3306 --username liujiyu -P (mariadb)
sqoop list-databases --connect jdbc:mysql://192.168.19.88:3306 --username clear -P (mysql)
2)將oracle數據庫導入到hdfs中
注意:默認情況下會使用4個map任務,每個任務都會將其所導入的數據寫到一個單獨的文件中,4個文件位於同一目錄,本例中 -m 1表示只使用一個map任務。
文本文件不能保存為二進制字段,並且不能區分null值和字符串值"null"。
執行下面的命令后會生成一個ENTERPRISE.java文件,可以通過ls ENTERPRISE.java查看,代碼生成是sqoop導入過程的必要部分,
sqoop在將源數據庫中的數據寫到HDFS前,首先會用生成的代碼將其進行反序列化
sqoop import --connect jdbc:oracle:thin:@//192.168.27.235:1521/ORCL --username scott --password liujiyu --table EMP -m 1 --target-dir /user/sqoop/test
若出現上圖的信息,則表明執行成功。通過查看內容來驗證:
hadoop fs -cat /user/sqoop/test/part-m-00000
3)將HDFS中的數據導入到oracle,上面是將oracle的表導入到hdfs中,下面就可以將剛剛導入到hdfs中的表反向導入到oracle的一個新的空表中。首先必須要在oracle中創建一個空表empty。下面將hdfs中的表導入到oracle中的empty表中。
sqoop export --connect jdbc:oracle:thin:@//192.168.27.235:1521/ORCL --username scott --password liujiyu --table empty --export-dir '/liujiyu/nihao/part-m-00000' --fields-terminated-by ':' -m 1
執行的結果跟上面類似。