我对Spark有点新,并且正在努力理解它的系统和分布式行为。
我编写了如下的简单代码,并在spark版本2.0.1
上进行测试。
正如我所料,它运作良好。
但是,工作节点行为让我在这里有一个问题。
我有一个火花主控和四个工作节点。运行我的代码时,奇怪的是所有工作节点都不起作用。其中只有两个被分配并执行。而且,数据没有均匀地分布到两个工作节点中。总数据大约为700Mb,两个工作节点分配的数据大小分别为150Mb和550Mb。我希望它们具有相同的数据大小,但Spark自动让两个工作者具有不同的数据大小。
所以,我的问题如下。
运行spark-submit时如何使用所有工作节点?虽然使用两个工作节点更有效,但我想全部使用它们。
如何将数据均匀分布到四个节点?我不希望工作节点的数据大小不平衡。
下面是我的简单代码。这很简单,所以我没有详细解释。
任何帮助将不胜感激。感谢。
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* Created by dst on 2/1/17.
*/
public class Test {
public static void main(String[] args) throws Exception {
String inputFile = args[0];
String outputFile = args[1];
SparkConf conf = new SparkConf().setAppName("jrdd-dt-ctor")
.set("spark.serializer","org.apache.spark.serializer.KryoSerializer");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile(inputFile);
JavaRDD<String> newLine = lines.flatMap(new FlatMapFunction<String, String>() {
public Iterator<String> call(String s) throws Exception {
List<String> ret = new ArrayList<String>();
List<String> ls = Arrays.asList(s.split("\t"));
String values = ls.get(ls.size()-1);
List<String> value = Arrays.asList(values.split("\\|"));
for(int i=0;i<value.size();++i){
String ns = ls.get(0)+"\t"+ls.get(1)+"\t"+ls.get(2)+"\t"+ls.get(3)+"\t"+ls.get(4)+"\t"+ls.get(5);
ns = ns + "\t" + value.get(i);
ret.add(ns);
}
return ret.iterator();
}
});
newLine.saveAsTextFile(outputFile);
}
}