【发布时间】: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