在 Cloud Dataproc 中调整工作节点大小后如何更新 spark 配置
How to update spark configuration after resizing worker nodes in Cloud Dataproc
我有一个 DataProc Spark 集群。最初,主节点和 2 个工作节点的类型为 n1-standard-4(4 个 vCPU,15.0 GB 内存),然后我通过 Web 控制台将它们全部调整为 n1-highmem-8(8 个 vCPU,52 GB 内存)。
我注意到两个工作节点没有被完全使用。特别是,第一个worker节点上只有2个executor,第二个worker节点上只有1个executor,
spark.executor.cores 2
spark.executor.memory 4655m
在/usr/lib/spark/conf/spark-defaults.conf
。我以为用spark.dynamicAllocation.enabled true
,executor的数量会自动增加。
此外,Web 控制台的 DataProc 页面上的信息也不会自动更新。看来DataProc还是认为所有节点都是n1-standard-4.
我的问题是
- 为什么第一个工作节点上的执行程序比第二个多?
- 为什么不给每个节点添加更多的执行器?
- 理想情况下,我希望整个集群得到充分利用,如果 spark 配置需要更新,怎么办?
如您所见,集群的配置是在首次创建集群时设置的,不会根据手动调整大小进行调整。
回答您的问题:
- Spark ApplicationMaster 在工作节点上使用 YARN 中的容器,通常是第一个工作人员,如果只有一个 spark 应用程序是 运行。
- 启动集群时,Dataproc 会尝试在每台机器上安装两个 YARN 容器。
- 每台机器上的 YARN NodeManager 配置决定了机器的多少资源应该专用于 YARN。这可以在 /etc/hadoop/conf/yarn-site.xml 下的每个 VM 上更改,然后重新启动 sudo service hadoop-yarn-nodemanager。一旦机器向 ResourceManager 广播更多资源,Spark 就可以启动更多容器。在 YARN 添加更多资源后,您可能希望通过修改 spark.executor.memory 和 spark.executor.cores.
来修改 Spark 请求的容器大小
与其之后调整集群节点大小和手动编辑配置文件,不如考虑使用新机器大小启动新集群,并将旧集群中的任何数据复制到新集群。通常,移动数据的最简单方法是使用 hadoop 的内置 distcp 实用程序。一个示例用法类似于:
$ hadoop distcp hdfs:///some_directory hdfs://other-cluster-m:8020/
或者如果您可以使用云存储:
$ hadoop distcp hdfs:///some_directory gs://<your_bucket>/some_directory
或者,考虑始终将数据存储在 Cloud Storage 中,并将每个集群视为可以随时拆除和重新创建的临时资源。一般来说,任何时候你要将数据保存到HDFS,你也可以将它保存为:
gs://<your_bucket>/path/to/file
保存到 GCS 的好处是允许您在不使用时删除集群(以及 HDFS 和永久磁盘上的数据)。
我有一个 DataProc Spark 集群。最初,主节点和 2 个工作节点的类型为 n1-standard-4(4 个 vCPU,15.0 GB 内存),然后我通过 Web 控制台将它们全部调整为 n1-highmem-8(8 个 vCPU,52 GB 内存)。
我注意到两个工作节点没有被完全使用。特别是,第一个worker节点上只有2个executor,第二个worker节点上只有1个executor,
spark.executor.cores 2
spark.executor.memory 4655m
在/usr/lib/spark/conf/spark-defaults.conf
。我以为用spark.dynamicAllocation.enabled true
,executor的数量会自动增加。
此外,Web 控制台的 DataProc 页面上的信息也不会自动更新。看来DataProc还是认为所有节点都是n1-standard-4.
我的问题是
- 为什么第一个工作节点上的执行程序比第二个多?
- 为什么不给每个节点添加更多的执行器?
- 理想情况下,我希望整个集群得到充分利用,如果 spark 配置需要更新,怎么办?
如您所见,集群的配置是在首次创建集群时设置的,不会根据手动调整大小进行调整。
回答您的问题:
- Spark ApplicationMaster 在工作节点上使用 YARN 中的容器,通常是第一个工作人员,如果只有一个 spark 应用程序是 运行。
- 启动集群时,Dataproc 会尝试在每台机器上安装两个 YARN 容器。
- 每台机器上的 YARN NodeManager 配置决定了机器的多少资源应该专用于 YARN。这可以在 /etc/hadoop/conf/yarn-site.xml 下的每个 VM 上更改,然后重新启动 sudo service hadoop-yarn-nodemanager。一旦机器向 ResourceManager 广播更多资源,Spark 就可以启动更多容器。在 YARN 添加更多资源后,您可能希望通过修改 spark.executor.memory 和 spark.executor.cores. 来修改 Spark 请求的容器大小
与其之后调整集群节点大小和手动编辑配置文件,不如考虑使用新机器大小启动新集群,并将旧集群中的任何数据复制到新集群。通常,移动数据的最简单方法是使用 hadoop 的内置 distcp 实用程序。一个示例用法类似于:
$ hadoop distcp hdfs:///some_directory hdfs://other-cluster-m:8020/
或者如果您可以使用云存储:
$ hadoop distcp hdfs:///some_directory gs://<your_bucket>/some_directory
或者,考虑始终将数据存储在 Cloud Storage 中,并将每个集群视为可以随时拆除和重新创建的临时资源。一般来说,任何时候你要将数据保存到HDFS,你也可以将它保存为:
gs://<your_bucket>/path/to/file
保存到 GCS 的好处是允许您在不使用时删除集群(以及 HDFS 和永久磁盘上的数据)。