要遵循此question,我决定尝试工作流程模板API。
这是它的样子:
gcloud beta dataproc workflow-templates create lifestage-workflow --region europe-west2
gcloud beta dataproc workflow-templates set-managed-cluster lifestage-workflow \
--master-machine-type n1-standard-8 \
--worker-machine-type n1-standard-16 \
--num-workers 6 \
--cluster-name lifestage-workflow-cluster \
--initialization-actions gs://..../init.sh \
--zone europe-west2-b \
--region europe-west2 \
gcloud beta dataproc workflow-templates add-job pyspark gs://.../main.py \
--step-id prediction \
--region europe-west2 \
--workflow-template lifestage-workflow \
--jars gs://.../custom.jar \
--py-files gs://.../jobs.zip,gs://.../config.ini \
-- --job predict --conf config.ini
正确创建模板。 当我从一个已经存在的集群手动运行它时,该工作正常。当我使用现有集群而不是要求工作流创建集群时,它也会运行。
问题是我希望在运行作业之前创建群集并在之后删除,这就是我使用托管群集的原因。
但是对于托管集群,我无法让它运行。我尝试使用与现有集群相同的配置,但它不会改变任何内容。 我总是得到同样的error。
我知道为什么我的作业运行得很完美,除非从生成的集群运行它?
答案 0 :(得分:1)
问题来自托管集群的版本。
默认情况下,映像版本为1.2.31,我现有的集群使用的是映像1.2.28。
当我更改配置以添加 - image-version = 1.2.28 时,它有效。
Dataproc image 1.2.31升级Spark到2.2.1引入了[SPARK-22472]:
SPARK-22472:为顶级基元类型添加了空检查。之前 此版本适用于具有顶级基元类型的数据集 具有空值,可能会返回一些意外结果。例如, 假设我们有一个带有模式的镶木地板文件,我们就读了它 进入Scala Int。如果列a具有空值,则转换为 应用了一些意外的值可以返回。
这可能会添加足够的生成代码来获取64k的限制。