Spark 原理与实践|青训营笔记

51 阅读2分钟

这是我参加「第四届青训营」笔记创作活动的第4天

  1. 大数据处理引擎spark介绍
  • 应用:BI报表/实时大盘/广告/推荐
  • 计算:spark/FLink/Impala/ClickHouse/YARN/K8S
  • 存储:MetaStore/HDFS/kafka/TOS/Kudu/HBase
  • 数据:各种数据源
  1. spark工作原理
  • Application(应用):application中包含了一个驱动器(driver)进程和集群上的多个执行器(executor)
  • Driver program(驱动器):运行main()方法并创建sparkcontext的进程
  • Cluster Mananger(集群管理器):在集群上申请资源的外部服务(独立部署的集群管理器、mesos、yarn)
  • Work Node(工作节点):集群上运行应用程序代码的任意一个节点
  • Executor(执行器):在集群工作节点上为某个应用启动的工作进程,该进程负责运行计算任务,并为应用程序存储数据)
  • Task(任务):执行器的工作单元
  • Job(作业):一个并行计算作业,由一组task组成,并由spark的行动算子触发启动
  • Stage(阶段):每个Job可以划分为更小的task集合,每小组被称为stage
  1. 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() //返回新的数据类型
  1. 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执行流程
  • 内存管理
    • Executor
      • storage 存储内存(UnifiedMemoryManager统一管理多个并发Task的内存分配
      • Execution 执行内存
    • 动态调整可相互借用
    • Execution可驱逐storage但storage不可驱逐Execution
  1. codegen:从提高CPU的利用率的角度来进行runtime优化
  • Expression级别:表达式常规递归求值语法树
  • wholeStage级别:传统火山模型(火山模型把operator看作迭代器,每个迭代器提供一个next()接口)