- 分布式计算,数据尽量在本地计算,减少网络I/O
- 如果操作之间相互关系不大,则尽量采用分布式计算。
spark采用分布式计算中的master-slave模型,master对应含有master进程的节点,slave对应含有worker进程的节点。Client 负责提交应用,driver负责控制应用的执行。
基本组件
- Cluster manager是master节点,控制整个集群
- Worker: 计算节点
- Driver: 运行application 的main函数 并创建 spark context
- Executor: 用于启动线程池执行任务,每一个application拥有一组独立的 Executor
- Spark context: 整个应用的上下文,控制应用的生命周期
- RDD DAG: 一组RDD构成的有向无环图。当RDD遇到一个action算子时候,将之前所有的算子形成一个rdd graph. 并把这个rdd graph转化为job提交到cluster中执行
- Job. 一个Rdd Graph触发的作业。往往由Spark Context通过 runJob方法向spark 提交job
- DAG scheduler. 每个job会根据RDD DAG构建 Stage DAG, 并把stage交给 Task Scheduler。
- Task Scheduler: 将task 分发给 task scheduler
- SparkEnv: 线程级别的上下文
Spark Env包括以下几部分
- MapOutPutTracker: 负责 Shuffle元信息的存储
- BroadcastManager: 负责广播变量的控制和元信息的存储
- BlockManger: 负责存储管理,创建和查询块
- MetricsSystem: 监控运行时性能指标信息
- SparkConf: 负责存储配置信息
spark主要流程
- Client 提交应用给 master
- master启动一个worker来执行 driver
- driver生成 RDD Graph, 再由 DAG scheduler转化为 Stage DAG
- Dag scheduler提交 stage dag给task scheduler
- Task scheduler提交 task给excutor
RDD两种创建方式
- 从已有的rdd 转换生成
- 从hdfs中读取
RDD 相关
- 逻辑上的RDD的每个分区叫一个partition
- 一个变换将一个RDD变换成另外一个RDD,这些RDD之间通过Lineage产生依赖关系
- 分区只是一个逻辑概念,变换前和变换后的分区可能是同一块内存存储
- 有些RDD是计算的中间结果,不一定有物理的存储空间与之对应,如果需要迭代使用数据,可以调用cache()函数来缓存数据
- 在物理上,RDD对象实质上是一个元数据结构,存储着Block, Node等的映射关系,以及其他的元数据信息。
- 一个RDD就是一组分区,每个分区就是一个block。 block可以存储在内存中,如果内存不够时可以存储在磁盘上
Note: 如果是从HDFS等外部存储结构中读取数据,数据则按照HDFS中的数据分布策略进行数据分区,HDFS中的一个block对应spark的一个分区
- spark支持重分区,数据通过spark默认或者用户自定义的分区器进行分区,决定数据块分布在哪些节点上。
Transformation 算子
-
输入输出分区一对一型
- Map. 将原有的Rdd中的数据项通过用户自定的function map成新的元素。得到一个类型为MappedRDD的新RDD
- Flatmap. 将原有RDD中的元素通过函数f转换为新的元素,并将生成的RDD合并为一个集合。 得到一个类型为FlatMappedRDD的心RDD
- Map patitions. 获取每个分区的迭代器,在函数中通过这个分区整体的迭代器对整个分区进行操作。得到一个新的类型为MapPartitionsRDD 的新RDD
- Glom. glom函数将每个分区形成一个数组。得到一个新的GlommedRDD
-
输入和输出分区多对一
- Union.
- 保证两个RDD中的数据类型是相同的。
- 合并后类型和原有类型相同
- 不进行去重操作,如果想去重可以使用distinct
- ++ 相当于union操作
- Cartesian. 对两个集合的素有元素做笛卡儿积
-
输入输出多对多
- Groupby. 将元素按照function生成key,数据转化为key-value格式,之后将key相同的元素分为一组。
-
输出是输入分区的子集。
- Filter. 对元素应用function过滤。 生成一个新的filtered RDD
- Distinct。 将元素去重。
- Subtract. 将元素进行集合的差操作。
- Sample. 将RDD集合内的元素进行采样,获取子集。 用户可以指定采样方式。
- Takesample. 和sample类似,但是不指定采样的比例而是指定采样个数。
-
cache型算子
- Cache. 将RDD元素缓存到内存。相当于persist(MEMORY_ONLY).
- Persist. 对RDD进行缓存操作。数据缓存在什么地方,由storage level枚举类型决定。
Action 算子
- 无输出
- Foreach.
- SaveAsTextFile. 将数据输出,存储在指定的HDFS目录。
spark 笔记
原文:http://www.cnblogs.com/shexinwei/p/4614697.html