java使用spark 本地模式,性能很差甚至不如纯java代码是什么原因
SparkConf conf = new SparkConf()
.setAppName("MyApp")
.set("spark.executor.memory", "8g")
.set("spark.driver.memory", "8g")
.setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);
List<Integer> data=new ArrayList<>();
for (int i = 0; i < 20000000; i++) {
data.add(i);
}
System.out.println("开始");
long startTime = System.currentTimeMillis();
/*
for (int i = 0; i < 20000000; i++) {
int x=i*i;
}
*/
JavaRDD<Integer> rdd = sc.parallelize(data).map(x -> x * x);
System.out.println(rdd.count());
System.out.println("结束");
long endTime = System.currentTimeMillis(); // 获取方法结束时间
long executionTimeMillis = endTime - startTime; // 计算方法执行时间(毫秒)
double executionTimeSeconds = executionTimeMillis / 1000.0; // 转换为秒
System.out.println(executionTimeSeconds);
问题描述:最开始以为是spark的内存给的太少,通过set修改了内存大小,但是毫无影响,又做了对比测试,可以看到我代码中被注释掉的部分实现了同样的功能,都是求2次方。纯java输出的用时是0.02,而spark却用了20秒,而且通过任务管理器也发现spark代码部分在运行时CPU和内存占用都不高
版本说明:使用的是spark3.4.0的
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.12</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>