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.