我在 Spark on YARN 和 Spark on K8s 中运行相同的查询。 K8s 和 YARN 都引用相同的 hive 元存储和 hdfs 路径。当我在 YRAN 中运行作业时,某些表正在被广播(在连接中),而在 K8s 中却没有发生同样的情况。在这两种环境中,广播阈值是相同的。表也一样。但是在 YARN 与 K8s 上运行时计划存在差异。并且两地广播均已启用。
为什么会有这种行为差异?
发现问题:
我尝试的第一件事是在连接中显式传递广播提示,它确实有效。现在可以肯定的是,广播不会以某种方式自动发生。我在桌子上运行
DESCRIBE FORMATTED <TBL_NAME>
,发现numRows
和rawDataSize
都是-1
。所以问题是 hive 元存储中的表统计信息未更新。但问题是,它在 YARN 中是如何工作的。在运行时获取 YARN 和 K8s 中使用的 Spark 配置后,我们发现了差异。因此,在 YARN 中,此属性 spark.sql.statistics.fallBackToHdfs
设置为 true
,而在 K8s 中则未设置 (default is false
)。因此,YARN 从 hdfs 获取统计数据,因此它能够广播,而在 K8s 上却没有发生。一旦在 K8s 中将其设置为 true,广播就会发生。