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.