测量在Spark中执行combineByKey函数的持续时间

时间:2015-06-12 17:28:56

标签: apache-spark benchmarking

我想测量执行combineByKey函数所需的时间。我总是得到20-22 ms(HashPartitioner)和~350ms(没有pratitioning)的结果与下面的代码,独立于我使用的文件大小(file0:~300 kB,file1:~3GB,file2:~8GB)!这可能是真的吗?或者我做错了什么?

JavaPairRDD<Integer, String> pairRDD = null;
JavaPairRDD<Integer, String> partitionedRDD = null;
JavaPairRDD<Integer, Float> consumptionRDD = null;

boolean partitioning = true;    //or false
int partitionCount = 100;       // between 1 and 200 I cant see any difference in the duration!

SparkConf conf = new SparkConf();
JavaSparkContext sc = new JavaSparkContext(conf);

input = sc.textFile(path);
pairRDD = mapToPair(input);
partitionedRDD = partition(pairRDD, partitioning, partitionsCount);

long duration = System.currentTimeMillis();
consumptionRDD = partitionedRDD.combineByKey(createCombiner, mergeValue, mergeCombiners);
duration = System.currentTimeMillis() - duration;       // Measured time always the same, independent of file size (~20ms with / ~350ms without partitioning)

// Do an action
Tuple2<Integer, Float> test = consumptionRDD.takeSample(true, 1).get(0);

sc.stop();

一些辅助方法(无所谓):

    // merging function for a new dataset
private static Function2<Float, String, Float> mergeValue = new Function2<Float, String, Float>() {
    public Float call(Float sumYet, String dataSet) throws Exception {
        String[] data = dataSet.split(",");
        float value = Float.valueOf(data[2]);
        sumYet += value;
        return sumYet;
    }
};

// function to sum the consumption
private static Function2<Float, Float, Float> mergeCombiners = new Function2<Float, Float, Float>() {
    public Float call(Float a, Float b) throws Exception {
        a += b;
        return a;
    }
};

private static JavaPairRDD<Integer, String> partition(JavaPairRDD<Integer, String> pairRDD, boolean partitioning, int partitionsCount) {
    if (partitioning) {
        return pairRDD.partitionBy(new HashPartitioner(partitionsCount));
    } else {
        return pairRDD;
    }
}

private static JavaPairRDD<Integer, String> mapToPair(JavaRDD<String> input) {
    return input.mapToPair(new PairFunction<String, Integer, String>() {
        public Tuple2<Integer, String> call(String debsDataSet) throws Exception {
            String[] data = debsDataSet.split(",");
            int houseId = Integer.valueOf(data[6]);
            return new Tuple2<Integer, String>(houseId, debsDataSet);
        }
    });
}

1 个答案:

答案 0 :(得分:1)

web ui为您提供有关您的应用程序运行的作业/阶段的详细信息。它详细说明了每个时间,您现在可以过滤各种详细信息,例如调度程序延迟,任务反序列化时间和结果序列化时间。

webui的默认端口是8080.此处列出了已完成的应用程序,然后您可以单击该名称,或者创建如下所示的URL:xxxx:8080 / history / app- [APPID]以访问这些详细信息。

我不相信任何其他“内置”方法来监视任务/阶段的运行时间。否则,您可能希望更深入地使用JVM调试框架。

编辑:combineByKey是一个转换,这意味着它不会应用于您的RDD,而不是动作(请阅读更多RDD的{em> lazy 行为here,第3.1章)。我相信你观察到的时差来自SPARK在分区时创建实际数据结构所花费的时间。

如果有差异,你会在行动的时候看到它(在这里采取示例)