[英]spark repartition data for small file
我对Spark
很新,我使用的是一个主要用于paralellizing目的的集群。 我有一个100MB的文件,每行都由一些算法处理,这是一个非常繁重和漫长的处理。
我想使用10节点集群并并行化处理。 我知道块大小超过100MB
,我试图重新分区textFile
。 如果我理解的话,这种repartition
方法会增加分区的数量:
JavaRDD<String> input = sc.textFile(args[0]);
input.repartition(10);
问题是,当我部署到群集时,只有一个节点正在有效地处理。 如何管理并行处理文件?
更新1:这是我的spark-submit
命令:
/usr/bin/spark-submit --master yarn --class mypackage.myclass --jars
myjar.jar
gs://mybucket/input.txt outfile
更新2:分区后,基本上有2个操作:
JavaPairRDD<String, String> int_input = mappingToPair(input);
JavaPairRDD<String, String> output = mappingValues(int_input, option);
output.saveAsTextFile("hdfs://...");
mappingToPair(...)
位置
public JavaPairRDD<String, String> mappingToPair(JavaRDD<String> input){
return input.mapToPair(new PairFunction<String, String, String>() {
public Tuple2<String, String> call(String line) {
String[] arrayList = line.split("\t", 2);
return new Tuple2(arrayList[0], arrayList[1]);
}
});
}
和mappingValues(...)
是以下类型的方法:
public JavaPairRDD<String,String> mappingValues(JavaPairRDD<String,String> rdd, final String option){
return rdd.mapValues(
new Function<String, String>() {
// here the algo processing takes place...
}
)
}
这里可能存在多个问题:
repartition(10)
调用链接到您的流程中,因此它根本无效。 如果你替换这一行: input.repartition(10);
用这一个: input = input.repartition(10);
它将被使用,它应该将RDD分成多个,然后再继续下一步。 请注意,重新分区可以使您的流程更长,因为必须将数据拆分并传输到其他计算机,这可能很容易被慢速网络瓶颈。
使用客户端部署模式时尤其如此。 这意味着第一个执行程序(驱动程序)是您提交的本地Spark实例。 因此,它将首先从群集中将所有数据下载到驱动程序,然后在分区后将其上载回其他YARN节点。
我可以继续讨论这个问题,但我想说的主要是:如果你的算法很简单,那么进程甚至可以在一个执行器上运行得更快,而不是分区,传输,然后在所有执行器上运行算法平行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.