内存参数

GC调优在Spark应用中的实践

心不动则不痛 提交于 2019-11-29 15:12:59
Spark是时下非常热门的大数据计算框架,以其卓越的性能优势、独特的架构、易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用。与Hadoop、HBase生态圈的众多项目一样,Spark的运行离不开JVM的支持。由于Spark立足于内存计算,常常需要在内存中存放大量数据,因此也更依赖JVM的垃圾回收机制(GC)。并且同时,它也支持兼容批处理和流式处理,对于程序吞吐量和延迟都有较高要求,因此GC参数的调优在Spark应用实践中显得尤为重要。本文主要讲述如何针对Spark应用程序配置JVM的垃圾回收器,并从实际案例出发,剖析如何进行GC调优,进一步提升Spark应用的性能。 问题介绍 随着Spark在工业界得到广泛使用,Spark应用稳定性以及性能调优问题不可避免地引起了用户的关注。由于Spark的特色在于内存计算,我们在部署Spark集群时,动辄使用超过100GB的内存作为Heap空间,这在传统的Java应用中是比较少见的。在广泛的合作过程中,确实有很多用户向我们抱怨运行Spark应用时GC所带来的各种问题。例如垃圾回收时间久、程序长时间无响应,甚至造成程序崩溃或者作业失败。对此,我们该怎样调试Spark应用的垃圾收集器呢?在本文中,我们从应用实例出发,结合具体问题场景,探讨了Spark应用的GC调优方法。 按照经验来说,当我们配置垃圾收集器时,主要有两种策略—

java面试题1

ぃ、小莉子 提交于 2019-11-29 13:19:29
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点: 没有面向对象易维护、易复用、易扩展 面向对象 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点: 性能比面向过程低 2. Java 语言有哪些特点 简单易学; 面向对象(封装,继承,多态); 平台无关性( Java 虚拟机实现平台无关性); 可靠性; 安全性; 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便); 编译与解释并存; 3. 什么是 JDK 什么是 JRE 什么是 JVM 三者之间的联系与区别 这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。 JDK: JDK(Java Development Kit)顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的

MySQL高级特性四:查询缓存

会有一股神秘感。 提交于 2019-11-29 10:58:07
很多数据库产品都能够缓存查询的执行计划,对于相同类型的SQL就可以跳过SQL解析和执行计划生成截断。MySQL在某些场景下也可以实现,但是MySQL还有另一种不同的缓存类型:缓存完整的select查询结果,也就是查询缓存。 MySQL查询缓存保存查询返回的完整结果。当查询命中该缓存,MySQL会like返回结果,跳过了解析、优化和执行截断。 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效。这种机制效率看起来比较低,因为数据表变化时很有可能对应的查询结果没有变更,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。 查询缓存对应用程序是完全透明的。应用程序无需关心MySQL是通过查询返回的还是实际执行返回的结果。事实上,这两种方式执行的结果是完全相同的。换句话说,查询缓存无需使用任何语法。无论是MySQL开启或关闭查询缓存,对程序都是透明的。 随着现在的通用服务器越来越强大,查询缓存被发现是一个影响服务器扩展性的因素。它可能成为整个服务器的资源竞争单点,在多核服务器上还可能导致服务器僵死。所以大部分时候应该默认关闭查询缓存,如果查询缓存作用很大的话,可以配置个几十兆的小缓存空间。 1 MySQL如何判断缓存命中 MySQL判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了如下因素:

Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

懵懂的女人 提交于 2019-11-29 10:19:34
一、作用域 return 可以返回任意值 例子 def test1(): print("test1") def test(): print("test") return test1 res = test() print(res)    输出结果 test <function test1 at 0x021F5C90>    分析:这里print(res)输出的是test1函数在内存中的地址,return也是可以返回的 ,加上括号就可以运行函数了 例子2 name = "pony" def test1(): name = "nicholas" def inner(): name = "jack" print(name) return inner res = test1() print(res) res()    输出结果 <function test1.<locals>.inner at 0x02195C48> jack    分析: test1函数返回了inner函数的内存地址,并被赋值给res,所以最后在res后加上括号就可以直接执行,注意这里执行的是inner函数,打印name选择的是局部变量name ="jack",而非选择调用执行的res()所在的name = "pony" 例子3 def foo(): name = 'jack' def bar(): name =

2019大数据面试题

这一生的挚爱 提交于 2019-11-29 07:27:42
【原文需购,分享给各位白嫖党,请自行保存】 1. ConcurrentHashMap 是怎么实现的? 答:concurrent 包中线程安全的哈希表,采用分段锁,可以理解为把一个大的 Map 拆分成 N 个小的 HashTable,根据 key.hashCode() 来决定把 key 放到哪个 HashTabl 中。在 ConcurrentHashMap 中,就是把 Map 分成了 N 个 Segment,put 和 get 的时候,都是现根据 key.hashCode() 算出放到哪个 Segment 中。 2. sparksql 和 sparkstreaming 哪个比较熟 答:都还行,SparkSql 的 DataFrame 或者 DataSet 和 SparkStreaming 的 DStream 都是基于SparkCore 的,最终都会转化为 Sparktask 执行。我们可以交流一下本质的东西 SparkCore,而SparkCore 的核心又是 RDD。 3. 说一下 sparkshuffle 答:Spark 的 shuffle 也是一处理问题的思想:分而治之。shuffle 一般称为洗牌,一般会有Shuffle。 Write 阶段 和 Shuffle Read 阶段。在 Spark 中实现 Shuffle 的方式有两种,一种是 HashShuffle,一种是

Spark总结整理(三):Spark Core 性能优化之资源调优

我们两清 提交于 2019-11-29 06:44:05
Spark性能优化主要分为: 开发调优 资源调优 数据倾斜调优 shuffle调优 在开发完Spark作业之后,就该为作业配置合适的资源了 资源参数设置的不合理,可能会导致没有充分利用集群资源,作业运行会极其缓慢;或者设置的资源过大,队列没有足够的资源来提供,进而导致各种异常 本篇罗列资源调优的注意事项 1. 引言 建议先了解 Spark作业基本运行原理 和 Spark内存模型 参考: https://blog.csdn.net/super_wj0820/article/details/100533335 https://www.cnblogs.com/qingyunzong/p/8955141.html 尤其注意区分 Spark1.6.0 之后 内存默认为统一管理(Unified Memory Manager)方式,不再是 静态管理(Static Memory Manager)方式,在针对内存资源做参数配置是要注意区分 当前的内存管理策略 2. 资源参数调优 2.1 num-executors 参数说明 :该参数用于设置 Spark 作业总共要用多少个 Executor 进程来执行 Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程 这个参数非常重要,如果不设置的话

java OutOfMemoryError排查

佐手、 提交于 2019-11-29 03:34:12
一,什么是OOM,原因有哪些 OOM也叫内存溢出,导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 代码中存在死循环或循环产生过多重复的对象实体; 使用的第三方软件中的BUG; 启动参数内存值设定的过小; 二,通过一个案例定位排查 首先,看一下产生OOM的代码,它的语义是无限往集合中添加元素 import java.util.*; public class OomTest{ public static void main(String [] args){ List<String> list = new ArrayList<String>(); while(true){ list.add(new String("test")); } } }   首先介绍下用到的日志的概念以及工具: Heap Dump是什么? Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。 IBM heapAnalyzer:

Hadoop YARN参数介绍(四)[推荐]

只谈情不闲聊 提交于 2019-11-29 01:30:33
Container Container就是一个yarn的java进程,在Mapreduce中的AM,MapTask,ReduceTask都作为Container在Yarn的框架上执行,你可以在RM的网页上[8088端口]看到Container的状态。 基础 Yarn的ResourceManger(简称RM)通过逻辑上的队列分配内存,CPU等资源给application,默认情况下RM允许最大AM申请Container资源为8192MB("yarn.scheduler.maximum-allocation-mb"),默认情况下的最小分配资源为1024M("yarn.scheduler.minimum-allocation-mb"),AM只能以增量("yarn.scheduler.minimum-allocation-mb")和不会超过("yarn.scheduler.maximum-allocation-mb")的值去向RM申请资源,AM负责将("mapreduce.map.memory.mb")和("mapreduce.reduce.memory.mb")的值规整到能被("yarn.scheduler.minimum-allocation-mb")整除,RM会拒绝申请内存超过8192MB和不能被1024MB整除的资源请求[内存增量]。 1 yarn-site.xml设置

JavaScript之ArrayBuffer

你。 提交于 2019-11-29 00:50:08
在写作这篇博客的时候,参照了下面三篇博客: https://www.cnblogs.com/jixiaohua/p/10714662.html (写的很详细,参照比较多) https://www.cnblogs.com/copperhaze/p/6149041.html https://zh.javascript.info/arraybuffer-binary-arrays 文章中有一些内容是直接从上面博客复制过来的,并不是想要抄袭,只是觉得写博客可以增加理解度,别切可以避免遗忘。在此感谢上面三位博主的文章。 DataView部分完全复制上面第一个链接的博客。 ArrauBuffer对象、TypedArray视图和DataView视图是JavaScript中**专门操作二进制数据的接口**。他们都是以数组的方式操作二进制数组,所以被称为二进制数组。最初为了满足JavaScript与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式的背景下诞生的。 一.ArrayBuffer相关介绍 ArrayBuffer指的是一段连续的内存区域。 let buffer = new ArrayBuffer(40); // 在内存中开辟40个字节长度的内存区域 alert(buffer.byteLength); // 40 1

Hadoop YARN参数介绍(二)

谁说胖子不能爱 提交于 2019-11-29 00:26:57
Hadoop YARN同时支持内存和CPU两种资源的调度,本文将介绍YARN是如何对这些资源进行调度和隔离的。 在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责资源的分配,而NodeManager则负责资源的供给和隔离。ResourceManager将某个NodeManager上资源分配给任务(这就是所谓的"资源调度")后,NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的资源隔离。 在正式介绍具体的资源调度和隔离之前,先了解一下内存和CPU这两种资源的特点,这是两种性质不同的资源。内存资源的多少会会决定任务的生死,如果内存不够,任务可能会运行失败;相比之下,CPU资源则不同,它只会决定任务运行的快慢,不会对生死产生影响。 【YARN中内存资源的调度和隔离】 基于以上考虑,YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是"可用的",因为一个节点上的内存会被若干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的,配置参数如下: (1)yarn.nodemanager.resource.memory-mb 表示该节点上YARN可使用的物理内存总量