一、RDD
spark未来的编程方向是DataSet或DataFrame,但是RDD是Spark 的基石、底层,所以必须要掌握
先看看github上的介绍:
https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala
或者我们可以从IDEA上的源码去了解,点击搜索图标,搜“RDD”
A Resilient Distributed Dataset (RDD) --弹性的分布式的数据集
弹性 分布式 数据集
二、RDD的五大特性,官网上没有的,只有去源码上去找,源码可以上IDEA下载
* Internally, each RDD is characterized by five main properties:
*
* - A list of partitions
* - A function for computing each split
* - A list of dependencies on other RDDs
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
对于关键类的关键方法一定要去看对应的注释。比如DataFrame,RDD,DataSet有时官网不一定齐全,一定要去源码上看。
RDD的五大特性?(参考我们的一个同学)
1)A list of partitions
RDD是一个由多个partition(某个节点里的某一片连续的数据)组成的的list;将数据加载为RDD时,一般会遵循数据的本地性(一般一个hdfs里的block会加载为一个partition)。
2)A function for computing each split
RDD的每个partition上面都会有function,也就是函数应用,其作用是实现RDD之间partition的转换。另外补充一点,在spark里面,partition就是等于task,有几个partition就有几个task。
3)A list of dependencies on other RDDs
RDD会记录它的依赖 ,为了容错(重算,cache,checkpoint),也就是说在内存中的RDD操作时出错或丢失会进行重算。
RDDA =map=>RDDB==>RDDC
4)Optionally,a Partitioner for Key-value RDDs
可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面
5)Optionally, a list of preferred locations to compute each split on
最优的位置去计算,也就是数据的本地性。
RDD的五大特性介绍完了,现在来看看RDD类
abstract class RDD[T: ClassTag](
@transient private var _sc: SparkContext,
@transient private var deps: Seq[Dependency[_]]
) extends Serializable with Logging
抽象类(abstract)RDD,要用子类来实现
按照正常的写法应该是with Werializable with Logging,但是在Scala里面,第一个可以用继承extends,后面的用with。。。
三、RDD里面有5个很重要的方法,对应RDD的5大特性
1、protected def getPartitions: Array[Partition]
对应于五大特性里面的第一个
2、def compute(split: Partition, context: TaskContext): Iterator[T]
partition就是等于task,有几个partition就有几个task。对应于五大特性里面的第二个
3、protected def getDependencies: Seq[Dependency[_]] = deps
4、val partitioner: Option[Partitioner] = None
5、protected def getPreferredLocations(split: Partition): Seq[String] = Nil
那个Nil就是指空的List。
四、SparkContext
指Spark上下文,什么是上下文,就是什么东西都往里面装。
* Configuration for a Spark application. Used to set various Spark parameters as key-value pairs.
*
* Most of the time, you would create a SparkConf object with `new SparkConf()`, which will load
* values from any `spark.*` Java system properties set in your application as well. In this case,
* parameters you set directly on the `SparkConf` object take priority over system properties.
要创建SparkContext,必须要先创建SparkConf,SparkConf底层的数据结构其实是map。
创建SparkConf就用new SparkConf()就可以创建了,而且是以spark.*开头的,
spark.* <= SparkConf ,自定义参数必须是以spark开头的,spark是不认的。
object SparkContextApp {
//RDD编程的模型:第一步是创建sparkConf,第二步创建sparkContext,然后吧sparkConf传到sparkContext,第三业务代码,第四是关闭
def main(args: Array[String]): Unit = {
//最好就是在SparkContext创建之前,就创建sparkConf,跟着把sparkConf传到SparkContext
//step 1
val sparkConf=new SparkConf().setMaster("local[2]").setAppName("SparkContextApp") //必须要设置URL和名字
//step 2
val sc=new SparkContext(sparkConf)
//TODO....step 3
//step 4
sc.stop()
}
}
这个错可以忽略掉。