Spark-core概念补充
Spark相对于hadoop的优势
1.减少IO(如非必要不落盘)
2.并行度(多线程)
3.中间结果持久化(多次使用)
4.shuffle方案(不排序)
5.内存管理(静态内存,动态内存,内存可配置)
概念
Master节点,协调资源,连接worker节点运行Exxcutor。是协调节点
Worker节点,是spark集群中的计算节点,用于和Master交互并管理Executor
job提交后创建SparkContext worker启动对应的Executor
ExecutorBackend :worker通过ExecutorBackend 进行控制,、是一个进程,只有一个Executor对象
一个Worker上存在一个或者多个 ExecutorBackend 进程
Executor:和Driver保持交互认领自己的任务
闭包:函数携带了一个外包的作用域,这个函数就是闭包。
闭包就是函数 闭包就是对象
逻辑执行图
HadoopRDD的partations对应了HDFS的Blocks,通过InoutFormat来确定Hadoop中Block的位置和边界
HadoopRDD存放的是一个元组 (行号,Text对象) 通过map算子转为String一行行的数据
map算子:
就是生成一个MapPartationsRDD compute函数处理
每个计算的含义就是将一个分区上的所有数据当做一个集合,通过map函数计算
传入的函数会被处理闭包中的依赖,使得这闭包可以被序列化发往别的节点
RDD三个属性:分区列表,依赖关系(getDependencies 函数),计算函数,分区函数,最佳位置
宽窄依赖判断:shuffle关系
NarrowDependency窄依赖 ShuffleDependency宽依赖 OneToOneDependency一对一依赖 RangeDependency区间依赖
宽依赖:把分区拆开,发送给下游不同的分区。 一对一一定是窄依赖 多对一不一定是宽依赖(笛卡尔积)
RDD之间的关系其实是:文件分区之间的关系
窄依赖的类别:
RangeDependency:只有union使用 多对一窄依赖:coalesce
需要分析依赖关系的原因:看看RDD能否放在同一个流水线上执行(窄依赖可以放到一个task中运行)
物理执行图
采用数据流动,分阶段运行,从后往前划分宽窄依赖
数据计算发生在Action上,没有数据找父RDD要数据
最终按照taskset调度的
checkpoint 使用
val sparkconf = new SparkConf().setAppName("test_Spark_sql").setMaster("local[2]")
val spark = SparkSession.builder().config(sparkconf).config("spark.driver.host", "localhost").getOrCreate().sparkContext
spark.setCheckpointDir("/hdfs/")
val data = spark.makeRDD(Array(("A", 88.0), ("B", 95.0), ("C", 91.0),("D", 93.0))).cache() //建议先cache在checkpoint
data.checkpoint()
标签:闭包,core,依赖,函数,补充,节点,Spark,spark
From: https://www.cnblogs.com/wuxiaolong4/p/16628382.html