学习笔记-Spark

Spark运行模式Yarn有两种:
  1. yarn-cluster。适合于生产模式
  2. yarn-client。适合于交互和调试

mapreduce 是多进程的方式来去并发执行,而 spark 是依赖于多线程的方式来去并发执行

cluster和client模式的区别:
  1. 本质是AM进程的区别,cluster模式下,driver运行在AM中,负责向Yarn申请资源,并监督作业运行状况,当用户提交完后,就关掉client,作业会继续在yarn上运行,然而cluster模式不适合交互类型作业。而client模式,AM仅向yarn请求executor,client会和请求的container通信来调度任务,即client不能离开

Spark:
  1. Application:spark-submit提交的程序
  2. Driver:完成任务的调度以及executor和cluster manager进行协调
  3. Executor:每个Spark executor作为一个Yarn容器(container)运行
  4. Job:和MR中Job不一样,MR中的Job主要是Map或者是Reduce Job 而spark中的Job其实很好区别,一个action算子就算一个Job,比如说:count,first
  5. Task:是Spark中最新的执行单元,RDD一般是带有partitions的,每个partition在一个executor上执行,可以认为是一个Task
  6. Stage:是spark中独有的,一般而言一个Job会切换成一定数量的stage,各个stage之间按照顺序执行

多进程:方便控制资源,因为独享进程空间,但是消耗更多的启动时间,不适合运行那些低延时作业,导致MapReduce时效性差
多线程:spark的运行方式所以spark适合低启动延迟类型的作业,任务速度快,同节点上的任务由于在一个进程中,所以共享内存(适合内存密集型任务),同节点上所有任务运行在JVM(Executor)进程里面,适合Executor所占资源被多批任务调用

Spark:
  1. 应用程序:有一个driver program和多个job构成
  2. Job :由多个stage组成
  3. stage:对应一个taskset
  4. Taskset 对应一组关联的相互之间没有shuffle依赖关系的task组成
  5. task最小的工作单元


spark 分布式并行计算框架,下一代MapReduce,扩展了mr的数据处理流程
  1. executor都是装在在container里运行,container默认内存1G
  2. executor分配的内存是executor-memory,向YARN申请内存是executor-memory*num-executors
  3. AM在spark中叫driver,AM向RM申请的是executor资源,当分配完资源后,executor启动后,由spak的AM向executor分配task,分配多少task,分配到哪个executor由AM决定,可以理解为spark也有个调度过程,这些task都运行在executor的坑里
  4. Executor有线程池多线程管理这些坑内的task
spark 解决的问题:
    最大化利用内存cache,中间结果放内存,加速迭代
    某结果集放内存,加速查询满的问题 
Driver Program:
  1. spark任务的核心组件
  2. 构建sparkContext(spark集群的入口,创建需要变量,还包含集群的配置信息)
  3. 将用户的job转换为DAG图(类似数据处理 的流程图)
  4. 根据策略将DAG图划分为多个stage,根据分区从而生成一系列的tasks
  5. 根据tasks要求向RM申请资源
  6. 提交任务并检测任务的状态

spark任务来说最终的目标是action(可以是save,也可以是collect)
spark 核心:
  1. RDD(Resilient Distributed Dataset )弹性分布式数据集(相当于集合),它的本质是数据集的描述(只读的,可分区的分布式数据集),而不是数据集本身,是有分区信息的数据集,具有一个懒惰性,尽量避免用shuffle的算子,不包含待处理的数据,真正的数据只有在执行的时候才加载进来,加载数据主要有两个来源:spark 内部 —》HDFS ,spark外部 —》
  2. RDD的关键特征
    1. 懒操作:延迟计算,action时候才操作
    2. 瞬时性,用时才产生,用完就释放
    3. RDD使用户能够显式将计算结果保存在内存中,控制数据的划分,并使用更丰富的操作集合来处理
    4. 使用更丰富的操作来处理,只读(由一个RDD变换得到另外一个RDD,但是不能对本身)
    5. 记录数据的变换为不实数据本身保证容错(lineage)
  3. spark允许从四个方面构建RDD
    1. 共享文件系统
    2. 通过现有RDD转换
    3. 定义一个scala数组
    4. 有一个已经存在的RDD通过持久化操作生成
  4. spark针对RDD提供两种操作:
    1. transformations 是RDD之间的变换,采用懒策略,仅在对相关的RDD进行action提交时才触发计算
    2. action 会对数据执行一定的操作
  5. 每个RDD包含了数据分块/分区(partition)的集合,每个partition是不可分割的
  6. 与父RDD的依赖关系(RDDA —》 RDDB),spark内部数据更多的是通过还原的方式进行数据恢复,
    1. 宽依赖 宽依赖的数据恢复会很慢,宽依赖的这些算子好不容易通过计算才能得到的数据,若丢失,恢复起来比较慢,所以会做一次缓存备份下来(因为它需要依赖于上游所有的节点都给你准备就绪,它这个数据才能够得到
    2. 窄以来 窄依赖的数据恢复会很快,因为这个流程很清楚是从哪里来的,通过计算把丢失的找到就行 
  7. 每个partition的计算就是一个task ,task是调度的基本单位
  8. 若一个stage包含其他stage中的任务已经全部完成,这个stage中的任务才会被加入调度
  9. 遵循数据局部性原则,使得数据传输代价最小 

猜你喜欢

转载自blog.csdn.net/Jameslvt/article/details/80926390