【发布时间】:2020-06-27 12:47:05
【问题描述】:
我正在使用 spark 作业将 1200 个 MS SQL Server 表中的数据加载到 BigQuery 中。这都是编排的 ETL 流程的一部分,其中 spark 作业由从 PubSub 接收消息的 scala 代码组成。因此,在大约一个小时的时间内收到了 1200 条消息。每条消息都会触发代码(异步),该代码从表中读取数据,进行少量转换,然后写入 BigQuery。该过程本身运行良好。我的问题是 Spark 中的活动作业数量从未超过 5,尽管有很多“作业”在等待并且有大量可用资源。
我尝试将 spark.driver.cores 提高到 30,但没有任何变化。此外,此设置虽然在 Google 控制台中可见,但似乎无法通过实际的 spark 作业(在 spark UI 中查看时)。这是在控制台中运行的 spark 作业:
以下是 Spark 作业属性:
这是一个相当大的集群,有大量可用资源:
这里是创建集群的命令行:
gcloud dataproc clusters create odsengine-cluster \
--properties dataproc:dataproc.conscrypt.provider.enable=false,spark:spark.executor.userClassPathFirst=true,spark:spark.driver.userClassPathFirst=true \
--project=xxx \
--region europe-north1 \
--zone europe-north1-a \
--subnet xxx \
--master-machine-type n1-standard-4 \
--worker-machine-type m1-ultramem-40 \
--master-boot-disk-size 30GB \
--worker-boot-disk-size 2000GB \
--image-version 1.4 \
--master-boot-disk-type=pd-ssd \
--worker-boot-disk-type=pd-ssd \
--num-workers=2 \
--scopes cloud-platform \
--initialization-actions gs://xxx/cluster_init/init_actions.sh
以及提交spark作业的命令行:
gcloud dataproc jobs submit spark \
--project=velliv-dwh-development \
--cluster odsengine-cluster \
--region europe-north1 \
--jars gs://velliv-dwh-dev-bu-dcaods/OdsEngine_2.11-0.1.jar \
--class Main \
--properties \
spark.executor.memory=35g,\
spark.executor.cores=2,\
spark.executor.memoryOverhead=2g,\
spark.dynamicAllocation.enabled=true,\
spark.shuffle.service.enabled=true,\
spark.driver.cores=30\
-- yarn
我知道我可以考虑使用分区来分散大型单个表的负载,并且我也曾在另一个场景中成功地使用过这种方法,但在这种情况下,我只想一次加载多个表无需对每个表进行分区。
【问题讨论】:
标签: apache-spark google-cloud-dataproc