如何加快火花中的分裂(弦)速度

时间:2017-06-13 13:55:01

标签: java apache-spark

我在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分钟)。

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

少数事情:

  1. 正如@Bohemian在评论中提到的那样,您应该在匿名类中编写静态字段static Pattern splitter = Pattern.compile("\t");然后String[] line = splitter.split(s));

  2. 可能并行化是错误的。这意味着您可能有太多或太少的分区或太多或太少执行程序。正如评论中所提到的,太多的执行程序可能成为瓶颈 - 在您的情况下,200个执行程序的数量非常高。我建议通过RDD.getNumPartitions()检查分区号 - 可能不大于200.请记住,每个执行程序都是一个新的JVM并将数据传输到其他JVM是非常慢的IO操作。如果你不知道你应该有多少执行者 - 不用担心! Spark为Dynamic Allocation