一、前言
平台:CDH 5.13.0
公司在客户那边有个项目需要部署cloudera平台,部署的时候,在这个版本的cdh中,除了基本组件,还选了sqoop2作为数据传输工具,希望能在Oozie中通过工作流调用sqoop。
二、问题与解决
1. hue界面找不到sqoop2的action
如下图所示,无论在Editor还是在workflow的操作界面,只有sqoop1的操作,没有sqoop2的。
然后在博客中找到了原因:
Oozie 自带 sqoop、hive 等常用组件,比如执行sqoop脚本命令时,并不是你主机里或者CDH里的的sqoop,而是 HDFS 下 Oozie 里的 sqoop 在起作用,这也是为什么 总是报 Could not load db driver class 的原因了,因为根本不是同一个sqoop。[1]
也搜索到了sqoop1和sqoop2的区别:https://blog.csdn.net/Gamer_gyt/article/details/55225700
然而我们只需要简单的工具,能够从关系型数据库中导入数据而已,所以思路转为调用sqoop1进行数据导入。
2. 无法导入db驱动的类
“Could not load db driver class”,这句估计是出现次数最多的报错了,这个报错搞了一天,所以要一步步来(以下操作在安装oozie的主机进行操作):
我的需求是从sqlserver导入数据,所以需要从微软的官网下载驱动:https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017 ,我选择是6.0的版本,解压后,获得sqljdbc42.jar
3. 本地执行sqoop命令
将sqljdbc42.jar放入/var/lib/sqoop/目录,然后将用户和组改为sqoop。
ssh登录主机,我是用root执行命令:
sqoop import --connect 'jdbc:sqlserver://{IP}:{Port};username={UserName};password={Paswd};database={Dbname}' --table table_name --target-dir "/user/root/sqoop_dir" -m 1
如果能够正常执行,并且在hdfs上发现/user/root/sqoop_dir 目录中有正确的数据,证明sqoop命令和驱动都是正常的。
4. 通过hue定义workflow
首先,将sqljdbc42.jar包,复制到hdfs中的目录:/user/oozie/share/lib/lib_{timestamp}/sqoop/ 其中timestamp因人而异;
然后,将owner和group都改成oozie;
最后,在cloudera界面重启oozie组件;
做完这些之后,新建一个workflow,如下图所示:
编辑内容填入sqoop语句,注意,网上有人说这里不能带sqoop命令了,也就是直接以import开头,但是我执行之后,发现用完整的命令是可以执行的。
有个坑是,刚开始字符串用单引号,会报错,改成双引号后就可以运行了,执行结果如下:
但是如果我讲sqoop语句,写在shell script中,然后通过workflow去运行,还是会报找不到类的错误,这个暂时还没解决。
三、参考
(完)