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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值