如何在Hive查询运行时设置Spark额外类路径并解决依赖缺失
解决Oozie Hive Action Spark引擎运行时antlr类缺失问题
核心解决方案
在HQL文件中通过Spark配置参数直接添加antlr相关jar包到类路径,无需修改hive-site.xml,具体配置方式如下:
方式1:使用spark.jars自动分发jar包(推荐)
spark.jars会自动将指定jar包分发到Spark Driver和所有Executor节点,多个jar用逗号分隔,支持本地路径或HDFS路径:
set hive.execution.engine=spark; # 替换为集群中实际的antlr jar路径,多个jar用逗号分隔 set spark.jars=/opt/hive/lib/antlr-runtime-2.7.7.jar,hdfs://namenode:8020/user/lib/other-dependent.jar; # 后续你的HQL业务逻辑 select * from target_table;
方式2:分别配置Driver和Executor类路径
如果需要单独指定Driver和Executor的类路径,使用spark.driver.extraClassPath和spark.executor.extraClassPath,多个jar用冒号(Linux/Unix环境)分隔:
set hive.execution.engine=spark; # 配置Driver额外类路径 set spark.driver.extraClassPath=/opt/hive/lib/antlr-runtime-2.7.7.jar:/opt/spark/lib/xxx.jar; # 配置Executor额外类路径(需与Driver路径一致或按需调整) set spark.executor.extraClassPath=/opt/hive/lib/antlr-runtime-2.7.7.jar:/opt/spark/lib/xxx.jar; # 后续你的HQL业务逻辑 select * from target_table;
关键注意事项
- 路径有效性:确保指定的jar路径在所有Driver和Executor节点都可访问。如果用本地路径,需每个节点的对应目录都存在该jar;如果用HDFS路径,需填写完整的
hdfs://开头路径。 - jar包验证:确认选中的antlr jar包含缺失的
org.antlr.runtime.tree.CommonTree类,可通过以下命令验证:
若输出包含jar tf /opt/hive/lib/antlr-runtime-2.7.7.jar | grep CommonTreeorg/antlr/runtime/tree/CommonTree.class,则该jar正确。 - Oozie辅助配置:如果jar包存放在HDFS,也可在Oozie的
workflow.xml中通过<file>标签将jar同步到执行节点,再在HQL中引用本地jar名:
对应HQL中的配置:<hive-action> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <script>your_job.hql</script> <!-- 同步HDFS上的antlr jar到执行节点,#后为本地别名 --> <file>hdfs://namenode:8020/user/hive/lib/antlr-runtime-2.7.7.jar#antlr-runtime-2.7.7.jar</file> </hive-action>set spark.driver.extraClassPath=./antlr-runtime-2.7.7.jar; set spark.executor.extraClassPath=./antlr-runtime-2.7.7.jar;
内容的提问来源于stack exchange,提问作者Aravind Venugopalan
相关产品推荐
相关产品推荐

