Ползание с Nutch выбрасывает IOException

Пытался ползать с помощью ореха. Я использую их Java API со следующей конфигурацией -

Configuration configuration = new Configuration();
configuration.set("plugin.folders", "data/plugins");
configuration.set("hadoop.tmp.dir","data/tmp");
configuration.set("db.ignore.external.links","false");
configuration.set("db.fetch.schedule.class","org.apache.nutch.crawl.DefaultFetchSchedule");
configuration.set("db.url.normalizers","false");
configuration.set("db.url.filters","false");
configuration.set("db.ignore.external.links.mode","byDomain");
configuration.set("db.fetch.retry.max","3");
configuration.set("db.ignore.external.exemptions.file","data/conf/db-ignore-external-exemptions.txt");
configuration.set("plugin.includes","urlnormalizer-(ajax|basic|host|pass|protocol|querystring|regex|slash)|nutch-extensionpoints");
configuration.set("plugin.auto-activation", "true");
configuration.set("fetcher.follow.outlinks.depth", "10");
configuration.set("fetcher.follow.outlinks.num.links", "100");
configuration.set("http.agent.name", "Nutch Crawler");
configuration.set("fetcher.max.crawl.delay", "15000");
configuration.set("http.timeout", String.valueOf(25000));
configuration.set("http.content.limit", String.valueOf(1024 * 1024 * 512));

Мой код -

public void crawlWithNutch() throws Exception{

    CrawlerConfiguration crawlerConf = new CrawlerConfiguration();
    Path crawlDB = crawlerConf.crawlDB();
    Path urlDir = crawlerConf.urlDir();

    System.out.println("Injecting urls to web table");
    Injector injector = crawlerConf.injector();
    injector.inject(crawlDB, urlDir);

    Path segmentsDir = crawlerConf.segmentsDir();
    Generator generator = crawlerConf.generator();
    Fetcher fetcher = crawlerConf.fetcher();
    ParseSegment parseSegment = crawlerConf.parseSegment();
    CrawlDb crawlDb = crawlerConf.crawlDb();
    FileDumper dumper = crawlerConf.dumper();

    long segmentTime = new Date().getTime();

    boolean stop = false;

    int numberOfReduceTasks = 8;
    int numberOfPagesInrun = 100;
    int numberOfCores = 2;

    while(!stop) {

        System.out.println("Generator phase");
        Path[] paths = generator.generate(crawlDB, segmentsDir, numberOfReduceTasks, numberOfPagesInrun, segmentTime);
        if (paths!=null && paths.length>0) {

            for (Path path : paths) {
                System.out.println("Fetch: " + path);
                fetcher.fetch(path, numberOfCores);
                System.out.println("Parse: " + path);
                parseSegment.parse(path);
            }
            System.out.println("Update: " + paths);
            crawlDb.update(crawlDB, paths, true, true);

        } else {
            stop = true;
        }
    }

    dumper.dump(new java.io.File("data/crawl/dump"),
            new java.io.File("data/crawl/segments"),
            tokenize("json"), true, true, false);


}

Выдает исключение на этапе выборки. Исключение -

13:34:00.564 [LocalJobRunner Map Task Executor #0] DEBUG org.apache.nutch.util.ObjectCache - No object cache found for conf=Configuration: core-default.xml, core-site.xml, mapred-default.xml, mapred-site.xml, yarn-default.xml, yarn-site.xml, hdfs-default.xml, hdfs-site.xml, file:/home/ishan/IdeaProjects/crawler/data/tmp/mapred/local/localRunner/ishan/job_local1687861686_0004/job_local1687861686_0004.xml, instantiating a new object cache
13:34:00.570 [LocalJobRunner Map Task Executor #0] WARN org.apache.nutch.parse.ParsePluginsReader - Unable to parse [null].Reason is [java.net.MalformedURLException]
java.io.IOException: Job failed!
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:836)
    at org.apache.nutch.fetcher.Fetcher.fetch(Fetcher.java:486)
    at au.com.sensis.WebCrawler.crawlWithNutch(WebCrawler.java:217)
    at au.com.sensis.WebCrawler.main(WebCrawler.java:46)

Я сделал все, что мог. Но все равно я не могу заставить его работать. Любая помощь будет оценена по достоинству. Я думаю, что он получает URL-адрес как «нулевой» и, следовательно, выбрасывает это исключение.

Вы должны убедиться, что nutch-default.xml добавлен в вашу конфигурацию (см. Класс NutchConfiguration). Похоже, что анализ файла parse-plugins.xml (определяемого свойством parse.plugin.file) завершился неудачно. Хотя сканирование можно выполнить напрямую, вызвав Java-метод Nutch, гораздо проще использовать предоставленные сценарии оболочки (bin / nutch и bin / crawl).

Sebastian Nagel 17.04.2018 13:16

Я добавил свойство - ("parse.plugin.file","data/conf/parse-plugins.xml"), но все равно не повезло. Я думаю, что он получает null как URL-адрес, который он не может получить. Не понимаю почему. Есть ли способ проверить, правильно ли работает этап генерации. В каталоге crawl_segment создается файл детали.

Ishan 17.04.2018 13:44

Да, это проще сделать с помощью bin / nutch, но это часть моего проекта, который также состоит из других функций. Это часть этого, и будет лучше, если я буду вызывать его функции через java.

Ishan 17.04.2018 13:45

Возможно, попробуйте NutchConfiguration.create() вместо new Configuration() и убедитесь, что папка Nutch conf/ является частью пути к классам.

Sebastian Nagel 17.04.2018 17:28

Пробовал. Не работает.

Ishan 18.04.2018 11:33

Просто чтобы проверить: как вызывается метод main (). Поскольку настройка пути к классам нетривиальна, рекомендуется использовать bin/nutch au.com.sensis.WebCrawler. Если вы сомневаетесь, начните с конфигурации по умолчанию с минимально необходимыми настройками (установите только http.agent.name). И взгляните на существующие методы main () (например, Fetcher.main ()).

Sebastian Nagel 18.04.2018 15:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
124
0

Другие вопросы по теме