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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章