Hue,Oozie运行sqoop找不到驱动解决办法
一、前言
平台: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. 通过sqoop action方式运行
首先,将sqljdbc42.jar包,复制到hdfs中的目录:/user/oozie/share/lib/lib_{timestamp}/sqoop/ 其中timestamp因人而异;
可以通过命令:
oozie admin -oozie http://{Ip}:11000/oozie –sharelibupdate
更新共享库,可以看到你现在oozie的共享库是哪个。
然后,将jar包的owner和group都改成oozie;
最后,在cloudera界面重启oozie组件;
做完这些之后,新建一个workflow,如下图所示:

编辑内容填入sqoop语句,注意,网上有人说这里不能带sqoop命令了,也就是直接以import开头,但是我执行之后,发现用完整的命令是可以执行的。
有个坑是,刚开始字符串用单引号,会报错,改成双引号后就可以运行了,执行结果如下:


但是,使用sqoop action执行数据导入会有一个致命的问题,就是无法使用—query “sql语句”的方式去动态的选择数据,原因是oozie在解析command的时候,会将空格当作分隔符进行分割,所以会报无法识别参数的错,这个通过查看workflow.xml可以看出oozie转化后的文件,详情可以看:Oozie – Sqoop Job Failed When Executing It With Hue。
5. 通过shell action方式运行
由于oozie的bug,导致无法使用sqoop action进行操作,所以还是需要将sqoop命令写入shell脚本,利用shell action去执行。
但是无论我把驱动包拷贝入oozie server所在主机还是namenode所在主机的相关目录,还是会报找不到驱动,最后没办法,把驱动包分发到各个节点的/var/lib/sqoop目录,竟然就成功了!
接下来的问题就是权限问题,因为shell script默认是使用yarn用户进行执行任务,需要你在shell前面指定执行用户:
export HADOOP_USER_NAME=username
接下来就可以顺利将sqlserver的数据导入到hdfs中了。
最后我做了一个实验,分别删除datanode节点上的驱动,发现一个规律:
workflow会随机在一个节点对sqoop命令进行调用。
我猜想,应该取决于yarn将MapReduce任务分配到哪部主机上执行。我觉得应该有参数可以设置从哪里读取驱动的,希望有办法的朋友不吝留下您的解决方法。
三、参考
(完)
Hue,Oozie运行sqoop找不到驱动解决办法的更多相关文章
- 关于Andorid的RecyclerView在V7包下找不到的解决办法
关于Andorid的RecyclerView在V7包下找不到的解决办法 最近在学习使用RecyclerView替换现有的ListView,看了几篇文章.当准备自己动手实现的时候发现,V7包下找不到 ...
- Intellij里检出svn报错找不到svn解决办法
Intellij里检出svn报错找不到,解决办法: 1. 安装svn客户端: 2. 去掉settings->version control->subversion里的use command ...
- ThinkPad E440 Ubuntu 13.1无线网卡 RTL8723BE 驱动解决办法总结
方法一.在使用网线链接到情况下 第一步.执行下边到命令,即从github上下载驱动程序并安装 sudo apt-get install linux-headers-generic build-esse ...
- apue.h文件找不到的解决办法
参考:http://blog.csdn.net/nihaotoyou/article/details/16827675 1.首先到该书的官网下载源代码:http://www.apuebook.com/ ...
- cocoapod集成失败,无法找到头文件的解决办法
在终端更新pod的时候,提示警告: target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support ...
- Win64位操作系统无法运行暗黑2战网D2GS的解决办法
前几天想在我的Win7 x64系统里做个战网自己玩,搭建完毕后进入战网创建房间出现经典的问题,“排队1”. 原因很清楚,就是D2GS无法启动:但是使用之前的各种办法尝试后无果,后来查看D2GS同目录下 ...
- eclipse调试找不到源解决办法
eclipse调试时有时显示找不到源码,首先得确定代码没问题 这是eclipse没有发现工程源码,解决办法是 右键工程>>Debug As >> Debug configura ...
- Linux下修改环境变量,不小心改错,找不到命令解决办法
PATH改错了找不到命令 解决方法: 重新定义PATH export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/us ...
- win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 异常 解决办法
win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 错误 解决方法改注册表.这个就是DB03.EXE引起的. cmd打开注册表:regedit找到注册表"HKE ...
随机推荐
- 小程序中怎么引入wepy.js第三方toast组件
1.先安装组件 npm install wepy-com-toast --save 2.引入wepy和toast import wepy from 'wepy' import Toast from ' ...
- python 嵌套字典取值增强版
def getdictvalue(d,code): result=[] if isinstance(d, dict) : try: value = d[code] result.append(valu ...
- Java中对象并不是都在堆上分配内存的
转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...
- JVM(一) ---JVM的数据模型
JVM的逻辑内存模型图 [逻辑内存模型图] ----- JVM内部分区 其实JVM内部不仅仅只有栈和堆 包括 程序计数器 . Java 虚拟机栈 .本地方法栈.Java 堆.方法区等 1. 程序计数器 ...
- 文献阅读 | The single-cell transcriptional landscape of mammalian organogenesis | 器官形成 | 单细胞转录组
The single-cell transcriptional landscape of mammalian organogenesis 老板已经提了无数遍的文章,确实很nb,这个工作是之前我们无法想 ...
- C/C++ #define的作用域
#define #define macro的作用域有点类似于C/C++全局静态变量 编译器处理宏的时机是预处理阶段 编译器按文本顺序处理 遇到宏时就定义一个宏变量 假设这种情况 void test() ...
- Win10下轻松安装centos7.0(推荐)
Windows10下安装centos7.0虚拟机环境 Windows10自带了一个类似Vmware虚拟化产品Hyper-V管理器 如果没有找到这个的小伙伴可以从菜单中的windows管理工具找到如图: ...
- taocrypt
taocrypt MySQL Bugs: #25189: mysqld: coding.cpp:243: void TaoCrypt::Base64Decoder::Decode(): Asserti ...
- 000 vue各种基本指令
一:vue实例 1.实例 新建项目: 2.程序 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解
笔记 3.SpringBoot2.x整合redis实战讲解 简介:使用springboot-starter整合reids实战 1.官网:https://docs.spring.io/spring-bo ...