Java 带有MapReduce的StanfordCoreNlp(错误:超出GC开销限制)

Java 带有MapReduce的StanfordCoreNlp(错误:超出GC开销限制),java,hadoop,mapreduce,stanford-nlp,Java,Hadoop,Mapreduce,Stanford Nlp,我有一个文本文件,其中包含一组文档ID和文档内容,以“:”分隔。这里有一个例子 139::This is a sentence in document 139. This is another sentence. 140::This is a sentence in document 140. This is another sentence. 我想用StanfordCoreNLP对这些句子进行命名实体识别。这在常规java程序中运行良好。现在我想用MapReduce做同样的事情。我试图在映射

我有一个文本文件,其中包含一组文档ID和文档内容,以“:”分隔。这里有一个例子

139::This is a sentence in document 139. This is another sentence.
140::This is a sentence in document 140. This is another sentence.
我想用StanfordCoreNLP对这些句子进行命名实体识别。这在常规java程序中运行良好。现在我想用MapReduce做同样的事情。我试图在映射器的setup()方法中加载StanfordCoreNLP分类器,map()方法执行命名实体标记,如下所示:

public class NerMapper extends Mapper<LongWritable, Text, Text, Text>{

StanfordCoreNLP pipeline;

@Override
protected void setup(Mapper<LongWritable, Text, Text, Text>.Context context)
        throws IOException, InterruptedException {
    // TODO Auto-generated method stub
    super.setup(context);
    Properties props = new Properties();
    props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref, relation");
    pipeline = new StanfordCoreNLP(props);
}

@Override
protected void map(LongWritable key, Text value,
        Mapper<LongWritable, Text, Text, Text>.Context context) throws IOException,
        InterruptedException {
    // TODO Auto-generated method stub
    String[] input = value.toString().split("::");
    List<DataTuple> dataTuples = new ArrayList<DataTuple>();
    Annotation annotation = new Annotation(input[1]);
    pipeline.annotate(annotation);
    List<CoreMap> sentences = annotation.get(SentencesAnnotation.class);
    for(CoreMap sentence : sentences){
        //extract named entities
        //write <documentID>::<the named entity itself>::<the named entity tag>
    }
}
}
公共类NerMapper扩展了Mapper{
斯坦福德-科伦普管道;
@凌驾
受保护的无效设置(Mapper.Context上下文)
抛出IOException、InterruptedException{
//TODO自动生成的方法存根
超级设置(上下文);
Properties props=新属性();
props.setProperty(“注释器”、“标记化、ssplit、pos、引理、ner、解析、dcoref、关系”);
管道=新StanfordCoreNLP(道具);
}
@凌驾
受保护的无效映射(可长写键、文本值、,
Mapper.Context)引发IOException,
中断异常{
//TODO自动生成的方法存根
字符串[]输入=value.toString().split(“:”);
List dataTuples=new ArrayList();
注释=新注释(输入[1]);
管道注释(注释);
列出句子=annotation.get(SentencesAnnotation.class);
for(CoreMap句子:句子){
//提取命名实体
//写:::
}
}
}
在运行作业时,作业失败,错误为“超出GC开销限制”。在运行作业之前,我通过执行导出HADOOP_OPTS=“-Xmx892m”尝试了不同的堆大小,并且我使用
HADOOP jar
命令的
-libjars
选项包含了StanfordCoreNLP依赖项。输入文档通常只包含4-5个正常大小的句子。我知道问题在于setup()方法中分类器的初始化,但我一直无法找出到底是什么地方出了问题。我真的很感激这里的任何帮助

我使用的是Hadoop2.6.0、StanfordCorenlp3.4.1和Java1.7