直到现在,我只在YARN作为资源管理器的Hadoop集群上使用了Spark。在这种类型的集群中,我确切地知道要运行多少个执行程序以及资源管理的工作方式。但是,知道我正在尝试使用独立Spark集群,我有些困惑。纠正我在哪里错了。
默认情况下,this article中的工作节点使用该节点的所有内存减去1 GB。但是我知道通过使用SPARK_WORKER_MEMORY
,我们可以使用更少的内存。例如,如果节点的总内存为32 GB,但是我指定了16 GB,那么Spark worker是否在该节点上使用的内存不会超过16 GB?
但是执行者呢?假设我们要在每个节点上运行2个执行程序,是否可以通过将spark-submit
期间的执行程序内存指定为SPARK_WORKER_MEMORY
的一半来实现?如果我想在每个节点上运行4个执行程序,可以通过指定执行者记忆是SPARK_WORKER_MEMORY
的四分之一?
如果这样的话,我认为除了执行者内存外,我还必须正确指定执行者核心。例如,如果我要在一个工人上运行4个执行程序,则必须将执行程序核心指定为SPARK_WORKER_CORES
的四分之一?如果我指定一个更大的数字会怎样?我的意思是,如果我将执行程序内存指定为SPARK_WORKER_MEMORY
的四分之一,但是执行程序核心仅是SPARK_WORKER_CORES
的一半?在这种情况下,我会在该节点上运行2或4个执行程序吗?
答案 0 :(得分:2)
根据我的经验,这是控制执行程序,内核和内存数量的最佳方法。
您可以设置所有执行程序的内核总数,也可以设置每个执行程序的内核数,还可以设置执行程序内存
-总执行者核心数12-执行者核心数2-执行者内存6G
这将为您提供6个执行者和每个执行者2个内核/ 6G,因此,您总共要查看12个内核和36G
您可以使用
设置驱动程序内存-驱动程序内存2G
答案 1 :(得分:0)
因此,我自己亲自测试了Spark Standalone集群,这就是我所注意到的。
我的直觉是,通过调整执行器内核,可以使多个执行器在一个工作程序中运行。让我们说,您的工人有16个核心。现在,如果您为执行程序指定8个内核,Spark将为每个工作人员运行2个执行程序。
在一个工作程序中运行多少个执行程序还取决于您指定的执行程序内存。例如,如果工作程序内存为24 GB,并且您要为每个工作程序运行2个执行程序,则不能将执行程序内存指定为大于12 GB。
启动从站时,可以通过指定可选参数--memory
的值或更改SPARK_WORKER_MEMORY
的值来限制工人的内存。与内核数(--cores
/ SPARK_WORKER_CORES
)相同。
如果您希望能够在Standalone Spark集群上运行多个作业,则可以在执行spark.cores.max
时使用spark-submit
配置属性。例如,这样。
spark-submit <other parameters> --conf="spark.cores.max=16" <other parameters>
因此,如果您的独立Spark集群总共允许64个内核,而您的程序仅提供16个内核,则其他Spark作业可以使用剩余的48个内核。