与textFile()相比,Spark binaryRecords()提供的性能更低

时间:2019-01-17 08:38:13

标签: apache-spark

我的火花作业代码如下。可以在群集上进行以下配置,效果很好。

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个执行程序上运行,而第二个代码仅使用一个。

没有建议为什么它变慢?

1 个答案:

答案 0 :(得分:0)

我发现了问题。 textFile()方法正在创建16 partitions(您可以使用RDD上的numOfPartitions方法检查getNumPartitions()),而binaryRecords()仅创建1(Java binaryRecords不提供重载)指定要创建的分区数的方法。

我通过在RDD上使用numOfPartitions方法在binaryRecords()创建的RDD上增加了repartition(NUM_OF_PARTITIONS)