我的火花作业代码如下。可以在群集上进行以下配置,效果很好。
String path = "/tmp/one.txt";
JavaRDD<SomeClass> jRDD = spark.read()
.textFile(path)
.javaRDD()
.map(line -> {
return new SomeClass(line);
});
Dataset responseSet = sparkSession.createDataFrame(jRDD, SomeClass.class);
responseSet.write()
.format("text")
.save(path + "processed");
如果我要读取二进制文件(与文本大小相同),则需要更多时间。
String path = "/tmp/one.txt";
JavaRDD<SomeClass> jRDD = sparkContext
.binaryRecords(path, 10000, new Configuration())
.toJavaRDD()
.map(line -> {
return new SomeClass(line);
});
Dataset responseSet = spark.createDataFrame(jRDD, SomeClass.class);
responseSet.write()
.format("text")
.save(path + "processed");
下面是我的配置。
driver-memory 8g
executor-memory 6g
num-executors 16
具有150 MB文件的第一个代码花费的时间为1.30分钟。 具有150 MB文件的第二个代码花费的时间为4分钟。
另外,第一个代码能够在所有16个执行程序上运行,而第二个代码仅使用一个。
没有建议为什么它变慢?
答案 0 :(得分:0)
我发现了问题。 textFile()
方法正在创建16 partitions
(您可以使用RDD上的numOfPartitions
方法检查getNumPartitions()
),而binaryRecords()
仅创建1(Java binaryRecords不提供重载)指定要创建的分区数的方法。
我通过在RDD上使用numOfPartitions
方法在binaryRecords()
创建的RDD上增加了repartition(NUM_OF_PARTITIONS)
。