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

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

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

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

现在在Map上

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

我要走了 edu.stanford.nlp.io.RuntimeIOException: java.io.StreamCorruptedException: invalid stream header . 这个 pom.xml 文件包含

  1. <dependency>
  2. <groupId>edu.stanford.nlp</groupId>
  3. <artifactId>stanford-corenlp</artifactId>
  4. <version>3.4.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>edu.stanford.nlp</groupId>
  8. <artifactId>stanford-corenlp</artifactId>
  9. <version>3.4.1</version>
  10. <classifier>models</classifier>
  11. </dependency>

我已尝试将文件添加到 resources 再加上 maven 所有这些都导致了 GC overhead limit exceeded 或者java堆问题。

s1ag04yj

s1ag04yj1#

我对hadoop不太了解,但我怀疑您混淆了corenlp对sr解析器模型的压缩。
首先不使用hadoop尝试以下操作:

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

看看这是否可以加载解析器。如果是这样,它应该打印如下内容并退出(否则,它将抛出异常…)。

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

如果这可以很好地加载解析器,那么模型文件没有问题。我认为问题是corenlp只是使用文件名或资源名是否以“.gz”结尾来决定它是否是gzip,因此它错误地解释了以下行:

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

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

  1. cd /user/root ; gunzip englishSR.ser.gz
  2. job.addCacheFile(new URI("/user/root/englishSR.ser#model"));
  3. props.setProperty("parse.model", "./model");

或:

  1. job.addCacheFile(new URI("/user/root/englishSR.ser#model.gz"));
  2. props.setProperty("parse.model", "./model.gz");
展开查看全部

相关问题