FEATURED · 精选文章

Apache Spark SQL 资源管理语句全解析:ADD/LIST FILE、JAR 与 ARCHIVE 的语法、参数与底层实现

发布时间 / 2026/9/20 2:55:09
来源 / 创域科博编辑部
栏目 / 资讯中心
Apache Spark SQL 资源管理语句全解析:ADD/LIST FILE、JAR 与 ARCHIVE 的语法、参数与底层实现 大数据数据分析批处理流处理机器学习图计算【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址https://gitcode.com/gh_mirrors/sp/spark点击查看免费下载导读在 Apache Spark SQL 会话中ADD FILE、ADD JAR、ADD ARCHIVE与对应的LIST FILE、LIST JAR、LIST ARCHIVE是管理会话级资源文件、依赖 JAR 与归档包的标准语句常用于将用户自定义函数UDF、外部依赖库或数据文件分发到执行端。本文以 docs/sql-ref-syntax-aux-resource-mgmt.md 及其六个子文档为主体完整讲解每条语句的语法、参数、路径写法与示例并结合当前仓库中sql/core的解析器与执行命令源码揭示资源从「SQL 解析」到「SparkContext 资源分发」的完整调用链帮助你准确掌握这套会话资源管理机制。一、资源管理语句族总览Spark SQL 的资源管理语句由一组成对出现的「添加」与「列出」命令组成覆盖三类资源普通文件File、Java 依赖 JAR、归档压缩包Archive。对应的文档页面位于docs/目录下操作资源类型文档页面ADD FILE/ADD FILES单个文件或目录sql-ref-syntax-aux-resource-mgmt-add-file.mdADD JAR/ADD JARSJAR 依赖含 Ivy URIsql-ref-syntax-aux-resource-mgmt-add-jar.mdADD ARCHIVE/ADD ARCHIVES归档压缩包sql-ref-syntax-aux-resource-mgmt-add-archive.mdLIST FILE/LIST FILES已添加的文件sql-ref-syntax-aux-resource-mgmt-list-file.mdLIST JAR/LIST JARS已添加的 JARsql-ref-syntax-aux-resource-mgmt-list-jar.mdLIST ARCHIVE/LIST ARCHIVES已添加的归档包sql-ref-syntax-aux-resource-mgmt-list-archive.md从底层实现看这六类语句在 SQL 引擎中分别对应六个逻辑计划LogicalPlan节点全部定义在 resources.scala 中AddJarsCommand、AddFilesCommand、AddArchivesCommand、ListFilesCommand、ListJarsCommand、ListArchivesCommand。它们都是LeafRunnableCommand的直叶子命令执行时不依赖子查询直接作用于当前SparkSession的会话状态与SparkContext。二、ADD FILE添加文件或目录语法与说明ADD { FILE | FILES } resource_name [ ... ]ADD FILE用于将单个文件或整个目录加入会话资源列表添加后可通过LIST FILE查看。单数形式FILE与复数形式FILES在语法上等价均可一次携带多个路径参数。resource_name为要添加的文件或目录名称支持以下写法裸路径ADD FILE /tmp/test双引号字符串ADD FILE /path/to/file/abc.txt单引号字符串ADD FILE /another/test.txt含空格的路径必须加引号ADD FILE /path with space/abc.txt目录路径ADD FILE /path/to/some/directory一次添加多个ADD FILES /path with space/cde.txt /path with space/fgh.txt底层实现与目录递归行为AddFilesCommand的执行逻辑非常简洁核心只有一行见 resources.scalaval recursive !sparkSession.sessionState.conf.addSingleFileInAddFile paths.foreach(sparkSession.sparkContext.addFile(_, recursive))这里引出了一个关键配置项spark.sql.legacy.addSingleFileInAddFile内部配置定义于 SQLConf.scala默认值为false此时recursive trueADD FILE允许传入目录路径SparkContext.addFile会递归分发目录下的全部文件当显式设为true时恢复旧版行为仅允许添加单个文件传入目录会被拒绝。也就是说ADD FILE之所以支持目录是 Spark 3.0 起在默认配置下开放的能力而不是历史遗留行为。三、ADD JAR添加 JAR 依赖含 Ivy URI语法与说明ADD { JAR | JARS } file_name [ ... ]ADD JAR将一个 JAR 文件加入会话资源列表添加后可通过LIST JAR查看。与ADD FILE不同JAR 路径的来源更广既可以是本地文件系统、分布式文件系统也可以是 Apache Ivy 的 URI本地路径ADD JAR /tmp/test.jar引号包裹的路径ADD JAR /path/to/some.jar、ADD JAR /some/other.jar含空格的路径ADD JAR /path with space/abc.jar一次添加多个ADD JARS /path with space/def.jar /path with space/ghi.jarIvy URI 参数Apache Ivy 是强调灵活与简单的经典依赖管理器Spark 支持通过ivy://协议在 SQL 中直接解析并下载 Maven/Ivy 仓库中的依赖。Ivy URI 的写法为ivy://group:module:version ivy://group:module:version?transitive[true|false] ivy://group:module:version?transitive[true|false]excludegroup:module,group:moduleURI 查询串支持两个参数参数含义注意事项transitive是否下载目标 JAR 的传递依赖参数名区分大小写参数值不区分若多次指定以最后一次为准exclude下载 Ivy URI JAR 及其传递依赖时的排除列表多个排除项用逗号分隔每项格式为group:module官方示例ADD JAR ivy://group:module:version; ADD JAR ivy://group:module:version?transitivefalse; ADD JAR ivy://group:module:version?transitivetrue; ADD JAR ivy://group:module:version?excludegroup:moduletransitivetrue;源码与测试验证AddJarsCommand的实现resources.scala将每个路径直接交给会话状态的资源加载器处理paths.foreach(sparkSession.sessionState.resourceLoader.addJar(_))仓库测试 SQLQuerySuite.scala 中的用例SPARK-33084: Add jar support Ivy URI in SQL完整验证了上述三种行为ADD JAR ivy://org.springframework:spring-core:6.1.6?transitivefalse后sc.listJars()中存在spring-core-6.1.6.jar但不存在传递依赖spring-jcl-6.1.6.jar证明transitivefalse只下载指定 JARADD JAR ivy://org.awaitility:awaitility:4.2.1默认transitivetrue会同时拉取传递依赖hamcrest-2.1.jarADD JAR ivy://org.junit.jupiter:junit-jupiter:5.10.2?excludeorg.junit.jupiter:junit-jupiter-enginetransitivetrue会下载junit-jupiter-api与junit-jupiter-params但排除junit-jupiter-engine验证exclude生效。四、ADD ARCHIVE添加归档压缩包语法与说明ADD { ARCHIVE | ARCHIVES } file_name [ ... ]ADD ARCHIVE用于将归档文件加入会话资源列表添加后可通过LIST ARCHIVE查看。受支持的归档格式为.zip、.tar、.tar.gz、.tgz与.jar其余格式不被接受。file_name同样可以是本地文件系统或分布式文件系统上的路径。官方示例ADD ARCHIVE /tmp/test.tar.gz; ADD ARCHIVE /path/to/some.zip; ADD ARCHIVE /some/other.tgz; ADD ARCHIVE /path with space/abc.tar; ADD ARCHIVES /path with space/def.tgz /path with space/ghi.zip;底层实现AddArchivesCommand将路径交给SparkContext.addArchiveresources.scala归档包会被分发到各执行节点并解压从而让工作目录中出现对应的展开目录供任务按需读取。五、LIST FILE / LIST JAR / LIST ARCHIVE查看已添加资源三条LIST语句共享同一套语法骨架——资源类型名后可以跟零个或多个路径参数LIST { FILE | FILES } file_name [ ... ] LIST { JAR | JARS } file_name [ ... ] LIST { ARCHIVE | ARCHIVES } file_name [ ... ]不带参数列出全部资源不携带任何路径参数时LIST语句输出当前会话已添加的全部对应类型资源ADD FILE /tmp/test; ADD FILE /tmp/test_2; LIST FILE; -- output for LIST FILE file:/private/tmp/test file:/private/tmp/test_2ADD JAR /tmp/test.jar; ADD JAR /tmp/test_2.jar; LIST JAR; -- output for LIST JAR spark://192.168.1.112:62859/jars/test.jar spark://192.168.1.112:62859/jars/test_2.jarADD ARCHIVE /tmp/test.zip; ADD ARCHIVE /tmp/test_2.tar.gz; LIST ARCHIVE; -- output for LIST ARCHIVE file:/tmp/test.zip file:/tmp/test_2.tar.gz注意LIST JAR的输出形式与其他两类不同JAR 会被上传到 Spark 的临时分发服务因此输出为spark://host:port/jars/name.jar形式而文件与归档输出本地file:/或分布式 URI。带参数按路径过滤携带路径参数时LIST只返回已经添加成功且匹配给定路径的资源未添加的路径会被静默过滤掉LIST FILE /tmp/test /some/random/file /another/random/file; -- output file:/private/tmp/testLIST JAR /tmp/test.jar /some/random.jar /another/random.jar; -- output spark://192.168.1.112:62859/jars/test.jarLIST ARCHIVE /tmp/test.zip /some/random.tgz /another/random.tar; -- output file:/tmp/test.zip过滤逻辑的源码差异三条LIST命令的过滤实现策略不同值得留意见 resources.scalaListFilesCommand对用户传入的路径调用Utils.resolveURI解析 URI对 scheme 为null、local、file的路径取getCanonicalFile规范化后再与sparkContext.listFiles()的结果做精确匹配ListJarsCommand与ListArchivesCommand则是取传入路径的最后一段文件名split(/).last再用contains子串方式在listJars()/listArchives()结果中匹配因此只要文件名吻合即可命中容忍主机名、端口等前缀差异。三条语句的输出列名统一为Results类型为字符串后续可被当作普通一列数据继续参与 SQL 运算。六、从 SQL 文本到命令执行解析器视角资源管理语句的语法入口是 Spark SQL 的SparkSqlParser中的visitManageResource方法SparkSqlParser.scala其处理逻辑可分为两步第一步提取路径参数。解析器读取ADD/LIST之后的剩余 token 并拼接成字符串再通过正则strLiteralDef识别其中的引号字符串字面量以或开头的 token 会被unescapeSQLString反义从而正确处理含空格的路径其余 token 按空白切分最终得到路径序列maybePaths。第二步按操作符与资源类型分发。根据ctx.op的类型ADD或LIST以及simpleIdentifier的小写文本映射到对应的命令节点ADDfile/files→AddFilesCommandADDjar/jars→AddJarsCommandADDarchive/archives→AddArchivesCommandLISTfile/files→ 有路径时ListFilesCommand(maybePaths)否则ListFilesCommand()LISTjar/jars、LISTarchive/archives同理其他资源类型如ADD FUNCTION会抛出operationNotAllowed(ADD with resource type ...)分析异常该解析在sql/core模块的 DDLParserSuite.scala 中有对应测试验证了非法资源类型被拒绝的行为。七、资源分发的运行时语义从上面的实现可以看出三类ADD命令最终都落在SparkContext的资源分发 API 上SQL 语句底层调用效果ADD FILESparkContext.addFile(path, recursive)把文件或目录分发到所有执行节点的工作目录ADD JARSparkSessionState.resourceLoader.addJar(path)上传并让各执行端的类加载器可加载该 JAR供 UDF、序列化器使用ADD ARCHIVESparkContext.addArchive(path)分发并在执行端解压归档包结合 resources.scala 中AddJarsCommand的注释「Adds a jar to the current session so it can be used (for UDFs or serdes)」可以确认这些资源是**会话级session-level**的——每一条ADD语句都只对发起它的 SparkSession 生效不会跨会话污染其他 Session 的资源列表。这也解释了为什么LIST语句总是能从同一个SparkContext/ 会话状态中查回刚添加的资源。八、使用建议与注意事项综合官方文档与源码行为实际使用时有几点值得注意带空格或特殊字符的路径必须加引号单引号与双引号均可解析器会统一反义处理ADD FILE的目录能力受spark.sql.legacy.addSingleFileInAddFile控制默认false即允许目录并递归分发该配置为内部配置internal如需修改需显式设置ADD JAR的 Ivy URI 场景下默认会解析传递依赖transitivetrue若只想要目标 JAR 本身请显式指定?transitivefalse需要剔除某个传递依赖时用excludegroup:module多个排除项以逗号分隔ADD ARCHIVE只接受五种格式.zip、.tar、.tar.gz、.tgz、.jarLIST带参过滤是已添加子集语义未添加的路径不会报错只会被静默丢弃可用于脚本中幂等地检查某个资源是否已就绪所有资源命令均为会话级操作若要在不同 Session 间复用需在各自的 Session 中分别执行。九、延伸阅读资源管理语句入口索引docs/sql-ref-syntax-aux-resource-mgmt.md各语句详解ADD FILE · ADD JAR · ADD ARCHIVE · LIST FILE · LIST JAR · LIST ARCHIVE命令执行实现sql/core/src/main/scala/org/apache/spark/sql/execution/command/resources.scala语法解析实现sql/core/src/main/scala/org/apache/spark/sql/execution/SparkSqlParser.scala相关配置项spark.sql.legacy.addSingleFileInAddFilesql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scalaIvy URI 行为测试SPARK-33084sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala赞分享大数据数据分析批处理流处理机器学习图计算【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址https://gitcode.com/gh_mirrors/sp/spark点击查看免费下载相关推荐Apache Spark SQL 资源管理之 ADD FILE 语句语法、参数、示例与源码级原理Apache Spark SQL 资源管理之 ADD FILE 语句语法、参数、示例与源码级原理 导读 ADD FILE 是 Apache Spark SQL大数据数据分析批处理流处理机器学习图计算Apache Spark SQL 资源管理系列LIST FILE 语法详解与源码实现Apache Spark SQL 资源管理系列LIST FILE 语法详解与源码实现 LIST FILE 是 Apache Spark SQL 中用于查看已添大数据数据分析批处理流处理机器学习图计算Apache Spark SQL DROP TABLE 语句详解语义、语法与 Catalog 底层实现Apache Spark SQL DROP TABLE 语句详解语义、语法与 Catalog 底层实现 本文基于 Spark 官方语法参考文档 sql ref大数据数据分析批处理流处理机器学习图计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻