最近又遇到一次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 --
本文分析了Hadoop中Tasktracker出现OutOfMemoryError的问题,并通过修改Pig将对象序列化后存储的方式解决了此问题。
329

被折叠的 条评论
为什么被折叠?



