使用FlatMap函数

时间:2017-02-24 05:30:46

标签: apache-spark

我对Spark有点新,并且正在努力理解它的系统和分布式行为。

我编写了如下的简单代码,并在spark版本2.0.1上进行测试。

正如我所料,它运作良好。

但是,工作节点行为让我在这里有一个问题。

我有一个火花主控和四个工作节点。运行我的代码时,奇怪的是所有工作节点都不起作用。其中只有两个被分配并执行。而且,数据没有均匀地分布到两个工作节点中。总数据大约为700Mb,两个工作节点分配的数据大小分别为150Mb和550Mb。我希望它们具有相同的数据大小,但Spark自动让两个工作者具有不同的数据大小。

所以,我的问题如下。

  1. 运行spark-submit时如何使用所有工作节点?虽然使用两个工作节点更有效,但我想全部使用它们。

  2. 如何将数据均匀分布到四个节点?我不希望工作节点的数据大小不平衡。

  3. 下面是我的简单代码。这很简单,所以我没有详细解释。

    任何帮助将不胜感激。感谢。

    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);
        }
    }
    

0 个答案:

没有答案