这是我参加「第四届青训营」笔记创作活动的第4天
- 大数据处理引擎spark介绍
- 应用:BI报表/实时大盘/广告/推荐
- 计算:spark/FLink/Impala/ClickHouse/YARN/K8S
- 存储:MetaStore/HDFS/kafka/TOS/Kudu/HBase
- 数据:各种数据源
- spark工作原理
- Application(应用):application中包含了一个驱动器(driver)进程和集群上的多个执行器(executor)
- Driver program(驱动器):运行main()方法并创建sparkcontext的进程
- Cluster Mananger(集群管理器):在集群上申请资源的外部服务(独立部署的集群管理器、mesos、yarn)
- Work Node(工作节点):集群上运行应用程序代码的任意一个节点
- Executor(执行器):在集群工作节点上为某个应用启动的工作进程,该进程负责运行计算任务,并为应用程序存储数据)
- Task(任务):执行器的工作单元
- Job(作业):一个并行计算作业,由一组task组成,并由spark的行动算子触发启动
- Stage(阶段):每个Job可以划分为更小的task集合,每小组被称为stage
- spark core
- def getPartition:Array[partition]... //分区列表,分区决定并行计算数量
- def computelsplit:Partition... //计算
- def getDependecies: Seq[Dependency[]]... //前后依赖
- val partition: Option[Partition]... // Hash或Region,key-value才有分区
- def getPreferredLocations(split:Partition)... //将计算分到需要处理的数据块的存储位置
- //算子(成员函数)
- def map (f:T=>V): RDD[V] //返回RDD
- def fliter (f:T=>Boolean): RDD[i]
- def cache()
- def persist() //存储
- def count() //返回新的数据类型
- RDD
- 创建RDD
- 内置RDD
- 自定义RDD
- RDD依赖
- 窄依赖:父RDD的每个Partition至多对应一个子RDD分区
- OneToOneDependency:override def getParents(partitionld:Int):List[Int]=List(partitionld)
- NarrowDependency:def getParents (partitionld:Int):Seq[Int]
- RangeDependency:override def getParents(partitionld:Int):List[int]=if(partitionld >= outStart && partitionld < outStart+lengh)List(partitionld-outStart+Instart)
- PrueDependency
- 宽依赖:父RDD的每个Partition都可能对应多个子RDD分区
- shuffleDependency
- 窄依赖:父RDD的每个Partition至多对应一个子RDD分区
- RDD执行流程
- 内存管理
- Executor
- storage 存储内存(UnifiedMemoryManager统一管理多个并发Task的内存分配
- Execution 执行内存
- 动态调整可相互借用
- Execution可驱逐storage但storage不可驱逐Execution
- Executor
- codegen:从提高CPU的利用率的角度来进行runtime优化
- Expression级别:表达式常规递归求值语法树
- wholeStage级别:传统火山模型(火山模型把operator看作迭代器,每个迭代器提供一个next()接口)