Snowpark Submit 示例¶
本主题包括使用 Snowpark Submit 提交生产就绪 Spark 应用程序的示例。
编写并提交简单的 Spark 应用程序¶
以下示例演示如何编写和提交没有依赖项的简单 Spark 应用程序。
在本地 IDE 中,创建一个包含以下内容,名为
app.py的新 Python 文件:要提交应用程序,请使用以下命令:
您可以使用用于等待作业完成的
--wait-for-completion选项、用于检查作业状态的--workload-status选项,以及用于显示作业日志的--display-logs选项。有关选项的完整列表,请参阅 Snowpark Submit 参考。
从 Snowflake 暂存区部署应用程序¶
如果应用程序有依赖项(例如,需要读取的文件),则可以从 Snowflake 暂存区部署它们。以下示例演示如何从 Snowflake 暂存区部署应用程序及其依赖项。
要从终端将文件上传到暂存区,您可以使用 SnowflakeCLI。请注意,SnowSQL 是旧版 CLI;如果您已经在使用它,也可以使用它来将文件上传到暂存区。如果您尚未安装 Snowflake CLI,可以按照 安装 Snowflake CLI 中的说明进行安装。
在本地 IDE 中,创建一个包含以下内容,名为
sample_employees.csv的新 CSV 文件:使用以下命令将依赖项文件上传到暂存区,其中
my_stage是账户中暂存区的名称。(如果您没有创建暂存区,可以使用 [snow stage create](/developer-guide/snowflake-cli/command-reference/stage-commands/create)。)要验证文件是否上传成功,可以使用以下命令列出暂存区中的文件:
您应该会在列表中看到文件
sample_employees.csv。在本地 IDE 中,创建一个包含以下内容,名为
app.py的新 Python 文件:要提交使用您上传到暂存区的文件的应用程序,请使用以下命令:
请注意,运行应用程序需要计算池,并且必须在
connections.toml文件中指定,或通过命令行使用--compute-pool选项指定。有关更多信息,请参阅 Snowpark Submit 参考。
利用等待和日志进行监控¶
以下示例说明如何提交作业、等待作业完成,然后检索日志。
使用以下命令提交作业,并等待其完成:
如果作业失败,请使用以下命令检查详细日志:
在 Apache Airflow DAG 中使用 Snowpark Submit¶
您可以通过 Snowpark Connect for Spark 向 Snowflake 提交 Spark 作业。您可以在集群模式下使用 snowpark-submit,利用计算池来运行作业。
以这种方式使用 Apache Airflow 时,请确保运行 Apache Airflow 的 Docker 服务或 Snowpark Container Services 容器能够正确访问 Snowflake 和 Snowflake 暂存区所需的文件。
以下示例中的代码执行以下任务:
在
/tmp/myenv处创建 Python 虚拟环境。在
create_venv任务中,代码使用pip,从而使用.whl文件安装snowpark-submit包。生成一个包含 Snowflake 连接凭据和 OAuth 令牌的安全
connections.toml文件。在
create_connections_toml任务中,代码会创建/app/.snowflake目录、创建.toml文件,然后更改文件权限,以仅允许所有者(用户)具备读写权限。使用 snowpark-submit 命令运行 Spark 作业。
在
run_snowpark_script作业中,代码执行以下操作:激活虚拟环境。
使用 snowpark-submit 命令运行 Spark 作业。
使用集群模式部署到 Snowflake。
使用 Snowpark Connect for Spark 远程 URI sc://localhost:15002。
指定 Spark 应用程序类
org.example.SnowparkConnectApp。从 @snowflake_stage 暂存区提取脚本。
使用
--wait-for-completion阻止部署,直到作业完成。
您可以使用 Apache Airflow 用户界面的图表视图或树视图监控 DAG。检查任务日志中是否有以下项目:
环境设置
Snowpark Connect for Spark 的状态
snowpark-submit 作业输出
您还可以通过存储在 Snowflake 暂存区中的日志或者是事件表,监控在 Snowflake 中运行的作业。