我有一个初始化脚本,可以从我们的本地工件存储库下载.jar并将其放入群集上每个节点的/usr/local/bin
中。我可以使用
gcloud dataproc jobs submit spark --cluster=my_cluster
--region=us-central1 --jar=file:///usr/local/bin/myjar.jar -- arg1 arg2
但是,如果我的最终用户不必知道罐子的位置,我更喜欢它。
我可以将.jar放在哪里,以便不必指定它的位置?
对于 Spark 作业,您应该能够将 jarfile 放在所有节点上的/usr/lib/spark/jars
中,以便在类路径上自动可用。
为了获得更一般的覆盖范围,您可以将jar添加到/usr/lib/hadoop/lib
;hadoop lib目录也自动包含在Dataproc上的Spark作业中,并且是GCS连接器jarfile等库所在的位置。您可以通过/etc/spark/conf/spark-env.sh
中配置的SPARK_DIST_CLASSPATH
环境变量看到包含的 hadoop lib 目录。
如果所需的行为仍然是使用--jar
标志指定"主 jar"而不是--jars
指定仅提供类的库 jar,不幸的是,集群上目前没有"工作目录"的概念,只允许指定"主 jar"的相对(而不是绝对(路径。但是,有两种方法具有类似的行为:
- 将 jarfile 设置为从中提交作业的用户工作区的本地 - 然后 gcloud 会在作业提交时将 jarfile 上传到 GCS,并在作业在特定于作业的目录中运行时将作业指向 jarfile。请注意,这会导致每次作业运行时将 jarfile 重复上传到 GCS,因为它始终暂存到唯一的作业目录中;您稍后必须
gcloud dataproc jobs delete
清理这些jar文件使用的GCS空间 - (首选方法(:使用
--class
而不是--jar
参数来指定在执行上述步骤后要运行的作业,以使 jar 已在 Spark 类路径中可用。虽然类名的调用有点冗长,但它仍然实现了向用户隐藏 jarfile 位置详细信息的目标。
例如,用于"spark-shell"实现的类已经在类路径上,所以如果你想运行一个scala文件,就像你通过spark-shell
运行它一样,你可以运行:
gcloud dataproc jobs submit spark --cluster my-cluster
--class org.apache.spark.repl.Main
-- -i myjob.scala