以下内容整理来源于DT大数据梦工厂,微博地址:http://weibo.com/ilovepains
1、java 对象是16个字节(例如指向对象的指针等元数据信息),如果对象中只有一个int
的property,则此时会占据20个字节,也就是说对象的原数据占用了大部分的空间,所有
在封装数据的时候尽量不要使用对象!例如说明使用JSON格式来封装数据
2、Java中的基本数据类型会自动的封箱操作,例如int会自动变成Integer,这会额外增加对象头的
空间占用
3、java 的String 在实际占用内存方法要额外使用40个字节(String内部使用char[]来保存字符序列)
另外需要注意的是String中的字符是2个字节(UTF-16),如果内部有5个字节的话,实际上会占用50
个字节。
4、java中的集合List, HashMap 等其内部一般使用链表来实现,具体每个数据使用Entry等这些也
非常消耗内存
5、优先使用原生数组,尽可能不要直接使用ArrayList, HashMap, LinkedList 等数据结构
例如说List<Integer> list = new ArrayList<Integer> 需要考虑替换为int[] array = new int[]
修改数据不建议使用String,使用StringBuffer,封装和查询可以使用String
6、优先使用String(推荐使用JSON),而不是采用HashMap,List等来封装数据例如
Map<Integer, Worker> work = new HashMap<Integer, Worker>(),建议使用JSON字符串
或者自己构建的String字符串对象, 例如"id:name,salary || id:name, slary||id:name,slary";
二:Spark 内存消耗诊断
1、JVM自带众多内存消耗诊断的工具例如:JMap, JSonsole第三方
IBM JVM profile Tool 等
2、开发,测试,生产环境下用的最对的是日志! 是Driver产生的日志
开发的时候最好是client模式
问题1:判断RDD数据在不在内存怎么办: 最简单也是最有效调用RDD.cache
当进行cache 操作的使用Driver上的BlockManagerMaster会记录该信息并写进日志中
三:persist和checkpoint
1、当返回使用某个(些)RDD 的时候建议使用persist来对数据进行缓存
(MEMORY_AND_DISK)
2、如果某个步骤的RDD计算特别耗时或者经历了很多步骤的计算,如果数据丢失
则重新计算的代价特别大,此时考虑使用checkpoint。因为checkpoint 是吧数据
写入HDFS,天然具有高可靠性。