一、前言

平台: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任务分配到哪部主机上执行。我觉得应该有参数可以设置从哪里读取驱动的,希望有办法的朋友不吝留下您的解决方法。

三、参考

1. Hue + Oozie + Sqoop 使用

(完)

Hue,Oozie运行sqoop找不到驱动解决办法的更多相关文章

  1. 关于Andorid的RecyclerView在V7包下找不到的解决办法

      关于Andorid的RecyclerView在V7包下找不到的解决办法 最近在学习使用RecyclerView替换现有的ListView,看了几篇文章.当准备自己动手实现的时候发现,V7包下找不到 ...

  2. Intellij里检出svn报错找不到svn解决办法

    Intellij里检出svn报错找不到,解决办法: 1. 安装svn客户端: 2. 去掉settings->version control->subversion里的use command ...

  3. ThinkPad E440 Ubuntu 13.1无线网卡 RTL8723BE 驱动解决办法总结

    方法一.在使用网线链接到情况下 第一步.执行下边到命令,即从github上下载驱动程序并安装 sudo apt-get install linux-headers-generic build-esse ...

  4. apue.h文件找不到的解决办法

    参考:http://blog.csdn.net/nihaotoyou/article/details/16827675 1.首先到该书的官网下载源代码:http://www.apuebook.com/ ...

  5. cocoapod集成失败,无法找到头文件的解决办法

    在终端更新pod的时候,提示警告: target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support ...

  6. Win64位操作系统无法运行暗黑2战网D2GS的解决办法

    前几天想在我的Win7 x64系统里做个战网自己玩,搭建完毕后进入战网创建房间出现经典的问题,“排队1”. 原因很清楚,就是D2GS无法启动:但是使用之前的各种办法尝试后无果,后来查看D2GS同目录下 ...

  7. eclipse调试找不到源解决办法

    eclipse调试时有时显示找不到源码,首先得确定代码没问题 这是eclipse没有发现工程源码,解决办法是 右键工程>>Debug As >> Debug configura ...

  8. Linux下修改环境变量,不小心改错,找不到命令解决办法

    PATH改错了找不到命令 解决方法: 重新定义PATH export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/us ...

  9. win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 异常 解决办法

    win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 错误 解决方法改注册表.这个就是DB03.EXE引起的. cmd打开注册表:regedit找到注册表"HKE ...

随机推荐

  1. 小程序中怎么引入wepy.js第三方toast组件

    1.先安装组件 npm install wepy-com-toast --save 2.引入wepy和toast import wepy from 'wepy' import Toast from ' ...

  2. python 嵌套字典取值增强版

    def getdictvalue(d,code): result=[] if isinstance(d, dict) : try: value = d[code] result.append(valu ...

  3. Java中对象并不是都在堆上分配内存的

    转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...

  4. JVM(一) ---JVM的数据模型

    JVM的逻辑内存模型图 [逻辑内存模型图] ----- JVM内部分区 其实JVM内部不仅仅只有栈和堆 包括 程序计数器 . Java 虚拟机栈 .本地方法栈.Java 堆.方法区等 1. 程序计数器 ...

  5. 文献阅读 | The single-cell transcriptional landscape of mammalian organogenesis | 器官形成 | 单细胞转录组

    The single-cell transcriptional landscape of mammalian organogenesis 老板已经提了无数遍的文章,确实很nb,这个工作是之前我们无法想 ...

  6. C/C++ #define的作用域

    #define #define macro的作用域有点类似于C/C++全局静态变量 编译器处理宏的时机是预处理阶段 编译器按文本顺序处理 遇到宏时就定义一个宏变量 假设这种情况 void test() ...

  7. Win10下轻松安装centos7.0(推荐)

    Windows10下安装centos7.0虚拟机环境 Windows10自带了一个类似Vmware虚拟化产品Hyper-V管理器 如果没有找到这个的小伙伴可以从菜单中的windows管理工具找到如图: ...

  8. taocrypt

    taocrypt MySQL Bugs: #25189: mysqld: coding.cpp:243: void TaoCrypt::Base64Decoder::Decode(): Asserti ...

  9. 000 vue各种基本指令

    一:vue实例 1.实例 新建项目: 2.程序 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  10. 小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 ...