Spark 最重要的是 RDD,SparkSQL、SparkStreaming是构建在 RDD 之上的。
一、什么是 RDD
RDD:Resilient Distributed Dataset 弹性、分布式、数据集
它在源码中为:
abstract class RDD[T:ClassTag](
@transient private var _sc:SparkContext,
@transient private var deps:Seq[Dependency[_]]
)extends Serializable with Logging
说明:1)RDD 是一个抽象类,不能直接使用,需要在它的子类中实现它的方法;
2)带泛型,可以支持多种类型,比如:String、Person、User
官网里面有描述它的一段话:Represents an immutable(不可变的) partitioned collection of elements(集合里面的元素是可以分区的,比如Array(1,2,3,4,5,6,7,8,9,10) 可以分为 3 个分区(1,2,3)、(4,5,6)、(7,8,9,10)) that can be operated on in parallel(可以并行计算).
二、RDD 的特性
(1)一个 RDD 由一系列的分区/分片(partitions)组成;
(2)对一个 RDD 执行一个函数,就是对 RDD 上面的所有分区执行同一个函数;
(3)依赖关系:A list of dependencies on other RDDs
如 rdd1 通过某个方法生成 rdd2,rdd2 通过某个方法生成 rdd3,rdd3 通过某个方法生成 rdd4,则说明 rdd4 是依赖 rdd3、rdd2、rdd1等等一系列 rdd,则若 rdda = 5 个 partition,通过 ==>map 计算之后得到 rddb = 5 个 partition
(4)(Optionally),a Partitioner for key-value RDDs(eg. To say that the RDD is hash-partitioned)
(可选地)对于有 key-value 的 RDDs 的分区规则;
(5)(Optionally),a list of preferred locations to compute each split on(e.g. block locations for an HDFS file)
(可选地)数据在哪里,优先把作业调度到数据所在的节点进行计算:移动数据不如移动计算
五大特性源码体现:
(1)protected def getPartitions:Array[Partition] ----对应第一个特性
(2)def compute(split:partition, context: TaskContext): Iterator[T] ----对应第二个特性
(3)protected def getDependencies: Seq[Dependency[__]]=deps ---对应特性三
(4)@transient val partitioner:Option[Partitioner] = None ---对应特性四
(5)protected def getPreferredLocations(split:Partition):Seq[String] = Nil ---对应特性五
三、RDD 图解
这里参考虾神的博客:https://blog.csdn.net/allenlu2008/article/details/86668253
虾神博客写得很好,这里面就不再赘述了。
四、SparkContext&SparkConf 详解
第一要务:创建 SparkContext
连接到 Spark“集群”:不一定是集群,Spark 也可以运行 local(运行在本地)、standalone(可以用很多个节点)、yarn、mesos这几种模式;通过 SparkContext 来创建 RDD、广播变量到集群;
在创建 SparkContext 之前还需要创建一个 SparkConf 对象:
conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)
//例如可以这样设置:conf.setMaster(“local”).setAppName(“My app”)
提交 PySpark 应用程序(在 $SPARK_HOME/bin目录下)
./spark-submit --master local[2] --name spark0301 /home/hadoop/script/spark0301.py
具体提交的详细说明参见:http://spark.apache.org/docs/latest/submitting-applications.html