我如何 运行 未编译的 Spark Scala/spark-shell 代码作为 Dataproc 作业?

How can I run uncompiled Spark Scala/spark-shell code as a Dataproc job?

通常,如果我将 Scala 用于 Spark 作业,我会编译一个 jarfile 并使用 gcloud dataproc jobs submit spark 提交它,但有时对于非常轻量级的作业,我可能会在笔记本中使用未编译的 Scala 代码或使用spark-shell REPL,我假设 SparkContext 已经可用。

对于其中一些轻量级用例,我可以等效地使用 PySpark 并使用 gcloud dataproc jobs submit pyspark 提交,但有时我需要更轻松地访问 Scala/Java 库,例如直接在其中创建一个 org.apache.hadoop.fs.FileSystem 对象地图功能。是否有任何简单的方法可以使用 Dataproc 作业 API 直接从命令行提交此类 "spark-shell" 等效作业?

目前,没有针对未编译的 Spark Scala 的专用顶级 Dataproc 作业类型,但在幕后,spark-shell 只是使用与 spark-submit 相同的机制来 运行 专门的 REPL 驱动程序:org.apache.spark.repl.Main。因此,将它与 gcloud dataproc jobs submit spark 中可用的 --files 标志相结合,您可以只编写您可能在 spark-shell 或笔记本会话中测试过的 Scala 片段,并且 运行作为您的整个 Dataproc 作业,假设 job.scala 是您计算机上的本地文件:

gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
    --class org.apache.spark.repl.Main \
    --files job.scala \
    -- -i job.scala

就像任何其他文件一样,您也可以在 --files 参数中指定任何与 Hadoop 兼容的路径,例如 gs:// 甚至 hdfs://,假设您已经已经将您的 job.scala 文件放在那里:

gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
    --class org.apache.spark.repl.Main \
    --files gs://${BUCKET}/job.scala \
    -- -i job.scala

gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
    --class org.apache.spark.repl.Main \
    --files hdfs:///tmp/job.scala \
    -- -i job.scala

如果您已通过 init 操作将作业文件暂存到 Dataproc 主节点上,您将使用 file:/// 指定该文件位于集群的本地文件系统而不是您的本地文件系统,其中你是 运行ning gcloud:

gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
    --class org.apache.spark.repl.Main \
    --files file:///tmp/job.scala \
    -- -i job.scala

请注意,在所有情况下,该文件都会成为主驱动程序工作目录中的本地文件,因此“-i”的参数只能是文件名的相对路径。