【问题标题】:Low cpu usage while running a spark job运行火花作业时 CPU 使用率低
【发布时间】:2017-12-11 20:40:36
【问题描述】:

我正在运行 Spark 作业。我有 4 个内核和工作内存设置为 5G。应用程序主机位于同一网络中的另一台机器上,并且不托管任何工作人员。这是我的代码:

private void myClass() {
    // configuration of the spark context
    SparkConf conf = new SparkConf().setAppName("myWork").setMaster("spark://myHostIp:7077").set("spark.driver.allowMultipleContexts", "true");
    // creation of the spark context in wich we will run the algorithm
    JavaSparkContext sc = new JavaSparkContext(conf);

    // algorithm
    for(int i = 0; i<200; i++) {
        System.out.println("===============================================================");
        System.out.println("iteration : " + i);
        System.out.println("===============================================================");
        ArrayList<Boolean> list = new ArrayList<Boolean>();
        for(int j = 0; j < 1900; j++){
            list.add(true);
        }
        JavaRDD<Ant> ratings = sc.parallelize(list, 100)
                    .map(bool -> new myObj())
                    .map(obj -> this.setupObj(obj))
                    .map(obj -> this.moveObj(obj))
                    .cache();
        int[] stuff = ratings
                    .map(obj -> obj.getStuff())
                    .reduce((obj1,obj2)->this.mergeStuff(obj1,obj2));
        this.setStuff(tour);

        ArrayList<TabObj> tabObj = ratings
                    .map(obj -> this.objToTabObjAsTab(obj))
                    .reduce((obj1,obj2)->this.mergeTabObj(obj1,obj2));
        ratings.unpersist(false);

        this.setTabObj(tabObj);
    }

    sc.close();
}

当我启动它时,我可以在 Spark UI 上看到进度,但它真的很慢(我必须将并行化设置得相当高,否则我会遇到超时问题)。我以为是CPU瓶颈,但是JVM CPU消耗其实很低(大部分时候是0%,有时候超过5%……)。

根据监控,JVM正在使用大约3G的内存,缓存只有19M。

主控主机有 4 个核心,内存较少 (4G)。那台机器显示 100% 的 CPU 消耗(一个完整的核心),我不明白为什么这么高......它只需将分区发送给另一台机器上的工作人员,对吗?

为什么 Worker 的 CPU 消耗低,而 Master 的 CPU 消耗高?

【问题讨论】:

  • 检查分区数和任务数。可能在某个步骤后您的分区号错误
  • 号码错误是什么意思?实际上,这是一个分区号问题,因为对于一个小数据集我没有任何问题,因为我可以将并行度设置为 10(对于 4 个内核来说可以),但是对于一个更大的数据集,我需要更多的任务(否则,我有一个超时,如果我将超时设置得更高,我会遇到另一个奇怪的错误......)然后它就这样崩溃了。

标签: java apache-spark cpu-usage


【解决方案1】:
  1. 确保您已通过 Yarn 或集群中的 mesos 提交 Spark 作业,否则它可能仅在您的主节点中运行。

  2. 由于您的代码非常简单,因此完成计算应该非常快,但我建议使用 wordcount 示例尝试读取几 GB 的输入源来测试 CPU 消耗情况。

  3. 请使用 "local[*]" 。 * 表示使用你的所有核心进行计算

    SparkConf sparkConf = new SparkConf().set("spark.driver.host", "localhost").setAppName("unit-testing").setMaster("local[*]"); 参考文献:https://spark.apache.org/docs/latest/configuration.html

  4. 在 spark 中有很多东西会影响 CPU 和内存的使用,例如执行器和您希望分配的每个 spark.executor.memory。

【讨论】:

  • 我认为我没有配置错误,因为使用较小的数据集一切都很好,而且我的内存使用量似乎真的低于最大工作内存。在本地模式下,它可以工作,但我只想在集群上使用它。我的代码并不简单,因为在设置和移动功能中,有一个机器学习算法可以迭代 100000 次。如果我不使用并行计算,它可以持续超过 45 分钟。我使用的是独立模式,你是对的,Spark 开发人员建议使用纱线。这应该是我的问题的原因......
  • 您的 HDFS 中有单个大数据集吗?或者有多个可以被每个节点读取的小文件?
  • 还要检查集群中的执行器,确保每个节点的机器上都有执行器运行。
  • 我的数据集真的很小,只是一些Mo。但是我在数据集中迭代了很多次(在计算开始时保存在内存中)。我正在做一些 Q 学习的东西,所以我必须创建大量数据才能让我的参数收敛到一个聪明的解决方案中。在 UI 上,我可以看到每台机器都有一个执行程序,有 4 个可用内核和 5 个 Go 可用。当它停止快速运行并且从机上cpu使用率下降到0%时,这些从机上的内存使用量约为2.3Go。(根据从机的任务管理器)
  • 您能尝试将数据持久化到 RDD 内存并尝试使用更复杂的算法来计算这些数据吗?检查 CPU 的差异。
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多