由于hadoop启动即开始申请大量内存,笔记本安装VMware下的虚拟机很难满足配置要求,从sqoop开始切换到公司的linux CentOS环境上进行测试学习。
以下包括:sqoop下载安装,sqoop连接关系型数据库,sqoop数据导入操作
一、sqoop下载安装
1.1 sqoop下载
官网地址:http://mirrors.hust.edu.cn/apache/sqoop/
百度网盘备份:链接:https://pan.baidu.com/s/1unFoRMNkQMAsE7XKLsynQA 提取码:wbdg
官网上1.4.7 是sqoop1,1.99.7 是sqoop2。以下使用1.4.7 中的sqoop版本测试
搞了两个安装包,先试第一个 sqoop-1.4.7.bin_hadoop-2.6.0.tar.gz 因为这个安装包相对大一点。
1.2 sqoop 解压
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
1.3 修改sqoop相关配置
修改conf文件夹下的 sqoop-env.sh 我只配置的hadoop相关的信息,hbase、hive、zookeeper都没有,所以暂时不配置
添加环境变量:增加SQOOP_HOME 把 SQOOP_HOME/bin添加到PATH
source /etc/profile立即生效
1.4 验证sqoop是否安装成功
sqoop version
没有配置hbase等信息,报出一堆warning,不过还是安装成功了的。
二、sqoop连接关系型数据库
以oracle为例,上传一个oracle 的 jdbc 到 sqoop的lib目录里。
执行指令: sqoop eval --query 'SQL语句' --connect ... --username ... --password ...
可以看到oracle数据库连接成功。更多指令帮助可以输入 sqoop help 查看。
比如:list-databases list-tables 等
三 、sqoop从oracle中导出表数据到hadoop-hdfs
sqoop的lib目录中放好jdbc的jar包就可以关联符合JDBC规范的数据库了,连接hadoop需要mapreduce相关的jar包。上面指定了HADOOP_COMMON_HOME 和 HADOOP_MAPRED_HOME路径。但是在执行sqoop的时候还是抛出找不到class的异常,可能是HADOOP_MAPRED_HOME没有加入到CLASSPATH的原因吧,暂时放一放。
3.1 拷贝hadoop的相关jar包到sqoop的lib目录下(一劳永逸,如果hadoop都换了那么sqoop估计也要换了。。。)
hadoop安装路径下share/hadoop/mapreduce/ 的所有jar包到 sqoop安装路径下的lib文件夹
强迫症不想copy hadoop的jar包的话看下面的bin/configure-sqoop文件的配置
3.2 运行sqoop导出oracle表数据到hdfs
这样,运行sqoop的import指令就能从oracle中拷贝table数据到hadoop的hdfs了。
sqoop import --table --target-dir 'hdfs路径' ... -m N(并发数) --connect ... --username ... --password ...
查看导入的数据
hadoop fs -ls 'hdfs路径'
hadoop fs -cat 'hdfs路径/文件名'
注:sqoop import指令中-m N参数中的N指定并发数,几个并发就会在hdfs中生成几个文件+_success文件。
默认分割符是逗号,如果想修改的话 执行sqoop指令的时候添加 -help 看一下指定分割符的参数吧。
3.3 关于bin/configure-sqoop启动脚本
好奇为什么sqoop import执行后会输出QFtest??是因为,修改了sqoop_home路径下bin目录中的configure-sqoop文件
添加测试输出只是想看看配置在conf目录下的sqoop-env.sh是否生效了。
这个文件需要关注一下:
1. 里面有对sqoop关联zookeeper、hbase、hive等配置的检查,检查到空的时候会提示warning,注释掉就不那么烦了。
2. 可能有对CDH的支持,hadoop_common_home和hadoop_mapred_home等配置如果为空会写死成CDH的默认配置
3. 我配置了hadoop_mapred_home,但是执行的时候还是抛出找不到class的异常,怀疑是classpath没有加进去的原因
OK,经过检查,在bin/configure-sqoop中确实没有将sqoop-env.sh中配置的HADOOP_MAPRED_HOME路径下的jar包配置到SQOOP_CLASSPATH中。如下图中,add hadoop mapreduce jar to sqoop classpath。。。这两行是我加上去的,功能是将HADOOP_MAPRED_HOME指定的路径下所有jar包都添加到SQOOP_CLASSPATH配置上。
不放心的话文件尾再加上一句输出 echo ...
这样就不用拷贝hadoop的share/hadoop/mapreduce路径下的jar包了。sqoop可以直接读取该路径下的jar包资源执行任务。