我应该把 jar 放在 dataproc 集群的什么地方,以便 gcloud dataproc jobs submit spark 可以使用它们?
Where should I put jars on a dataproc cluster so they can be used by gcloud dataproc jobs submit spark?
我有一个初始化脚本,它从我们的本地工件存储库下载一个 .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 的位置,我会更喜欢它。
我可以把 .jar 放在哪里,这样就不必指定它的位置了?
对于 spark 作业,您应该能够将 jarfile 放在所有节点上的 /usr/lib/spark/jars
中,以便在类路径上自动可用。
为了获得更广泛的覆盖,您可以将您的罐子添加到 /usr/lib/hadoop/lib
; hadoop lib 目录也自动包含在 Dataproc 上的 Spark 作业中,并且是 GCS 连接器 jarfile 等库所在的位置。您可以看到通过 /etc/spark/conf/spark-env.sh
.
中配置的 SPARK_DIST_CLASSPATH
环境变量包含了 hadoop lib 目录
如果所需的行为仍然是指定使用 --jar
标志来指定 "main jar" 而不是 --jars
来指定仅提供 类 的库 jar,不幸的是目前在集群上没有 "working directory" 的概念,它只允许指定 "main jar" 的相对(而不是绝对)路径。但是,有两种方法具有相似的行为:
- 使 jarfile 成为用户工作的本地文件space 从中提交作业 - gcloud 将在作业提交时将 jarfile 上传到 GCS 并在 [=42] 时将作业指向 jarfile =]s 在特定于作业的目录中。请注意,这会导致每次作业 运行s 时将 jarfile 重复上传到 GCS,因为它总是暂存到一个唯一的作业目录中;您稍后必须
gcloud dataproc jobs delete
清理那些 jarfiles 使用的 GCS space
- (首选方法):在执行上述步骤后使用
--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
我有一个初始化脚本,它从我们的本地工件存储库下载一个 .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 的位置,我会更喜欢它。
我可以把 .jar 放在哪里,这样就不必指定它的位置了?
对于 spark 作业,您应该能够将 jarfile 放在所有节点上的 /usr/lib/spark/jars
中,以便在类路径上自动可用。
为了获得更广泛的覆盖,您可以将您的罐子添加到 /usr/lib/hadoop/lib
; hadoop lib 目录也自动包含在 Dataproc 上的 Spark 作业中,并且是 GCS 连接器 jarfile 等库所在的位置。您可以看到通过 /etc/spark/conf/spark-env.sh
.
SPARK_DIST_CLASSPATH
环境变量包含了 hadoop lib 目录
如果所需的行为仍然是指定使用 --jar
标志来指定 "main jar" 而不是 --jars
来指定仅提供 类 的库 jar,不幸的是目前在集群上没有 "working directory" 的概念,它只允许指定 "main jar" 的相对(而不是绝对)路径。但是,有两种方法具有相似的行为:
- 使 jarfile 成为用户工作的本地文件space 从中提交作业 - gcloud 将在作业提交时将 jarfile 上传到 GCS 并在 [=42] 时将作业指向 jarfile =]s 在特定于作业的目录中。请注意,这会导致每次作业 运行s 时将 jarfile 重复上传到 GCS,因为它总是暂存到一个唯一的作业目录中;您稍后必须
gcloud dataproc jobs delete
清理那些 jarfiles 使用的 GCS space
- (首选方法):在执行上述步骤后使用
--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