Den*_*Huo 5 scala apache-spark google-cloud-dataproc
通常情况下,如果我使用斯卡拉星火工作,我会编一个jar文件,并提交它gcloud dataproc jobs submit spark,但有时非常轻巧的工作我可能会使用未编译Scala代码在笔记本或使用spark-shellREPL,在这里我假设SparkContext已经可用的。
对于其中一些轻量级用例,我可以等效地使用 PySpark 并提交,gcloud dataproc jobs submit pyspark但有时我需要更轻松地访问 Scala/Java 库,例如直接org.apache.hadoop.fs.FileSystem在 map 函数内创建对象。是否有任何简单的方法可以使用 Dataproc 作业 API 直接从命令行提交此类“spark-shell”等效作业?
目前,未编译的 Spark Scala 没有专门的顶级 Dataproc 作业类型,但在幕后,spark-shell它只是使用与spark-submit运行专门的 REPL 驱动程序相同的机制:org.apache.spark.repl.Main。因此,将其与--files中可用的标志相结合gcloud dataproc jobs submit spark,您可以只编写您可能在 或 笔记本会话中测试过的 Scala 片段spark-shell,并将其作为整个 Dataproc 作业运行,假设它job.scala是您计算机上的本地文件:
gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
--class org.apache.spark.repl.Main \
--files job.scala \
-- -i job.scala
Run Code Online (Sandbox Code Playgroud)
就像任何其他文件一样,您也可以在--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
Run Code Online (Sandbox Code Playgroud)
如果您已通过 init 操作将作业文件暂存到 Dataproc 主节点上,则可以file:///指定在集群的本地文件系统而不是在运行 gcloud 的本地文件系统上找到该文件:
gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
--class org.apache.spark.repl.Main \
--files file:///tmp/job.scala \
-- -i job.scala
Run Code Online (Sandbox Code Playgroud)
请注意,在所有情况下,该文件都会成为主驱动程序作业的工作目录中的本地文件,因此“-i”的参数可以只是文件名的相对路径。