如何在映射器中加载hdfs中的SR解析器文件?

时间:2016-04-02 07:17:59

标签: java hadoop stanford-nlp

我正在尝试在mapreduce程序中使用CoreNLP项目来查找存储在hbase表中的大量文本的情绪。我正在使用SR解析器进行解析。模型文件存储在/user/root/englishSR.ser.gz的hdfs中。我在mapreduce应用程序代码中添加了以下行

 job.addCacheFile(new URI("/user/root/englishSR.ser.gz#model"));

现在在mapper中

 props.setProperty("parse.model", "./model");

我得到了edu.stanford.nlp.io.RuntimeIOException: java.io.StreamCorruptedException: invalid stream headerpom.xml文件包含

<dependency>
        <groupId>edu.stanford.nlp</groupId>
        <artifactId>stanford-corenlp</artifactId>
        <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>edu.stanford.nlp</groupId>
    <artifactId>stanford-corenlp</artifactId>
    <version>3.4.1</version>
    <classifier>models</classifier>
</dependency>

我尝试将该文件添加到resources并添加到maven,导致GC overhead limit exceeded或Java堆问题。

1 个答案:

答案 0 :(得分:1)

我不太了解hadoop,但我怀疑你对CoreNLP压缩SR解析器模型感到困惑。

首先尝试不使用Hadoop:

java -mx4g edu.stanford.nlp.parser.shiftreduce.ShiftReduceParser -serializedPath /user/root/englishSR.ser.gz

看看是否能正确加载解析器。如果是这样,它应该打印类似下面的东西并退出(否则,它将抛出异常......)。

Loading parser from serialized file edu/stanford/nlp/models/srparser/englishSR.ser.gz ... done [10.4 sec].

如果加载解析器很好,那么模型文件没有任何问题。我认为问题在于CoreNLP只是使用文件或资源名称是否以#34; .gz&#34;判断它是否被gzip压缩,因此它错误地解释了这一行:

props.setProperty("parse.model", "./model");

说要加载一个not-gzipped模型。所以我希望下面的一个或另一个能起作用:

cd /user/root ; gunzip englishSR.ser.gz

job.addCacheFile(new URI("/user/root/englishSR.ser#model"));

props.setProperty("parse.model", "./model");

或者:

job.addCacheFile(new URI("/user/root/englishSR.ser#model.gz"));

props.setProperty("parse.model", "./model.gz");