Dataproc 集群与 Spark 1.6.X 使用 scala 2.11.X
Dataproc Cluster with Spark 1.6.X using scala 2.11.X
我正在寻找一种在使用 Scala 2.11 构建的 Dataproc 上使用 Spark 的方法。我想使用 2.11,因为我的工作引入了 ~10 个 BigQuery 表,并且我正在使用新的反射库将相应的对象映射到案例 类。 (新反射 类 和并发有一个错误,仅在 Scala 2.11 中修复)我尝试通过将 executor-cores 设置为 1 来解决这个问题,但性能下降是痛苦的。有没有更好的办法?
一般来说,将 executor-cores 设置为 1 是解决并发问题的合理方法,因为您可能合并到 Spark 作业中的第三方库也经常会出现线程安全问题;这里的关键是你应该能够将执行器的大小调整为每个只有 1 个核心而不会真正牺牲性能(更大的调度开销和 yarn 开销可能意味着大约 10% 的性能下降,但肯定没有什么不可管理的) .
我假设您指的是某些乘法因数性能下降,例如,在 8 核 VM 上仅使用 8 个内核中的 2 个(默认情况下,Dataproc 为每个 VM 打包 2 个执行程序)。解决这个问题的方法是简单地也按比例向下调整 spark.executor.memory
以与 1 核匹配。例如,在您的集群配置 (gcloud dataproc clusters describe your-cluster-name
) 中,如果您使用 4 核 VM,您可能会看到如下内容:
spark:spark.executor.cores: '2'
spark:spark.executor.memory: 5586m
YARN 完全基于内存而不是内核进行打包,因此这意味着 5586m
旨在适合半个 YARN 节点,因此对应于 2 个内核。如果您像这样打开集群:
gcloud dataproc clusters create \
--properties spark:spark.executor.cores=1,spark:spark.executor.memory=2000m
然后你应该得到一个仍然使用所有内核但没有并发问题的设置(每个执行进程中只有一个工作线程)。
在这种情况下我不只是使用 5586/2
因为你还必须考虑 spark:spark.yarn.executor.memoryOverhead
所以基本上你必须添加 memoryOverhead,然后除以二,然后减去memoryOverhead 再次确定新的执行程序大小,除此之外,分配还舍入到基本块大小的下一个倍数,我认为是 512m。
一般来说,您可以通过试错来开始对每个内核分配较低的内存,然后在您发现需要更多内存空间时增加它。
您也不必重新部署集群来检查这些;您可以在作业提交时指定这些以加快周转速度:
gcloud dataproc jobs submit spark \
--properties spark.executor.cores=1,spark.executor.memory=2000m
我正在寻找一种在使用 Scala 2.11 构建的 Dataproc 上使用 Spark 的方法。我想使用 2.11,因为我的工作引入了 ~10 个 BigQuery 表,并且我正在使用新的反射库将相应的对象映射到案例 类。 (新反射 类 和并发有一个错误,仅在 Scala 2.11 中修复)我尝试通过将 executor-cores 设置为 1 来解决这个问题,但性能下降是痛苦的。有没有更好的办法?
一般来说,将 executor-cores 设置为 1 是解决并发问题的合理方法,因为您可能合并到 Spark 作业中的第三方库也经常会出现线程安全问题;这里的关键是你应该能够将执行器的大小调整为每个只有 1 个核心而不会真正牺牲性能(更大的调度开销和 yarn 开销可能意味着大约 10% 的性能下降,但肯定没有什么不可管理的) .
我假设您指的是某些乘法因数性能下降,例如,在 8 核 VM 上仅使用 8 个内核中的 2 个(默认情况下,Dataproc 为每个 VM 打包 2 个执行程序)。解决这个问题的方法是简单地也按比例向下调整 spark.executor.memory
以与 1 核匹配。例如,在您的集群配置 (gcloud dataproc clusters describe your-cluster-name
) 中,如果您使用 4 核 VM,您可能会看到如下内容:
spark:spark.executor.cores: '2'
spark:spark.executor.memory: 5586m
YARN 完全基于内存而不是内核进行打包,因此这意味着 5586m
旨在适合半个 YARN 节点,因此对应于 2 个内核。如果您像这样打开集群:
gcloud dataproc clusters create \
--properties spark:spark.executor.cores=1,spark:spark.executor.memory=2000m
然后你应该得到一个仍然使用所有内核但没有并发问题的设置(每个执行进程中只有一个工作线程)。
在这种情况下我不只是使用 5586/2
因为你还必须考虑 spark:spark.yarn.executor.memoryOverhead
所以基本上你必须添加 memoryOverhead,然后除以二,然后减去memoryOverhead 再次确定新的执行程序大小,除此之外,分配还舍入到基本块大小的下一个倍数,我认为是 512m。
一般来说,您可以通过试错来开始对每个内核分配较低的内存,然后在您发现需要更多内存空间时增加它。
您也不必重新部署集群来检查这些;您可以在作业提交时指定这些以加快周转速度:
gcloud dataproc jobs submit spark \
--properties spark.executor.cores=1,spark.executor.memory=2000m