MapReduce中FULLGC的问题
问题描述
我在集群上将近好几T的数据需要遍历一遍,然后过滤出我想要的数据。我本来以为是一个简单的事情,没想到试了两三天也没有成功。总是会出现超时超内存的问题。
超时的问题可能是一个reduce的量有点太大了。这里我把key值稀疏了一下。但是超内存的问题还是存在。这让我很费解。
今天终于搞明白了在这个地方:这个看似没有啥问题,但是也就是java菜鸟才会犯这个问题,for循环里new了一个有具体值的对象时,for循环结束前gc不会回收。这样写的结果就是,如果这个for循环很大,频繁的new一个会拖慢时间,第二个也会让内存无法释放。应该在for循环之外new。
for (TraceDataFrame traceDataFrame:values){
context.write(new Text(traceDataFrame.toString()),NullWritable.get());
}
应该改为:
Text res = new Text();
for (TraceDataFrame traceDataFrame:values){
res.set(traceDataFrame.toString());
context.write(res,NullWritable.get());
}
看来做java的开发是必须要看jvm的底层机制才行,不然确实察觉不到代码的差异。