Sqoop导入命令终端运行正常但Oozie执行报HiveDriver加载错误
问题根因定位
这个偶发找不到Hive JDBC驱动的问题核心出在Oozie调度任务的运行机制上:
- 本地终端执行命令时,任务跑在当前节点,用的是当前节点本地配置的sqoop/hadoop/hive依赖,所以只要当前节点放了jar就不会出问题
- Oozie调度的sqoop任务会作为YARN任务提交到集群,随机分配到任意NodeManager节点上的Container运行,出现时好时坏的情况本质是部分运行节点的运行环境缺少对应驱动,或者任务运行时的classpath没有正确包含驱动依赖,任务分配到有依赖的节点就运行成功,分配到无依赖的节点就报错。
常见的具体诱因有2种:
- 你只在Sqoop服务节点、Oozie服务节点放了hive-jdbc驱动,没有同步到所有NodeManager节点的对应lib目录下
- Oozie跑Sqoop动作时默认调用自身的共享库(ShareLib),如果共享库中没有加入hive-jdbc驱动,即使节点本地放了也可能出现加载失败的情况
解决方案
按照优先级依次尝试即可解决:
- 优先使用Oozie共享库统一管理依赖
- 把你正在用的版本的hive-jdbc驱动上传到HDFS上的Oozie Sqoop共享库目录,默认路径为
/user/oozie/share/lib/[当前共享库版本目录]/sqoop/ - 执行命令
oozie admin -sharelibupdate刷新共享库缓存,无需重启Oozie即可生效,后续所有Sqoop任务都会自动加载这个驱动
- 把你正在用的版本的hive-jdbc驱动上传到HDFS上的Oozie Sqoop共享库目录,默认路径为
- 临时修复可以直接在sqoop命令中显式指定依赖包,添加参数
--jars hdfs:///你存放jar的HDFS路径/hive-jdbc-xxx.jar,任务运行时会自动把这个jar分发到运行Container的classpath中,不受节点本地环境影响 - 如果你不想用共享库,需要确认所有NodeManager节点的
sqoop/lib、hadoop/common/lib目录下都有统一版本的hive-jdbc驱动,且无多版本冲突,清理所有节点上多余的不同版本hive相关jar包,避免类加载异常
补充:你给出的命令里
-- username参数中间多了一个空格,虽然不是本次报错的原因,也建议修正为--username避免后续出现参数解析错误。
内容的提问来源于stack exchange,提问作者mr.data_engg
相关产品推荐
相关产品推荐

