我正在尝试解析mbox格式的电子邮件。但是,Tika继续尝试在这些消息上使用TNEFParser,从而导致错误:

2012-08-21 17:44:42,139 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: Java heap space
    at org.apache.poi.hmef.attribute.TNEFAttribute.<init>(TNEFAttribute.java:50)
    at org.apache.poi.hmef.attribute.TNEFAttribute.create(TNEFAttribute.java:76)
    at org.apache.poi.hmef.HMEFMessage.process(HMEFMessage.java:74)
    at org.apache.poi.hmef.HMEFMessage.process(HMEFMessage.java:98)
    at org.apache.poi.hmef.HMEFMessage.process(HMEFMessage.java:98)
    at org.apache.poi.hmef.HMEFMessage.<init>(HMEFMessage.java:63)
    at org.apache.tika.parser.microsoft.TNEFParser.parse(TNEFParser.java:80)
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:242)
    at org.apache.tika.parser.mail.MailContentHandler.body(MailContentHandler.java:102)
    at org.apache.james.mime4j.parser.MimeStreamParser.parse(MimeStreamParser.java:133)
    at org.apache.tika.parser.mail.RFC822Parser.parse(RFC822Parser.java:76)
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:242)
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:242)
    at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:120)
    at org.lab41.asf.etl.mapred.MailboxToTextMapper.parse(MailboxToTextMapper.java:124)
    at org.lab41.asf.etl.mapred.MailboxToTextMapper.map(MailboxToTextMapper.java:88)
    at org.lab41.asf.etl.mapred.MailboxToTextMapper.map(MailboxToTextMapper.java:45)
    at org.apache.avro.mapred.HadoopMapper.map(HadoopMapper.java:81)
    at org.apache.avro.mapred.HadoopMapper.map(HadoopMapper.java:34)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:391)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:266)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1278)
    at org.apache.hadoop.mapred.Child.main(Child.java:260)


是否可以防止Tika使用TNEFParser?任何的意见都将会有帮助。

最佳答案

对于长期修复,您应该将此报告为Apache Tika中的错误,将有问题的文件附加到错误报告中,并与项目一起工作以修复错误。

短期来说,解压缩Tika-Parsers jar文件,编辑META-INF/services/org.apache.tika.parser.Parser文件,然后从列表中删除TNEF分析器。这将阻止它被AutoDetectParser自动加载和使用

如果不更改Tika Parsers jar文件,那会有些棘手。有两个选项。一种是自己创建一个TikaConfig实例,而不是依赖默认实例,并且仅提供一个有限的解析器列表。根据您是想将其列入白名单还是将其列入黑名单,这可能会变得容易或更困难。或者,您可以使用这样一个事实,即最后一个针对mimetype的注册解析器获胜。因此,使用服务文件和虚拟分析器创建自己的jar。让该解析器声明它处理TNEF模仿类型,但不执行任何操作。将jar添加到您的类路径中,然后使用您的虚拟解析器代替

关于java - 防止Tika使用TNEFParser,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12065126/

10-11 19:58