Custom IndexWriter never called on index command

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Custom IndexWriter never called on index command

Barnabás Balázs
Dear community!

I'm relatively new to Nutch 1.x and got stumped on an indexing issue.
I have a local Java application that sends Nutch jobs to a remote Hadoop deployment for execution. The jobs are sent in the following order:
Inject -> Generate -> Fetch -> Parse -> Index -> Update -> Invertlinks
Once a round is finished it starts over. The commands are of course configured based on the previous one's results (when necessary).

This setup seems to work, I can see that fetch gathers the correct urls for example. The problem is the Index stage. I implemented a custom IndexWriter that should send data to Couchbase buckets and Kafka Producers, however even though the plugin seems to construct correctly (I can see Kafka producer setup records in the reduce log), the open/write/update functions are never called. I put logs in each and also used remote debugging to make sure that they are really never called.
I also used a debugger inside the IndexerMapReduce class and to be honest I'm not sure where the IndexWriter is used, but the job definitely receives data (I saw the fetched urls).

I should mention that I also created an HTMLParseFilter plugin and that one works perfectly, so plugin deployment shouldn't be the issue. Also in the logs I can see the following:
Registered Plugins: ... Couchbase indexer (indexer-couchbase) ... org.apache.nutch.indexer.IndexWriters: Adding correct.package.Indexer
I've been stuck on this issue for a few days now, any help/ideas would be appreciated on why my IndexWriter is never called when running an Indexer job.

Best,
Barnabas
Reply | Threaded
Open this post in threaded view
|

Re: Custom IndexWriter never called on index command

Barnabás Balázs
Small followup tidbit:

The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the parseData/parseText is always null thus the function returns in line 261.

So the main question now:
Why is it the Indexer only receiving CrawlDatums when the Parse function executed before the Indexer creates the ParseData perfectly?
On 2017. 08. 09. 19:00:27, Barnabás Balázs <[hidden email]> wrote:
Dear community!

I'm relatively new to Nutch 1.x and got stumped on an indexing issue.
I have a local Java application that sends Nutch jobs to a remote Hadoop deployment for execution. The jobs are sent in the following order:
Inject -> Generate -> Fetch -> Parse -> Index -> Update -> Invertlinks
Once a round is finished it starts over. The commands are of course configured based on the previous one's results (when necessary).

This setup seems to work, I can see that fetch gathers the correct urls for example. The problem is the Index stage. I implemented a custom IndexWriter that should send data to Couchbase buckets and Kafka Producers, however even though the plugin seems to construct correctly (I can see Kafka producer setup records in the reduce log), the open/write/update functions are never called. I put logs in each and also used remote debugging to make sure that they are really never called.
I also used a debugger inside the IndexerMapReduce class and to be honest I'm not sure where the IndexWriter is used, but the job definitely receives data (I saw the fetched urls).

I should mention that I also created an HTMLParseFilter plugin and that one works perfectly, so plugin deployment shouldn't be the issue. Also in the logs I can see the following:
Registered Plugins: ... Couchbase indexer (indexer-couchbase) ... org.apache.nutch.indexer.IndexWriters: Adding correct.package.Indexer
I've been stuck on this issue for a few days now, any help/ideas would be appreciated on why my IndexWriter is never called when running an Indexer job.

Best,
Barnabas
Reply | Threaded
Open this post in threaded view
|

Re: Custom IndexWriter never called on index command

Sebastian Nagel
Hi Barnabas,

> The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the
> parseData/parseText is always null thus the function returns in line 261.

Parse data and text is stored in segments while the CrawlDatum may come from the CrawlDb.
Does the index job get the segment with the fetched and parsed pages passed as input?
If "parseData/parseText is always null" no segment is read (or the segment is empty).

Best,
Sebastian

On 08/09/2017 07:49 PM, Barnabás Balázs wrote:

> Small followup tidbit:
>
> The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the parseData/parseText is always null thus the function returns in line 261.
>
> So the main question now:
> Why is it the Indexer only receiving CrawlDatums when the Parse function executed before the Indexer creates the ParseData perfectly?
> On 2017. 08. 09. 19:00:27, Barnabás Balázs <[hidden email]> wrote:
> Dear community!
>
> I'm relatively new to Nutch 1.x and got stumped on an indexing issue.
> I have a local Java application that sends Nutch jobs to a remote Hadoop deployment for execution. The jobs are sent in the following order:
> Inject -> Generate -> Fetch -> Parse -> Index -> Update -> Invertlinks
> Once a round is finished it starts over. The commands are of course configured based on the previous one's results (when necessary).
>
> This setup seems to work, I can see that fetch gathers the correct urls for example. The problem is the Index stage. I implemented a custom IndexWriter that should send data to Couchbase buckets and Kafka Producers, however even though the plugin seems to construct correctly (I can see Kafka producer setup records in the reduce log), the open/write/update functions are never called. I put logs in each and also used remote debugging to make sure that they are really never called.
> I also used a debugger inside the IndexerMapReduce class and to be honest I'm not sure where the IndexWriter is used, but the job definitely receives data (I saw the fetched urls).
>
> I should mention that I also created an HTMLParseFilter plugin and that one works perfectly, so plugin deployment shouldn't be the issue. Also in the logs I can see the following:
> Registered Plugins: ... Couchbase indexer (indexer-couchbase) ... org.apache.nutch.indexer.IndexWriters: Adding correct.package.Indexer
> I've been stuck on this issue for a few days now, any help/ideas would be appreciated on why my IndexWriter is never called when running an Indexer job.
>
> Best,
> Barnabas
>

Reply | Threaded
Open this post in threaded view
|

Crawl issues and Custom IndexWriter never called on index command solution

Barnabás Balázs
Dear Nutch Community,
Thanks for the answer, as it turned out my issue was with the segments, I used the folder in which my segments reside as a parameter instead of the specific segment folder. Changing this solved my issue, so thank you. 
I spent a few days playing around with my crawl setup and ran into a few issues. For the crawl i'm using the libselenium plugin and phantomjs. In the usual setup the generate runs with topN=10000 and the fetcher gets 100 threads.
1. I set the topN parameter of our generate job to a low number (100) to test how well the adaptive crawling changes around the crawled URLs. What I experienced was that mostly the same URLs were fetched and only few (8-10) changed between crawls. The following relevant configurations are set:
db.fetch.interval.default = "3600" db.fetch.schedule.class = "org.apache.nutch.crawl.AdaptiveFetchSchedule" db.fetch.schedule.adaptive.min_interval = "1200" db.fetch.schedule.adaptive.inc_rate = "0.4" db.fetch.schedule.adaptive.dec_rate = "0.2" db.fetch.schedule.adaptive.sync_delta = "true" db.fetch.schedule.adaptive.sync_delta_rate = "0.3"

The main goal would be to have a large scale crawl that only fetches often-changing sites regularly.
2.  I'm seeing quite a lot of UnkownHostException errors for example:
2017-08-16 15:23:28,099 INFO [FetcherThread] org.apache.nutch.protocol.http.api.HttpRobotRulesParser: Couldn't get robots.txt for http://www.tomgeorge.hu/phplapozo/tgkepek.php: java.net.UnknownHostException: www.tomgeorge.hu 2017-08-16 15:23:28,099 ERROR [FetcherThread] org.apache.nutch.protocol.selenium.Http: Failed to get protocol output

I managed to ping the failing sites on the machine where the jobs are running, so I'm not sure how it could be a DNS setting.

3. Selenium throws NoSuchElementExceptions:
2017-08-16 15:28:14,963 ERROR [FetcherThread] org.apache.nutch.protocol.selenium.Http: Failed to get protocol output java.lang.RuntimeException: org.openqa.selenium.NoSuchElementException: {"errorMessage":"Unable to find element with tag name 'body'","request":{"headers":{"Accept-Encoding":"gzip,deflate","Connection":"Keep-Alive","Content-Length":"35","Content-Type":"application/json; charset=utf-8","Host":"localhost:32377","User-Agent":"Apache-HttpClient/4.5.2 (Java/1.8.0_144)"},"httpVersion":"1.1","method":"POST","post":"{\"using\":\"tag name\",\"value\":\"body\"}","url":"/element","urlParsed":{"anchor":"","query":"","file":"element","directory":"/","path":"/element","relative":"/element","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/element","queryKey":{},"chunks":["element"]},"urlOriginal":"/session/7eec7df0-8297-11e7-b678-71c58580ccf2/element"}} Command duration or timeout: 288 milliseconds

I'm seeing this one a lot, not sure what the issue could be. Opened some of the links and there is definitely a <body> tag in their HTML.

4. Encoding issues pop up with some of the robots.txt files. I checked out of multiple of these and they seem fine (no special characters or anything as far as I can tell). This is what the exception looks like:
2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Problem processing robots.txt for http://www.zeneszmagazin.hu/nyitolap.html 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): ????n?0 ?? ?z=`?b[iW`( 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): ? 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): ?] ??8??Ii???$???n??\?'?<???;r?J-??p????????{}?Y???9??????q?x???]Lk?'?<VsK????L^?_?v??????>3??9l9??-+????S"????????P???Q5???x5o?? 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): '?2?:2>???(?z?

5. Crawling AngularJS/Angular2 is not working properly, I tried multiple sites using one of these frameworks, but it seems I'm always getting the 'unloaded' version as the html I'm getting often only consist of a "Loading..." text or something similar.
I tried to set page load delay, but I'm not sure if it's actually working:
page.load.delay = "10"
libselenium.page.load.delay = "10"
selenium.page.load.delay = "10"
Some of the above issues could be because of the faulty data received from some of these sites, auto-skipping those could be an acceptable solution if we can predictably detect those cases.

Anyway, I'd appreciate any help I could get with any of the above issues. :)

Thanks, 
Barnabas
------ Forwarded Message --------
From: Sebastian Nagel <[hidden email]>
Date: 2017-08-10 09:34:06
Subject: Re: Custom IndexWriter never called on index command
To: [hidden email]

Hi Barnabas,

> The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the
> parseData/parseText is always null thus the function returns in line 261.

Parse data and text is stored in segments while the CrawlDatum may come from the CrawlDb.
Does the index job get the segment with the fetched and parsed pages passed as input?
If "parseData/parseText is always null" no segment is read (or the segment is empty).

Best,
Sebastian

On 08/09/2017 07:49 PM, Barnabás Balázs wrote:

> Small followup tidbit:
>
> The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the parseData/parseText is always null thus the function returns in line 261.
>
> So the main question now:
> Why is it the Indexer only receiving CrawlDatums when the Parse function executed before the Indexer creates the ParseData perfectly?
> On 2017. 08. 09. 19:00:27, Barnabás Balázs wrote:
> Dear community!
>
> I'm relatively new to Nutch 1.x and got stumped on an indexing issue.
> I have a local Java application that sends Nutch jobs to a remote Hadoop deployment for execution. The jobs are sent in the following order:
> Inject -> Generate -> Fetch -> Parse -> Index -> Update -> Invertlinks
> Once a round is finished it starts over. The commands are of course configured based on the previous one's results (when necessary).
>
> This setup seems to work, I can see that fetch gathers the correct urls for example. The problem is the Index stage. I implemented a custom IndexWriter that should send data to Couchbase buckets and Kafka Producers, however even though the plugin seems to construct correctly (I can see Kafka producer setup records in the reduce log), the open/write/update functions are never called. I put logs in each and also used remote debugging to make sure that they are really never called.
> I also used a debugger inside the IndexerMapReduce class and to be honest I'm not sure where the IndexWriter is used, but the job definitely receives data (I saw the fetched urls).
>
> I should mention that I also created an HTMLParseFilter plugin and that one works perfectly, so plugin deployment shouldn't be the issue. Also in the logs I can see the following:
> Registered Plugins: ... Couchbase indexer (indexer-couchbase) ... org.apache.nutch.indexer.IndexWriters: Adding correct.package.Indexer
> I've been stuck on this issue for a few days now, any help/ideas would be appreciated on why my IndexWriter is never called when running an Indexer job.
>
> Best,
> Barnabas
>

Reply | Threaded
Open this post in threaded view
|

Re: Crawl issues and Custom IndexWriter never called on index command solution

Barnabás Balázs
Hi,

Sadly I haven't been able to progress with these issues, by any chance does anyone in the community know, how any of these problems could be solved?
On 2017. 08. 17. 12:00:32, Barnabás Balázs <[hidden email]> wrote:
Dear Nutch Community,
Thanks for the answer, as it turned out my issue was with the segments, I used the folder in which my segments reside as a parameter instead of the specific segment folder. Changing this solved my issue, so thank you. 
I spent a few days playing around with my crawl setup and ran into a few issues. For the crawl i'm using the libselenium plugin and phantomjs. In the usual setup the generate runs with topN=10000 and the fetcher gets 100 threads.
1. I set the topN parameter of our generate job to a low number (100) to test how well the adaptive crawling changes around the crawled URLs. What I experienced was that mostly the same URLs were fetched and only few (8-10) changed between crawls. The following relevant configurations are set:
db.fetch.interval.default = "3600" db.fetch.schedule.class = "org.apache.nutch.crawl.AdaptiveFetchSchedule" db.fetch.schedule.adaptive.min_interval = "1200" db.fetch.schedule.adaptive.inc_rate = "0.4" db.fetch.schedule.adaptive.dec_rate = "0.2" db.fetch.schedule.adaptive.sync_delta = "true" db.fetch.schedule.adaptive.sync_delta_rate = "0.3"

The main goal would be to have a large scale crawl that only fetches often-changing sites regularly.
2.  I'm seeing quite a lot of UnkownHostException errors for example:
2017-08-16 15:23:28,099 INFO [FetcherThread] org.apache.nutch.protocol.http.api.HttpRobotRulesParser: Couldn't get robots.txt for http://www.tomgeorge.hu/phplapozo/tgkepek.php: java.net.UnknownHostException: www.tomgeorge.hu 2017-08-16 15:23:28,099 ERROR [FetcherThread] org.apache.nutch.protocol.selenium.Http: Failed to get protocol output

I managed to ping the failing sites on the machine where the jobs are running, so I'm not sure how it could be a DNS setting.

3. Selenium throws NoSuchElementExceptions:
2017-08-16 15:28:14,963 ERROR [FetcherThread] org.apache.nutch.protocol.selenium.Http: Failed to get protocol output java.lang.RuntimeException: org.openqa.selenium.NoSuchElementException: {"errorMessage":"Unable to find element with tag name 'body'","request":{"headers":{"Accept-Encoding":"gzip,deflate","Connection":"Keep-Alive","Content-Length":"35","Content-Type":"application/json; charset=utf-8","Host":"localhost:32377","User-Agent":"Apache-HttpClient/4.5.2 (Java/1.8.0_144)"},"httpVersion":"1.1","method":"POST","post":"{\"using\":\"tag name\",\"value\":\"body\"}","url":"/element","urlParsed":{"anchor":"","query":"","file":"element","directory":"/","path":"/element","relative":"/element","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/element","queryKey":{},"chunks":["element"]},"urlOriginal":"/session/7eec7df0-8297-11e7-b678-71c58580ccf2/element"}} Command duration or timeout: 288 milliseconds

I'm seeing this one a lot, not sure what the issue could be. Opened some of the links and there is definitely a <body> tag in their HTML.

4. Encoding issues pop up with some of the robots.txt files. I checked out of multiple of these and they seem fine (no special characters or anything as far as I can tell). This is what the exception looks like:
2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Problem processing robots.txt for http://www.zeneszmagazin.hu/nyitolap.html 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): ????n?0???z=`?b[iW`( 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): ? 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): ?]??8??Ii???$???n??\?'?<???;r?J-??p????????{}?Y???9??????q?x???]Lk?'?<VsK????L^?_?v??????>3??9l9??-+????S"????????P???Q5???x5o?? 2017-08-16 15:24:37,765 WARN [FetcherThread] crawlercommons.robots.SimpleRobotRulesParser: Unknown line in robots.txt file (size 551): '?2?:2>???(?z?

5. Crawling AngularJS/Angular2 is not working properly, I tried multiple sites using one of these frameworks, but it seems I'm always getting the 'unloaded' version as the html I'm getting often only consist of a "Loading..." text or something similar.
I tried to set page load delay, but I'm not sure if it's actually working:
page.load.delay = "10"
libselenium.page.load.delay = "10"
selenium.page.load.delay = "10"
Some of the above issues could be because of the faulty data received from some of these sites, auto-skipping those could be an acceptable solution if we can predictably detect those cases.

Anyway, I'd appreciate any help I could get with any of the above issues. :)

Thanks, 
Barnabas
------ Forwarded Message --------
From: Sebastian Nagel <[hidden email]>
Date: 2017-08-10 09:34:06
Subject: Re: Custom IndexWriter never called on index command
To: [hidden email]

Hi Barnabas,

> The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the
> parseData/parseText is always null thus the function returns in line 261.

Parse data and text is stored in segments while the CrawlDatum may come from the CrawlDb.
Does the index job get the segment with the fetched and parsed pages passed as input?
If "parseData/parseText is always null" no segment is read (or the segment is empty).

Best,
Sebastian

On 08/09/2017 07:49 PM, Barnabás Balázs wrote:

> Small followup tidbit:
>
> The reduce function of IndexerMapReduce only receives CrawlDatums (line 198) the parseData/parseText is always null thus the function returns in line 261.
>
> So the main question now:
> Why is it the Indexer only receiving CrawlDatums when the Parse function executed before the Indexer creates the ParseData perfectly?
> On 2017. 08. 09. 19:00:27, Barnabás Balázs wrote:
> Dear community!
>
> I'm relatively new to Nutch 1.x and got stumped on an indexing issue.
> I have a local Java application that sends Nutch jobs to a remote Hadoop deployment for execution. The jobs are sent in the following order:
> Inject -> Generate -> Fetch -> Parse -> Index -> Update -> Invertlinks
> Once a round is finished it starts over. The commands are of course configured based on the previous one's results (when necessary).
>
> This setup seems to work, I can see that fetch gathers the correct urls for example. The problem is the Index stage. I implemented a custom IndexWriter that should send data to Couchbase buckets and Kafka Producers, however even though the plugin seems to construct correctly (I can see Kafka producer setup records in the reduce log), the open/write/update functions are never called. I put logs in each and also used remote debugging to make sure that they are really never called.
> I also used a debugger inside the IndexerMapReduce class and to be honest I'm not sure where the IndexWriter is used, but the job definitely receives data (I saw the fetched urls).
>
> I should mention that I also created an HTMLParseFilter plugin and that one works perfectly, so plugin deployment shouldn't be the issue. Also in the logs I can see the following:
> Registered Plugins: ... Couchbase indexer (indexer-couchbase) ... org.apache.nutch.indexer.IndexWriters: Adding correct.package.Indexer
> I've been stuck on this issue for a few days now, any help/ideas would be appreciated on why my IndexWriter is never called when running an Indexer job.
>
> Best,
> Barnabas
>