SparkCL 源码分析(一)

SparkCL-Example : SparkCLPi.java

主要代码:

    JavaSparkContext jsc = new JavaSparkContext(sparkConf);

    int count = (int) method.invoke(null,jsc, slices, sliceSize);

    System.out.println("Pi is roughly " + 4.0 * count / (sliceSize * slices) );

    jsc.stop();

slices arg[0]传参得到,是分布式数据集切分的份数,sparkcl默认为2, spark里会根据集群情况自动设定。
sliceSize arg[1]传参得到,是每份数据集的大小,默认为10 0000。
count是调用方法得到。
如果用户不在command line arg[2]传参调用方法,则默认执行:

runSparkCLMapVersion(JavaSparkContext jsc, int slices, final int sliceSize) 

runSparkCLMapVersion

生成RDD

    JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);

.parallelize函数可以使分布式数据集l别切分成slices块,生成RDD,如果按默认设置的话
其中l是list=[10 0000, 10 0000]
slices是 2

map

    JavaRDD<Integer> dataSet2 = SparkUtil.genSparkCL(dataSet).mapCL(kernel);

.mapCL(kernel)

    public <R> JavaRDD<R> mapCL(final SparkKernel<T,R> kernel) 
    {
        //funcX 
        Function<T,R> funcX = new Function<T,R>()
        {

            @Override
            public R call(T v1) throws Exception 
            {
                final SparkKernel<T,R> cachedKernel = (SparkKernel<T, R>) SparkCLCache.getInstance().tryGetCachedKernelVersion(kernel);
    cachedKernel.mapParameters(v1);
    exclusiveExecKernel(cachedKernel);
    return cachedKernel.mapReturnValue(v1);
            }

        };
        //这里真正map操作
        return (JavaRDD<R>) m_data.map(funcX);
    }

T, R 是泛型,可以指任意一种数据类型。
其中m_data的数据类型是

JavaRDDLike <T,?>  m_data;

funcX:
Declaration: Base interface for functions whose return types do not create special RDDs
1. 创建一个spark kernel 实例。(尽管在declaration的时候是抽象类型,但通过getinstance获得实例)
2. .mapParameters调用了aparapi.kernel。spark kernel是spark kernel base的子类,而spark kernel base 又是 kernel的子类。 spark kernel << spark kernel base << kernel. 此 kernel是aparapi.kernel.(以后会有对aparapi.kernel的解析)
3. .exclusiveExecKernel 是用来控制资源抢占,避免发生死锁的
4. .mapReturnValue 这个函数的实例化,就在runSparkCLMapVersion里,runSparkCLMapVersion一开始实例化了spark kernel, 然后自定义跑在kernel上面的任务。

SparkUtil.genSparkCL(dataSet)

public static <T> SparkCL<T> genSparkCL(JavaRDDLike<T,?> data)
    {
        return new SparkCL<T>(data);
    }

reduce

    int count = dataSet2.reduce(new Function2<Integer, Integer, Integer>() {
    @Override
    public Integer call(Integer integer, Integer integer2) {
        return integer + integer2;
            }
    });

Function2 <T1, T2, R>:
Declaration: A two-argument function that takes arguments of type T1 and T2 and returns an R.

发布了18 篇原创文章 · 获赞 2 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章