11.14 Spark——诊断内存消耗

Spark——诊断内存消耗

内存都花费在哪里?

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

如何判断你的程序消耗了多少内存?

  1. 1、首先,自己设置RDD的并行度,有两种方式:(1)在parallelize(),textFile()等方法中,传入第二个参数,设置RDD的task/partition的数量;(2)第二种方式,用SparkConf.set()方法,设置一个参数,spark.default.parallelism , 可以统一设置这个application所有RDD的partition数量。(简单说,就是指定partition的数量)
  2. 2、其次,在程序中,将RDD cache 到内存中,调用RDD.cache()方法即可
  3. 3、最后,观察Driver的 log,你会发现类似于:"INFO BlockManagerMasterActor......(size:171.5KB,free:332 MB)"的日志信息,这就显示了每个partition 占用了多少内存。
  4. 4、将这个内存信息乘以partition 的数量,即可得出RDD的内存占用量。

设置日志级别:

 Logger.getLogger("org.apache.spark").setLevel(Level.INFO);
Spark——诊断内存消耗


分享到:


相關文章: