每次运行Spark(Scala)作业时Tez会话重复创建问题排查求助
Spark作业触发Tez会话的排查思路
1. 排查Spark与Hive的隐式关联
- 检查Spark核心配置文件:查看
spark-defaults.conf中spark.sql.catalogImplementation的值,HDP集群默认是hive,即使未显式初始化HiveContext,SparkSession也会自动启用Hive元数据支持,部分元数据操作或SerDe处理会触发Tez会话。 - 确认Hive配置是否被Spark加载:检查Spark的classpath中是否包含
hive-site.xml,HDP默认会将Hive配置注入Spark运行环境,可能导致隐式依赖Hive执行逻辑。 - 查看列式存储转换配置:检查
spark.sql.hive.convertMetastoreParquet、spark.sql.hive.convertMetastoreOrc是否关闭,若关闭,Spark会调用Hive原生SerDe处理文件,进而触发Tez。
2. 分析Spark SQL的执行路径
- 单独测试SQL语句:将作业中的SQL用
spark-sql命令直接执行,观察是否触发Tez作业,以此判断是否是SQL本身依赖Hive特有的功能(如Hive UDF、自定义SerDe、管理表查询)。 - 查看Spark UI执行计划:在Spark UI的SQL标签页,检查执行计划是否包含
HiveTableScan、HiveSerDe节点,这类节点说明Spark在复用Hive执行逻辑,可能触发Tez。
3. 检查集群集成配置
- 查看Ambari中的Spark配置:确认
spark.yarn.dist.jars或spark.driver.extraClassPath是否强制包含Tez、Hive相关依赖包(如tez-client.jar、hive-exec.jar),不必要的依赖可能导致Tez客户端被初始化。 - 对比YARN作业信息:查看Tez作业的提交者、启动命令和参数,和Spark作业的信息做对比,确认Tez作业是否由Spark的Driver或Executor进程触发。
4. 排查自定义代码与依赖
- 检查作业依赖包:扫描作业打包的jar包,确认是否包含Hive或Tez相关依赖,部分第三方数据处理库可能隐式依赖Hive执行引擎。
- 检查代码逻辑:确认代码中是否间接调用了
org.apache.hadoop.hive包下的类,或通过反射触发Hive相关功能,这类操作可能在Spark作业启动时初始化Tez会话。
5. 验证Tez作业的实际用途
- 查看Tez作业日志:通过
yarn logs -applicationId <tez-application-id>获取Tez作业日志,分析其执行的具体任务(如元数据查询、表结构同步),反推触发原因。 - 临时禁用Hive Catalog:提交Spark作业时添加
--conf spark.sql.catalogImplementation=in-memory,观察是否还会启动Tez作业,验证是否是Hive元数据支持导致的问题。
内容的提问来源于stack exchange,提问作者Shubham Acharya
相关产品推荐
相关产品推荐

