要想通过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
执行的结果跟上面类似。