zoukankan      html  css  js  c++  java
  • Hue,Oozie运行sqoop找不到驱动解决办法

    一、前言

    平台:CDH 5.13.0

    公司在客户那边有个项目需要部署cloudera平台,部署的时候,在这个版本的cdh中,除了基本组件,还选了sqoop2作为数据传输工具,希望能在Oozie中通过工作流调用sqoop。

    二、问题与解决

    1. hue界面找不到sqoop2的action

    如下图所示,无论在Editor还是在workflow的操作界面,只有sqoop1的操作,没有sqoop2的。

    微信截图_20190907181111

    然后在博客中找到了原因:

    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,如下图所示:

    image

    编辑内容填入sqoop语句,注意,网上有人说这里不能带sqoop命令了,也就是直接以import开头,但是我执行之后,发现用完整的命令是可以执行的。

    有个坑是,刚开始字符串用单引号,会报错,改成双引号后就可以运行了,执行结果如下:

    image

    image

    但是,使用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 使用

    (完)

  • 相关阅读:
    linux命令大全
    linux几个常用命令
    linux基础入门命令自我总结——乱
    linux标准目录的结构——各个目录都是干啥的
    python基础知识9——模块2——常见内置模块
    python基础知识8——模块1——自定义模块和第三方开源模块
    手写数据结构-链表
    手写数据结构-基于动态数组的循环队列
    手写数据结构-基于动态数组的队列
    手写数据结构-基于动态数组的栈
  • 原文地址:https://www.cnblogs.com/harrymore/p/11482281.html
Copyright © 2011-2022 走看看