spark从入门到放弃十八:Spark 性能优化(1)诊断内存消耗

文章地址:http://www.haha174.top/article/details/255038

一.首先程序在运行的时候 内存都花费在那里呢?

1.每个java对象,都有一个对象头,会占用16个字符。主要是包括了一些对象的元信息,比如执指向他的类指针。如果一个对象本身很小,不如就包括了一个int类型的field,那么它的对象头实际上比对象自己还要大。
2.java String 对象,会比它的内部数据要多出40个字节。因为它内部使用char数组来保存内部的字符序列的,并且还得保存诸如数组长度之类的信息。而且因为String 使用的是UTF-16的编码,所以每个字符都会占用2个字符。比如,包含10个字符的String.会占用60个字符。
3.java 中的集合类型,比如hashMap和linkedList 内部使用的是链表的数据结构,所以对链表中的每一个数据,都使用Entry 对象来包装,Entry对象来包装。Entry对象不光有对象头,还有指向下一个Entry的指针。通常占用8个字节。
4.元素类型为原始数据类型(比如int的集合),内部通常会使用原始数据类型的包装类型,比如Integer,来存储元素。

二.如何判断自己的程序消耗了多少内存

1.首先,自己设置RDD的并行度,有两种方式:
(1).在parallelize(),testFile()等方法中传入第二个参数,设置RDD的task/partition的数量
(2)用sparkConf.set()方法,设置一个参数,spark.default.parallelism.可以统一设置这个application所有的RDD的paratition数量。
2.其次,在程序中将RDD的cache到内存中,调用RDD.cache()方法即可。
3.最后观察Driver的log的,你会发现类似于“INFO BlockManagerMasterActor.Added rdd_0_1 in memmory on mbk.local:50311 (size:717.5KB,free 332.3MB)”日志信息。这个就显示了每个partition占用了多少字符。
4.将这个内存信息乘以partition的数量,即可得出RDD的内存占用量。

欢迎关注,更多福利

这里写图片描述

你可能感兴趣的:(java,spark,大数据)