java - 运行 spark 作业时 cpu 使用率低

标签 java apache-spark cpu-usage

我正在运行 Spark 作业。我有 4 个内核和工作内存设置为 5G。 Application master 在同一网络中的另一台机器上,并且不托管任何 worker。这是我的代码:

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 缓存。

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

为什么 CPU 消耗在 worker 上低,而在 master 上高?

最佳答案

  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。

关于java - 运行 spark 作业时 cpu 使用率低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44972633/

相关文章:

java - 帮助使用 Facebook REST API - 使用 HttpClient (Java) 发送通知。

java - Spring Boot 应用程序中未调用调度程序作业

java - 当 ListView 中有多个项目时,读取所选项目的文本

hadoop - 我在哪里可以找到 spark.hadoop.yarn.* 属性?

c - 如何减少自己的 C 程序的 CPU 使用率

java - 通过 ASM 为注入(inject)的字节代码添加 try-catch block

java - Spark在java中提交(SparkLauncher)

ubuntu - 错误 : Could not find or load main class com. install4j.runtime.launcher.Launcher

c# mono 获取线程的cpu使用率

google-chrome - 为什么页面上的 SVG 图片会导致 Chrome 使用 100% 的 CPU?