Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop Mapper填充MapOutputBuffer对象,有没有更好的方法跳过坏键?_Java_Hadoop_Mapreduce - Fatal编程技术网

Java Hadoop Mapper填充MapOutputBuffer对象,有没有更好的方法跳过坏键?

Java Hadoop Mapper填充MapOutputBuffer对象,有没有更好的方法跳过坏键?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在从事一个mapreduce项目,在这个项目中,我无法事先保证我的映射器将始终获得一个可用的键值对。我试着用一个try-catch块来包围相关代码,就像这样 public void map(LongWritable Key, Text values, Context context) throws IOException, InterruptedException { try { //Attem

我正在从事一个mapreduce项目,在这个项目中,我无法事先保证我的映射器将始终获得一个可用的键值对。我试着用一个try-catch块来包围相关代码,就像这样

public void map(LongWritable Key, Text values, Context context)
                throws IOException, InterruptedException {

            try {
                    //Attempt process

                    context.write(HKey, HValue);

                }
            } catch (Exception e) {
                //was given invalid value, drop it and move on
                context.nextKeyValue();
                e.printStackTrace();
            }
}

在一个大数据集上对此进行内存分析表明MapOutputBuffers占用了我的大部分内存,最终导致内存不足错误。有没有更好的方法来构造我的映射器,这样我就不会有这个问题?我不想分配额外的内存作为权宜之计。

我认为打印堆栈跟踪是无用的,我使用以下代码:

// Define enumeration    
    public static enum LOCAL_COUNTER_MAP {
                INVALID 
            }   


        public void map(LongWritable Key, Text values, Context context)
                            throws IOException, InterruptedException {

                        try {
                                //Attempt process

                                context.write(HKey, HValue);

                            }
                        } catch (Exception e) {
                        // ignore value
                          context.getCounter(LOCAL_COUNTER_MAP.INVALID).increment(1);
                          return;
                        }
            }
在作业结果中,您将看到有多少映射程序具有无效的键值对


祝你好运:)

打印堆栈跟踪并不是真正的问题,尽管这是一个很好的解决方法。我要做的是阻止我的日志文件膨胀。无论如何,问题是,即使我使用return语句跳过了错误的值,我也遇到了gc开销限制。好吧,问题是进程在垃圾收集中花费了98%以上的时间,而堆的不到2%被恢复。所以试着增加堆的大小,看看这篇文章,认为它能帮上忙——现在它似乎正在工作,这很奇怪,我想我在hadoop环境文件中设置了它。我确实想知道是否还有一些其他的内存问题我可以解决,但现在这已经足够了。非常感谢。