为什么火花作业只使用一个执行器?

时间:2015-09-23 16:18:26

标签: java amazon-ec2 apache-spark

为什么我的火花作业最终只能在一台机器上执行?我正在使用大约250MB(51k行)数据的映射函数,我期望在所有节点中看到活动,但是spark UI仅在我的集群的三个节点之一上显示活动。我用来调用我的应用程序的脚本如下:

spark-submit \
--class sparkUtils.DistributedParse \
--master spark://ip-172-31-27-55:7077 \
--executor-memory 4G \
bin/DistributedParse.jar \
<parameters>

我尝试过使用--deploy-mode cluster,但执行失败了,当使用--total-executor-cores 3标志时,它没有任何区别。但是,根据spark documentation,我的情况应该使用独立模式,这与此描述相符:“常见的部署策略是从与您的工作机器物理位置相同的网关机器提交您的应用程序(例如,独立EC2集群中的主节点)。在此设置中,客户端模式是合适的。“

我的Java代码类似于:

SparkConf sparkConf = new SparkConf().setAppName("DistributedParse");
JavaSparkContext context = new JavaSparkContext(sparkConf);     

/* read and parse custom-delimited multiline text file */
Configuration conf = new Configuration();
conf.set("textinputformat.record.delimiter", "WARC/1.0");

JavaRDD<Text> records = context.newAPIHadoopFile(args[0], TextInputFormat.class, LongWritable.class, Text.class, conf).values();

final int urlPosition = 47;
...
ArrayList<String> importedNames = fillFromFile("./names.txt");

final Broadcast<ArrayList<String>> names = context.broadcast(importedNames);

records.flatMapToPair(new PairFlatMapFunction<String, String, String>() {

    @Override
    public Iterable<scala.Tuple2<String,String>> call(final String record) {

        ArrayList<Tuple2<String,String>> url_nameEdge = new ArrayList<Tuple2<String,String>>();

        for(String name: names.value()){
            if( record.toLowerCase().contains(name.toLowerCase()) )
                url_nameEdge.add(  new Tuple2<String,String>( record.substring(urlPosition, record.indexOf(" ", urlPosition+1)) , name )  );
        }

        return url_nameEdge;
    }
}).saveAsTextFile(outputFolder);

1 个答案:

答案 0 :(得分:2)

我发现我的问题来自singleLineRecords RDD,它是使用自定义Hadoop文件格式定义的,用于解析多行分隔文件。通过将Hadoop配置上的conf.set("mapred.max.split.size", "10000000");设置为接近10MB的值,我有18个任务,每个工作者运行6个任务!