首页 > 其他 > 详细

Spark开发-内存模型

时间:2020-09-14 20:07:26      阅读:43      评论:0      收藏:0      [点我收藏+]

Spark内容

  Spark的执行过程
  SparkSQL的执行过程
  Spark的内存模型

Spark的调优过程

1.日志查看

YARN 
1.日志管理是由NodeManager进行管理
ID下的  application_1505751916576_69536280 点击进入
      Tracking URL: 	ApplicationMaster
  Spark的on Yarn模式,其资源分配是交给Yarn的ResourceManager来进行管理的
   Attempt ID 那一行有 Logs 点击 Logs 进入日志
	    每个Container会输出三类日志
		   prelaunch.err  prelaunch.out
	      gclog : Total file length is 13623 bytes.
	     stderr : Total file length is 6484551 bytes.
		 stdout : Total file length is 14809 bytes.
 2. 转存到hdfs的日志,生命周期不再由Nodemanager负责,
	  而是由JobHistory 服务负责管理。
	     每个日志文件最大存留时间为yarn.log-aggregation.retain-seconds(单位为s,默认为3*60*60,即3小时)。
        ResourceManager NodeManager   ApplicationMaster 端的日志   container


Tracking UI 
      ApplicationMaster
        executor节点上的日志
     一个driver
     executor后可以看到 其他executor

2.原理和过程了解

Spark的内存模型

1.Spark2.0采用的是统一内存管理方式 unified Memory Manager

 01.特点是: 存储内存和计算内存在同一空间,并且可以动态的使用彼此的空闲区域
 02.构成: 
   Spark在一个Executor中的内存分为三块,一块是execution内存,一块是storage内存,一块是other内存
    内存分为堆内内存和堆外内存
      001.堆外内存式由Spark控制,直接在工作节点的系统内存中开辟空间,即对于大内存,Spark自行和内存打交道
	  这部分用户代码无法直接操作。
	  		    堆外内存部分主要用于JVM自身,如字符串、NIO Buffer等开销,
	另外还有部分堆外内存由spark.memory.offHeap.enabled及spark.memory.offHeap.size控制的堆外内存,这部分也归offheap,但主要是供统一内存管理使用的。

	 002.堆内内存依赖JVM,一般我们使用的Spark.driver.memory 和 spark.executor.memory
       动态占用-- 存储内存和计算内存
       storage memory 和 Executor memory
	      Executor memory: 主要存储Shuffle、Join、Sort、Aggregation等计算过程中的临时数据;

2. 驱动器和执行器功能

     Driver的功能
        1)一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,
    	           并且有SparkContext的实例,是程序的人口点;
         2)功能:负责向集群申请资源,向master注册信息,负责了作业的调度,
             负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler
     Executor 
       Executor 的内存管理建立在 JVM 的内存管理之上
        Executor 内运行的并发任务共享 JVM 堆内内存,这些内存被规划为 存储(Storage)内存 和 执行(Execution)内存
    	一块儿是专门用来给RDD的cache、persist操作进行RDD数据缓存用的;
    	另外一块儿,用来给spark算子函数的运行使用的,存放函数中自己创建的对象

3.内存溢出有两点:

   1. Driver 内存不够  2. Executor 内存不够
     Driver 内存不够:   1. 读取数据太大    
  	                    2. 数据回传
     Executor 内存不够: 1. map 类操作产生大量数据,包括 map、flatMap、filter、mapPartitions 等
                         2. shuffle 后产生数据倾斜
   Driver内存溢出的解决方式:
      读取数据太大 增加 Driver 内存,具体做法为设置参数 --driver-memory
  	 collect 大量数据回传 Driver,造成内存溢出:解决思路是  分区输出
   
   Executor内存溢出解决方式
      map 过程产生大量对象
  	     解决思路是    减少每个 task 的大小,从而减少每个 task 的输出;
  		 具体做法是在 会产生大量对象的 map 操作前 添加 repartition(重新分区) 方法,分区成更小的块传入 map
  
  		 解决思路: 用 mapPartitions 替代多个 map,减少 Executor 内存压力
  	shuffle:  
  	    broadcast join
  		缓存 RDD 既可以节省内存,也可以提高性
  		DataFrame 代替 RDD
  		数据倾斜:
  		   过滤导致倾斜的 key
  		   使用随机 key 进行双重聚合
  		   sample 采样对倾斜 key 单独进行 join
  	Reduce
  	   增加 reduce 并行度其实就是增加 reduce 端 task 的数量, 这样每个 task 处理的数据量减少,避免 oom

3.常见的问题和解决方式

判断 -- 定位 --确认  --解决

Spark开发-内存模型

原文:https://www.cnblogs.com/ytwang/p/13665187.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!