为啥 Spark Standalone 集群不使用所有可用的内核?
Posted
技术标签:
【中文标题】为啥 Spark Standalone 集群不使用所有可用的内核?【英文标题】:Why does Spark Standalone cluster not use all available cores?为什么 Spark Standalone 集群不使用所有可用的内核? 【发布时间】:2015-04-22 09:39:08 【问题描述】:我已经为 Apache Spark 1.2.1 独立集群完成了以下配置:
Hadoop 2.6.0 2 个节点 - 一个主节点和一个从节点 - 在独立集群中 3 节点 Cassandra 总核数:6(2 个主,4 个从) 总内存:13 GB我在独立集群管理器中运行 Spark:
./spark-submit --class com.b2b.processor.ProcessSampleJSONFileUpdate \
--conf num-executors=2 \
--executor-memory 2g \
--driver-memory 3g \
--deploy-mode cluster \
--supervise \
--master spark://abc.xyz.net:7077 \
hdfs://abc:9000/b2b/b2bloader-1.0.jar ds6_2000/*.json
我的工作正在成功执行,即从文件中读取数据并将其插入 Cassandra。
Spark 文档说,在独立集群中使用所有可用内核,但我的集群每个应用程序仅使用 1 个内核。此外,在 Spark UI 上启动应用程序后,它显示 Applications:0 running 和 Drivers:1 running.
我的查询是:
-
为什么不使用所有可用的 6 核?
为什么 spark UI 显示 Applications:0 Running?
代码:
public static void main(String[] args) throws Exception
String fileName = args[0];
System.out.println("----->Filename : "+fileName);
Long now = new Date().getTime();
SparkConf conf = new SparkConf(true)
.setMaster("local")
.setAppName("JavaSparkSQL_" +now)
.set("spark.executor.memory", "1g")
.set("spark.cassandra.connection.host", "192.168.1.65")
.set("spark.cassandra.connection.native.port", "9042")
.set("spark.cassandra.connection.rpc.port", "9160");
JavaSparkContext ctx = new JavaSparkContext(conf);
JavaRDD<String> input = ctx.textFile("hdfs://abc.xyz.net:9000/dataLoad/resources/" + fileName,6);
JavaRDD<DataInput> result = input.mapPartitions(new ParseJson()).filter(new FilterLogic());
System.out.print("Count --> "+result.count());
System.out.println(StringUtils.join(result.collect(), ","));
javaFunctions(result).writerBuilder("ks","pt_DataInput",mapToRow(DataInput.class)).saveToCassandra();
【问题讨论】:
【参考方案1】:如果您将应用中的 master 设置为本地(通过 .setMaster("local")
),它将无法连接到 spark://abc.xyz.net:7077
。
如果您使用spark-submit
命令设置,则无需在应用中设置master。
【讨论】:
有趣的事实。【参考方案2】:发生的事情是您认为您使用的是独立模式,默认情况下使用所有可用节点,但实际上以“本地”作为主节点,您使用的是本地模式。在本地模式下,即使您设置了 local[*],Spark 也将始终只使用 1 个核心,因为本地模式是一种非分布式单 JVM 部署模式。这也是为什么当您将主参数更改为“spark://abc.xyz.net:7077”时,一切都按预期进行。
【讨论】:
我不确定我是否在我拥有的至少一个应用程序中看到本地 [*] 限制为单个核心【参考方案3】:尝试将 master 设置为本地 [*],这将使用所有内核。
【讨论】:
我确实将 spark conf 中的 master 设置为 '.setMaster("local[*]")' ,但它也没有强制应用程序使用所有内核。 将主服务器设置为使用所有 CPU/内核与设置整个集群的行为不同。以上是关于为啥 Spark Standalone 集群不使用所有可用的内核?的主要内容,如果未能解决你的问题,请参考以下文章
Spark新手入门——3.Spark集群(standalone模式)安装
并非 Spark Standalone 集群中使用的所有节点
大数据平台实战(05)深入Spark Cluster集群模式YARN vs Mesos vs Standalone vs K8s