为啥 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模式)安装

3天掌握Spark--Standalone集群

并非 Spark Standalone 集群中使用的所有节点

spark集群搭建

大数据平台实战(05)深入Spark Cluster集群模式YARN vs Mesos vs Standalone vs K8s

Java连接Spark Standalone集群