apache-spark - 为什么spark Streaming从kafka接收数据使用的内存比<executorMemory * executorCount + driverMemory>更多?

标签 apache-spark spark-streaming

我使用客户端模式向 YARN 集群提交了 Spark Streaming 应用程序,如下所示:

./spark-submit \
--jars $JARS \
--class $APPCLS \
--master yarn-client \
--driver-memory 64m \
--executor-memory 64m \
--conf spark.shuffle.service.enabled=false \
--conf spark.dynamicAllocation.enabled=false  \
--num-executors 6 \
/data/apps/app.jar 

executorMemory * executorCount + driverMemory = 64m*6 + 64m = 448m,

但应用程序实际上使用了3968mb。为什么会发生这种情况以及如何减少内存使用?

最佳答案

Spark 配置参数 spark.yarn.executor.memoryOverheadspark.yarn.driver.memoryOverhead 在您的情况下默认为 384 MB ( docs )。

事实上,YARN 具有内存分配粒度 (yarn.scheduler.increment-allocation-mb),默认为 512 MB。因此,所有内容都会四舍五入到该值的倍数。

还有一个最小分配大小 (yarn.scheduler.minimum-allocation-mb),默认为 1 GB。您的情况可能被设置得较低,或者您没有正确查看内存分配。


与您的内存使用相比,所有这些开销应该可以忽略不计。您应该将 --executor-memory 设置为 20 GB 或更多。为什么你要尝试配置一个低得离谱的内存量?

关于apache-spark - 为什么spark Streaming从kafka接收数据使用的内存比<executorMemory * executorCount + driverMemory>更多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402735/

相关文章:

java - 如何使用 RowMatrix.columnSimilarities 的输出

java - 如何在不使用collect函数的情况下有效地将rdd转换为list

hadoop - 如何知道在 YARN 客户端模式下带有 spark-shell 的 ClosedChannelException 的原因是什么?

apache-spark - Spark 历史服务器按用户 ID 或时间过滤作业

scala - 来自 Spark Streaming 的 Rest API 服务调用

apache-spark - Apache Spark 与 Apache Spark 2

scala - 无法在 DSE 6.7 中创建 SparkSession

python-3.x - 使用 Pyspark 检查 hive Metastore 中是否存在表

elasticsearch - 如何将 elasticsearch 连接到 apache spark streaming 或 storm?

apache-spark - 如何让 Spark Streaming 写入它的输出以便 Impala 可以读取它?