一、前言

平台: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. gdb tui设置默认窗口高度

    gdb -p 12999 -tui 先显示win信息(输入:info win) 显示如下: SRC (35 lines) <has focus> CMD (17 lines) 我们要改的是 ...

  2. Java 中List集合中自定义排序

    /* 集合框架的工具类. Collections:集合框架的工具类.里面定义的都是静态方法. Collections和Collection有什么区别? Collection是集合框架中的一个顶层接口, ...

  3. 【CSP模拟赛】仔细的检查(树的重心&树hash)

    题目描述 nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上.另一天nodgd更无聊,就又画了一张.  这时nodgd发现,两次画的顺序是不一样的,这就导致了原本的某一个节点 ...

  4. select下拉框多选取值

    本来是单选取值,现改为多选 其中<select> 标签新增multiple属性,如<select id = "sel"  multiple = "mul ...

  5. 大数据|linux权限chmod和chown

    一.基础概念 1)rwx含义 示例如下 r:读权限read 4 w:写权限write 2 x:操作权限execute  1 -:无权限 2)drwxr - xr -x 与 - rw - r - - r ...

  6. QT中显示动画

    在QT中要显示GIF图片,不能通过单单的添加部件来完成.还需要手动的编写程序.工具:QT Creator新建一个工程,我们先在designer中,添加一个QLabel部件. 将QLabel拉成适当大小 ...

  7. peomethues 参数设置 监控网站 /usr/local/prometheus-2.13.0.linux-amd64/prometheus --config.file=/usr/local/prometheus-2.13.0.linux-amd64/prometheus.yml --web.listen-address=:9999 --web.enable-lifecycle

    probe_http_status_code{instance="xxxx",job="web_status"} probe_http_status_code{ ...

  8. futex的设计与实现

    介绍 futex(快速用户空间互斥)是Linux的一个基础组件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的.大多数时候编写应用程序并不需要直接使 ...

  9. Socket: Java Socket 几个重要的TCP/IP选项解析(转)

    Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: publ ...

  10. Android通过ksoap2这个框架调用webservice大讲堂

    昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有 ...