引用外部文件问题

更新时间:
复制为 MD 格式

本文介绍MaxCompute Spark作业中引用外部文件的方法,包括通过Spark参数上传和通过MaxCompute Resource上传两种方式。

适用场景

  • 作业需要读取配置文件。

  • 作业需要额外的JAR包或Python库。

上传文件

上传文件有两种方式:

通过Spark参数上传文件

MaxCompute Spark支持Spark社区版原生的--jars--py-files等参数,可以在作业提交时通过这些参数将文件上传,这些文件在任务运行时会被上传到用户的工作目录下。

  • Spark客户端上传:直接使用spark-submit命令行参数。

    参数说明

    • --jars

      将配置的JAR包上传至DriverExecutor的当前工作目录,多个文件用逗号分隔,这些JAR包都会加入DriverExecutorClasspath。Spark作业中直接./your_jar_name即可引用。

    • --files--py-files

      将配置的普通文件或Python文件上传至DriverExecutor的当前工作目录,多个文件用逗号分隔,Spark作业中直接./your_file_name即可引用。

    • --archives

      与社区版Spark行为略有不同,多个文件用逗号分隔。配置方式为xxx#yyy,会将配置的归档文件(例如.zip)解压到DriverExecutor的当前工作目录的子目录中。若需要将归档内容直接解压到当前目录,请使用spark.hadoop.odps.cupid.resources配置。

      例如,当配置为xx.zip#yy时,应以./yy/xx/引用归档文件中的内容;当仅配置xx.zip时,应以./xx.zip/xx/引用。

  • DataWorks上传:添加任务需要的资源,详情参考使用DataWorks Spark

通过MaxCompute Resource上传文件

MaxCompute Spark提供spark.hadoop.odps.cupid.resources参数,可以直接引用MaxCompute中的资源,这些资源在任务运行时会被上传到工作目录下。

使用方式

  1. 通过MaxCompute客户端上传文件,单个文件最大支持500 MB。

  2. Spark作业配置中添加spark.hadoop.odps.cupid.resources参数,格式为<projectname>.<resourcename>,如果需要引用多个文件,用逗号隔开。

spark.hadoop.odps.cupid.resources参数介绍

  • 该配置项指定了任务运行需要的MaxCompute资源,且必须要配置在spark-default.conf中或DataWorks的配置项中才能生效,不能写在代码中。

  • 配置示例

    spark.hadoop.odps.cupid.resources=public.python-python-2.7-ucs4.zip,public.myjar.jar

  • 使用说明

    指定的资源将被下载到DriverExecutor的当前工作目录,资源下载后默认的名字是<projectname>.<resourcename>

  • 文件重命名

    在配置时通过<projectname>.<resourcename>:<newresourcename>重命名。例如,spark.hadoop.odps.cupid.resources=public.myjar.jar:myjar.jar

在代码中引用文件

通过上述两种方式将文件上传到任务的当前工作目录后,在代码中读取文件示例:

val targetFile = "文件名"
val file = Source.fromFile(targetFile)
for (line <- file.getLines)
    println(line)
file.close