如何从java/scala读取nutch内容?

7uzetpgm  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(299)

我正在使用nutch对一些网站进行爬网(作为一个独立于其他内容运行的进程),同时我想使用java(scala)程序使用jsoup分析网站的html数据。
我让nutch按照教程工作(没有脚本,只执行单独的指令工作),我认为这是在保存网站的html文件 crawl/segments/<time>/content/part-00000 目录。
问题是,我不知道如何在java/scala程序中实际读取网站数据(url和html)。我读了这个文档,但发现它有点压倒性,因为我从来没有使用过hadoop。
我试图使示例代码适应我的环境,这就是我得到的结果(主要是猜测):

val reader = new MapFile.Reader(FileSystem.getLocal(new Configuration()), ".../apache-nutch-1.8/crawl/segments/20140711115438/content/part-00000", new Configuration())
  var key = null
  var value = null
  reader.next(key, value) // test for a single value
  println(key)
  println(value)

但是,我在运行时遇到了以下异常:

Exception in thread "main" java.lang.NullPointerException
    at org.apache.hadoop.io.SequenceFile$Reader.next(SequenceFile.java:1873)
    at org.apache.hadoop.io.MapFile$Reader.next(MapFile.java:517)

我不知道如何与一个 MapFile.Reader ,特别是我应该传递给它的构造函数参数。我应该传递什么配置对象?这是正确的文件系统吗?那是我感兴趣的数据文件吗?

fjnneemd

fjnneemd1#

斯卡拉:

val conf = NutchConfiguration.create()
val fs = FileSystem.get(conf)
val file = new Path(".../part-00000/data")
val reader = new SequenceFile.Reader(fs, file, conf)

val webdata = Stream.continually {
  val key = new Text()
  val content = new Content()
  reader.next(key, content)
  (key, content)
}

println(webdata.head)

java 语:

public class ContentReader {
    public static void main(String[] args) throws IOException { 
        Configuration conf = NutchConfiguration.create();       
        Options opts = new Options();       
        GenericOptionsParser parser = new GenericOptionsParser(conf, opts, args);       
        String[] remainingArgs = parser.getRemainingArgs();     
        FileSystem fs = FileSystem.get(conf);
        String segment = remainingArgs[0];
        Path file = new Path(segment, Content.DIR_NAME + "/part-00000/data");
        SequenceFile.Reader reader = new SequenceFile.Reader(fs, file, conf);
        Text key = new Text();
        Content content = new Content();
        // Loop through sequence files
        while (reader.next(key, content)) {
            try {
                System.out.write(content.getContent(), 0,
                        content.getContent().length);
            } catch (Exception e) {
            }
        }
    }
}

或者,您可以使用 org.apache.nutch.segment.SegmentReader (示例)。

相关问题