1. 在较高层次上,每个spark应用程序包含一个驱动程序,去调用用户的main函数,在集群上执行各种并行操作。spark主要的抽象,是提供了RDD数据类型。RDD数据类型是一组分割在集群上可以被并行操作的元素集合。RDD可以通过HDFS上的文件,驱动程序已有的集合,或对已有的RDD进行变换来创建。用户也可以将RDD持久化,保存在内存中,以被有效的重用。RDD也将自动从失败中恢复。spark的第二个抽象是可以被并行操作的共享变量。默认情况下,spark运行函数时,将在不同的节点上启动独立的任务。spark支持2类共享变量,广播变量,在每一个节点上保存一个值,累积变量支持累加操作。

2. spark初始化

spark应用程序首先应该创建JavaSparkContext对象

SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
JavaSparkContext sc = new JavaSparkContext(conf);

appname设置显示在集群UI上应用程序名,master是YARN集群的URL,或者字符串"local"表示运行本地模式。若采用spark-submit命令提交jar包,可由--master选项指定。

3. 创建RDD

RDD可以通过parallelizing一个驱动程序中已存在的集合,或者引用一个外部存储系统,如HDFS,HBase创建

List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
JavaRDD<Integer> distData = sc.parallelize(data, 20);

集合并行化的一个重要参数就是份数(slices),每一份数据将对应一个任务,spark默认会根据集群自动确定份数。

JavaRDD<String> distFile = sc.textFile("data.txt", 20);

如果文件名是本地文件系统,那么需要在所有工作节点的相同目录下拷贝一份数据,或者采用网络共享文件系统。所有的spark文件输入方法也支持目录,压缩文件,通配符。默认情况下一个分块(block)将对应一份(slice)。除了文本文件,spark还支持其它数据格式,如:JavaSparkContext.wholeTextFiles,SequenceFiles。

4. RDD操作支持两种,变换(transformation)根据已经存在的数据集产生一个新的数据集,动作(action)在RDD上运行计算并向驱动程序返回一个值。例如:map就是一个transformation,将所有的数据元素通过一个函数,结果返回一个新的RDD,reduce就是一个action,采用某个函数聚合所有元素,向驱动程序返回一个结果。所有的transformation操作在调用后,并不会立即执行,只有当某个action需要向驱动程序返回一个结果时,才执行。这样设计使得spark效率更高,例如在需要将一个RDD通过一个map,然后再使用reduce返回一个结果,这时就只需要向驱动程序返回reduce的结果,而不是更大的map后的数据集。默认RDD是不会一直存在于内存当中的,我们可以调用persist或cache方法持久化,也支持将RDD持久化入硬盘,或者备份到多个节点。

5. RDD transformation方法

map(T -> U)  filter(T -> Boolean)  flatMap(T -> Iterator<U>)  mapPartitions(Iterator<T> -> Iterator<U>)
mapPartitionsWithIndex((int,Iterator<T>) -> Iterator<U>)  ...