学校网站页面设计,菜篮网网站开发技术,重庆品牌设计公司排行,网站顶部动画代码1. 数据本地化的级别#xff1a;1.PROCESS_LOCAL2.NODE_LOCAL3.NO_PREF4.RACK_LOCAL5.ANY1) PROCESS_LOCALtask要计算的数据在本进程#xff08;Executor#xff09;的内存中。2) NODE_LOCAL① task所计算的数据在本节点所在的磁盘上。② task所计算的数据在本节点其他Execu…1. 数据本地化的级别1.PROCESS_LOCAL2.NODE_LOCAL3.NO_PREF4.RACK_LOCAL5.ANY1) PROCESS_LOCALtask要计算的数据在本进程Executor的内存中。2) NODE_LOCAL① task所计算的数据在本节点所在的磁盘上。② task所计算的数据在本节点其他Executor进程的内存中。3) NO_PREFtask所计算的数据在关系型数据库中如mysql。4) RACK_LOCALtask所计算的数据在同机架的不同节点的磁盘或者Executor进程的内存中5) ANY跨机架。2. Spark数据本地化调优Spark中任务调度时TaskScheduler在分发之前需要依据数据的位置来分发最好将task分发到数据所在的节点上如果TaskScheduler分发的task在默认3s依然无法执行的话TaskScheduler会重新发送这个task到相同的Executor中去执行会重试5次如果依然无法执行那么TaskScheduler会降低一级数据本地化的级别再次发送task。如上图中会先尝试1,PROCESS_LOCAL数据本地化级别如果重试5次每次等待3s,会默认这个Executor计算资源满了那么会降低一级数据本地化级别到2NODE_LOCAL,如果还是重试5次每次等待3s还是失败那么还是会降低一级数据本地化级别到3RACK_LOCAL。这样数据就会有网络传输降低了执行效率。1) 如何提高数据本地化的级别可以增加每次发送task的等待时间默认都是3s将3s倍数调大 结合WEBUI来调节使任务平均分配达到三种级别执行所花时间相差最少• spark.locality.wait (以下三个参数的默认值参照spark.locality.wait)• spark.locality.wait.process• spark.locality.wait.node• spark.locality.wait.rack注意等待时间不能调大很大调整数据本地化的级别不要本末倒置虽然每一个task的本地化级别是最高了但整个Application的执行时间反而加长。2) 如何查看数据本地化的级别通过日志或者WEBUI3. 内存调优JVM堆内存分为一块较大的Eden和两块较小的Survivor每次只使用Eden和其中一块Survivor当回收时将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor上最后清理掉Eden和刚才用过的Survivor。也就是说当task创建出来对象会首先往Eden和survivor1中存放survivor2是空闲的当Eden和survivor1区域放满以后就会触发minor gc小型垃圾回收清理掉不再使用的对象。会将存活下来的对象放入survivor2中。如果存活下来的对象大小大于survivor2的大小那么JVM就会将多余的对象直接放入到老年代中。如果这个时候年轻代的内存不是很大的话就会经常的进行minor gc频繁的minor gc会导致短时间内有些存活的对象多次垃圾回收都没有回收掉一直在用的又不能被释放,这种对象每经过一次minor gc都存活下来频繁的倒来倒去会导致这些短生命周期的对象不一定长期使用每进行一次垃圾回收就会长一岁。年龄过大默认15岁垃圾回收还是没有回收回去就会跑到老年代里面去了。这样会导致在老年代中存放大量的短生命周期的对象老年代应该存放的是数量比较少并且会长期使用的对象比如数据库连接池对象。这样的话老年代就会满溢full gc 因为本来老年代中的对象很少很少进行full gc 因此采取了不太复杂但是消耗性能和时间的垃圾回收算法。不管minor gc 还是 full gc都会导致JVM的工作线程停止。总结-堆内存不足造成的影响1) 频繁的minor gc。2) 老年代中大量的短生命周期的对象会导致full gc。3) gc 多了就会影响Spark的性能和运行的速度。Spark JVM调优主要是降低gc时间可以修改Executor内存的比例参数。RDD缓存、task定义运行的算子函数可能会创建很多对象这样会占用大量的堆内存。堆内存满了之后会频繁的GC如果GC还不能够满足内存的需要的话就会报OOM。比如一个task在运行的时候会创建N个对象这些对象首先要放入到JVM年轻代中。比如在存数据的时候我们使用了foreach来将数据写入到内存每条数据都会封装到一个对象中存入数据库中那么有多少条数据就会在JVM中创建多少个对象。Spark中如何内存调优Spark Executor堆内存中存放以静态内存管理为例RDD的缓存数据和广播变量spark.storage.memoryFraction 0.6shuffle聚合内存spark.shuffle.memoryFraction 0.2,task的运行0.2那么如何调优呢1) 提高Executor总体内存的大小2) 降低储存内存比例或者降低聚合内存比例如何查看gcSpark WEBUI中job-stage-task