我在HDFS上有一个大型数据集(480k +记录),我想用\ t分割每条记录。
这是我的代码:
static JavaPairRDD<String, String> load(JavaSparkContext sc, String path) throws Exception {
JavaRDD<String> wholeData = sc.textFile(path);
JavaPairRDD<String, String> wholeDataRDD = wholeData.mapToPair(new PairFunction<String, String, String>() {
public Tuple2<String, String> call(String s) throws Exception {
List<String> line = Arrays.asList(Pattern.compile("\t").split(s));
return new Tuple2<String, String>(line.get(0), line.get(1));
}
});
return wholeDataRDD;
}
上面的代码可以工作,但速度太慢(大约9分钟)。
感谢您的任何建议
答案 0 :(得分:0)
少数事情:
正如@Bohemian在评论中提到的那样,您应该在匿名类中编写静态字段static Pattern splitter = Pattern.compile("\t");
然后String[] line = splitter.split(s));
可能并行化是错误的。这意味着您可能有太多或太少的分区或太多或太少执行程序。正如评论中所提到的,太多的执行程序可能成为瓶颈 - 在您的情况下,200个执行程序的数量非常高。我建议通过RDD.getNumPartitions()
检查分区号 - 可能不大于200.请记住,每个执行程序都是一个新的JVM并将数据传输到其他JVM是非常慢的IO操作。如果你不知道你应该有多少执行者 - 不用担心! Spark为Dynamic Allocation