如何在Map器的hdfs中加载sr解析器文件?

xmd2e60i  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(428)

我试图在mapreduce程序中使用corenlp项目来查找存储在其中的大量文本的情感 hbase table。我正在使用sr解析器进行解析。模型文件存储在 /user/root/englishSR.ser.gz . 我在mapreduce应用程序代码中添加了下面的一行

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

现在在Map上

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

我要走了 edu.stanford.nlp.io.RuntimeIOException: java.io.StreamCorruptedException: invalid stream header . 这个 pom.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堆问题。

s1ag04yj

s1ag04yj1#

我对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只是使用文件名或资源名是否以“.gz”结尾来决定它是否是gzip,因此它错误地解释了以下行:

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

就像说加载一个没有gzip的模型。所以我希望下面的一个或另一个能起作用:

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");

相关问题