Spark 学习笔记 (一): 初探Spark 程序设计RDD
本文主要剖析分布式计算的框架的设计与实现
一、 RDD
RDD是Spark中最核心的概念
1.初识RDD --- Resilient Distributed Datasets 弹性分布式数据集
- 数据集:RDD是数据集合的抽象,分布在集群中的只读对象的集合
- 一个RDD由多个Partition构成,也就是一个RDD被分区成Partiton存在不同节点上
- 一个Partition可以存储在此磁盘或内存中
- 通过并行transform操作进行一个RDD到另一个RDD的转换
- 分布式:
- Partition 是分布式存储的
- 数据的计算是多个节点协同计算得到的
弹性:RDD 可以在不改变内部存储数据记录的前提下,去调整并行计算计算单元的划分结构,弹性这一特性,也是为并行计算服务的
容错性:分布式的一般问题是需要具有容错性,那么RDD本身是具有容错性的,
RDD 内部的数据集合在逻辑上和物理上被划分成多个小子集合Partition,这样的每一个子集合我们将其称为分区,分区的个数会决定并行计算的粒度,而每一个分区数值的计算都是在一个单独的任务Task中进行,因此并行任务的个数,也是由 RDD分区的个数决定的
Partition -> Task
2. Spark运行模式
先放个图,看下Spark整体程序是怎么执行的
整个集群分为 Master 节点和 Worker 节点,相当于 Hadoop 的 Master 和 Slave 节点
Master 节点上常驻 Master 守护进程,负责管理全部的 Worker 节点
Worker 节点上常驻 Worker 守护进程,负责与 Master 节点通信并管理 executors
Driver 官方解释是 “The process running the main() function of the application and creating the SparkContext”。 Application 就是用户自己写的 Spark 程序(driver program)
扫描二维码关注公众号,回复: 4944428 查看本文章每个 Worker 上存在一个或者多个 ExecutorBackend 进程。每个进程包含一个 Executor 对象,该对象持有一个线程池,每个线程可以执行一个 task。
3.Spark程序设计
- Scala基础
- 用函数式编程的方式可以很方便处理集合:
var list = List(1, 2, 3) list.foreach(println)
Spark 的RDD,封装了各种类似于Scala集合的算子
map、filter、reduce
等,且都是分布式执行的
- Spark程序设计基本流程
创建SparkContext对象:定义了Spark执行环境和配置参数;注意每个Spark程序有且仅有一个SparkContext
- 创建RDD:从Scala集合或者在Hadoops数据集上创建
- (1) 从Scala集合映射成RDD:
sc.parallelize()
创建,第二个参数是Partition数目
val slices = 10 //Partition数目,即并行的task数目启动10个map task进行处理 val n = 100000 * slices val count = sc.parallelize(1 to n, slices).map { i => val x = random * 2 - 1 val y = random * 2 - 1 (x*x + y*y < 1) 1 else 0 }.reduce(_ + _)
- (2) 将本地文件/HDFS文件映射成RDD:
- (1) 从Scala集合映射成RDD:
- 在RDD上进行转换和action
- Spark提供了很多action
返回结果:保存到HFDS或者Hive