Spark集群运行与优化

Spark集群上的运行

Spark集群采用的是主/从结构,主是驱动器节点driver,其他是工作节点executor,之间通过集群管理器来连接。

驱动器在Spark应用有两个职责:

  • 把用户程序转为任务。转为多个物理执行的单元,即任务task。驱动器会按DAG图来执行,也会对DAG进行流水线优化,形成一系列stage。每个stage分发给执行器。
  • 为执行器节点调度任务。执行器进程启动后,会向驱动器注册自己,Spark驱动器根据当前的执行器节点集合,把任务基于数据的位置分配给合适的执行器。

执行器进程两大作用:负责运行组成Spark应用的任务,并把结果返还驱动器进程;通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存存储,进行内存计算。

  • 用户通过spark-submit脚本提交应用
  • spark-submit脚本启动驱动器程序,调用用户定义的main()方法
  • 驱动器程序与集群管理器通信,申请资源以启动执行器节点
  • 集群管理器为驱动器程序启动执行器节点
  • 驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。
  • 任务在执行器程序中进行计算并保存结果
  • 如果驱动器程序的main方法推出,驱动器程序会终止执行器进程,通过集群管理器释放资源

Spark优化

当调用行动操作,会向上回溯,访问父节点,父节点的父节点,然后执行转化操作。

Spark提供了两种方法来对操作的并行度进行调优,第一种方法是在数据混洗操作时,使用参数的方式为混洗后的RDD指定并行度,第二种方法时对于任务已有的RDD,可以进行重新分区来获取更多或更少的分区数。

当Spark需要通过网络传输数据,或将数据溢写到磁盘上,就需要数据序列化为二进制格式。序列化会在混洗操作时发生。

当数据混洗操作时,Spark会创建出一些中间缓存区来存储数据混洗的部分缓存数据。用户也可以申请内存空间。默认情况下60%内存空间给RDD,20%给数据混洗,20%给用户。

如果分区空间不够,旧分区会被删除或写入磁盘。

原文地址:https://www.cnblogs.com/chenshaowei/p/12499352.html