本文主要剖析分布式计算的框架的设计与实现
RDD是Spark中最核心的概念
弹性:RDD 可以在不改变内部存储数据记录的前提下,去调整并行计算计算单元的划分结构,弹性这一特性,也是为并行计算服务的
容错性:分布式的一般问题是需要具有容错性,那么RDD本身是具有容错性的,
RDD 内部的数据集合在逻辑上和物理上被划分成多个小子集合Partition,这样的每一个子集合我们将其称为分区,分区的个数会决定并行计算的粒度,而每一个分区数值的计算都是在一个单独的任务Task中进行,因此并行任务的个数,也是由 RDD分区的个数决定的
Partition -> Task
先放个图,看下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)
每个 Worker 上存在一个或者多个 ExecutorBackend 进程。每个进程包含一个 Executor 对象,该对象持有一个线程池,每个线程可以执行一个 task。
var list = List(1, 2, 3)
list.foreach(println)
Spark 的RDD,封装了各种类似于Scala集合的算子
map、filter、reduce
等,且都是分布式执行的
创建SparkContext对象:定义了Spark执行环境和配置参数;注意每个Spark程序有且仅有一个SparkContext
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(_ + _)
返回结果:保存到HFDS或者Hive
Spark 学习笔记 (一): 初探Spark 程序设计RDD
原文:https://www.cnblogs.com/shawshawwan/p/10279673.html