[英]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.