我在Spark上从事一个项目,最近从使用Spark Standalone切换到使用Mesos进行集群管理。现在,我发现自己对在新系统下提交作业时如何分配资源感到困惑。
在独立模式下,我使用的是这样的东西(以下是Cloudera博客文章中的一些建议:
/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8
--total-executor-cores 240 myscript.py
这是一个集群,其中每台机器有16个内核和大约32 GB RAM。
这样做的好处是,我可以很好地控制运行的执行器的数量以及分配给每个执行器的资源。在上面的例子中,我知道我得到了240/8=30个执行器,每个执行器都有16GB的内存和8个内核。考虑到集群中每台机器上的内存,这相当于每台机器上运行的执行器不超过两个。如果我想要更多的遗嘱执行人,我可以这样做
/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5
--total-executor-cores 240 myscript.py
这将为我提供240/5=47个执行器,每个执行器有5个内核和10GB内存,并且每台机器最多允许3个执行器。
但现在我在mesos上,我有点困惑了。首先,我以粗粒度模式运行,以确保我可以修复和控制我的资源分配(这是为我们想要预分配资源的相当复杂的模型服务的)。
现在,我可以指定执行器核心总数和执行器内存,但文档告诉我,执行器核心仅适用于Spark standalone和YARN,这使得指定执行器的总数和分配给每个执行器的资源非常困难。假设我运行此:
/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py
当我在Mesos web UI中检查这项工作时,事情开始变得混乱起来。下面是我的问题:
>
264/15=17.6,这似乎与我指定的每个执行器16GB的内存一致(我想还有一些开销)。我对这一切的解释对吗?
假设是,当我检查这些“任务”(执行者)时,我发现每个任务都分配了16个核心。假设我们每台机器有16个核,这似乎表明我基本上在16台机器中的每台机器上运行一个执行器,每个执行器都得到了完整的16个核,但只有16 GB的RAM。(请注意,即使我将执行器内存降到4GB左右,mesos仍然只是每个节点运行一个执行器,有16个内核和4GB RAM)。但我想要完成的是我的前两个例子。也就是说,我想在每个节点上运行多个执行器,每个执行器共享该节点的RAM和内核(即适度数量的内核预执行器,5-8)。考虑到我不能在Mesos中指定执行器核心,我该如何实现这一点?或者,我是否出于某种原因,甚至不想完成这项任务?Mesos会不会不允许每个节点有多个执行器?
关于1)
这也是我的理解。Mesos任务实际上是一个Spark执行器(Task)。
关于2)
根据我的理解,您应该能够使用spark.mesos.mesosExecutor.cores
配置属性:
(仅限细粒度模式)给每个Mesos执行器的内核数。这不包括用于运行Spark任务的内核。换句话说,即使没有运行Spark任务,每个Mesos执行器也会占用此处配置的内核数。该值可以是浮点数。
看见
问题1:在粗粒度模式下,Spark的执行器(org.apache.Spark.executor.roughGrainedExecutorBackend)作为Mesos任务启动。Mesos框架实际上是Spark驱动程序。一个Spark驱动程序可以提交多个Spark作业。这取决于您的Spark应用程序。Spark和Mesos都来自加州大学伯克利分校的AMPLab,并且是并行开发的,因此它们使用类似的术语(执行者、任务…)这可能会让您感到困惑:-)。
问题2:在粗粒度模式下,Spark每台主机只启动一个执行器(详情请参考https://issues.apache.org/jira/browse/SPARK-5095)。所以对于你的情况,Spark将为每台主机启动一个执行器(每个执行器消耗16G内存,以及主机中所有可用的内核,如果没有其他工作负载,则为16核),直到执行器的总内核达到240核。将有240/16=15个执行器。
关于spark。mesos。中胚层切割器。核心,它仅适用于细粒度模式。在细粒度模式下,Spark将为每个主机启动一个执行器(org.apache.Spark.executor.MesosExecutorBackend)。执行器消耗spark的核数。mesos。中胚层切割器。核心,即使没有任务。每个任务将消耗另一个数量的spark内核。任务CPU。
我正在尝试为一个简单的任务最大化集群使用。 集群容量为12×m3。xlarge、runnning Spark 1.3.1、Hadoop 2.4、Amazon AMI 3.7 该任务读取文本文件的所有行,并将它们解析为csv。 当我以纱线簇模式spark提交任务时,会得到以下结果之一: 0执行器:作业无限等待,直到我手动杀死它 1个执行器:仅有1台机器工作的情况下使用资源的作业 OOM当我没有为驱动
是否可以从一个Docker容器中提交一个Mesos上的Spark作业,其中有一个Mesos master(没有Zookeeper)和一个Mesos agent,每个都在独立的Docker容器中运行(目前在同一主机上)?在http://Mesos.apache.org/documentation/latest/container-image/上描述的Mesos容器化器似乎适用于Mesos应用程序只是
我正在使用EMR 4.1.0+spark 1.5.0+YARN来处理大数据。我正试图利用全集群,但有些如何纱没有分配所有的资源。 使用4个C3.8X大型EC2从机节点(每个60.0GB内存和32个核) 根据本文,我在EMR集群中设置了以下参数 yarn.nodemanager.resource.memory-MB->53856 yarn.nodemanager.resource.cpu-vcore
我试图在IPython笔记本中运行简单的WordCount作业,并将Spark连接到AWS EC2集群。当我在本地独立模式下使用Spark时,该程序可以很好地工作,但当我试图将其连接到EC2集群时,该程序会出现问题。 我已采取以下步骤 我已经看到了这个Stackoverflow帖子,并通过在main命令后使用这些选项将核心数减少到1,内存减少到512 来自SparkUI的屏幕截图如下所示 这清楚地
正如标题所预期的,我在向docker上运行的spark集群提交spark作业时遇到了一些问题。 我在scala中写了一个非常简单的火花作业,订阅一个kafka服务器,安排一些数据,并将这些数据存储在一个elastichsearch数据库中。 如果我在我的开发环境(Windows/IntelliJ)中从Ide运行spark作业,那么一切都会完美工作。 然后(我一点也不喜欢java),我按照以下说明添
了解网络下载资源的阶段至关重要。这是修复加载问题的基础。 TL;DR 了解资源时序的阶段。 知道每个阶段提供给Resource Timing(资源时序)API。 在时间轴图表中识别性能问题的不同指示。如连续的透明条或大块绿色。 所有网络请求都被视为资源。当它们通过网络检索时,分为不同的生命周期。Network(网络)面板使用的Resource Timing API和提供给开发者的API是一样的。注