最近又遇到一次Tasktracker OOM的问题, 分析过程如下:
1. 用MemoryAnalyzer分析heap dump, 如下图:
发现又是大量的String类型的内存占用.
进一步分析String的持有,如下:
发现是JobConf 对象持有了大量的string. 这个已经不奇怪了, hadoop要放很多job相关的配置到JobConf中,很多JobTracker Tasktracker的OOM都跟这个有关.
继续看String的内容:
却是很多乱七八糟的内容,不像是可读的配置. 根据Entry的key查找pig源代码, 发现是这样的:
原来Pig将很多的对象序列化再编码成字符串存储在了JobConf中!
只有压缩ObjectSerializer的输出再编码了.
改了代码, 上线运行, 没问题!
mailing list里面一吼, 结果发现有人在我前两天提交了一样的功能..... 这个,,这个就怪为嘛我们的系统没有提前3天OOM呢? >.<
官方patch在这里: PIG-3017
这类型的bug基本上是谁遇到的早, 谁就会有机会fix. 可遇不可求啊.
-- EOF --