stormcrawler慢速高延迟爬网300个域

1szpjjfi  于 2021-06-24  发布在  Storm
关注(0)|答案(2)|浏览(391)

我目前正在努力解决这个问题,因为大约3个月。爬虫似乎每10分钟抓取一次页面,但在这期间似乎什么也不做。总的来说吞吐量非常慢。我正在并行爬行300个域。每秒钟大约30页,爬行延迟10秒。目前大约是每秒2页。
拓扑结构在具有
8gb内存
普通硬盘
双核cpu
ubuntu 16.04版
elasticsearch安装在另一台规格相同的机器上。
在这里,您可以看到grafana Jmeter 板中的指标

它们还反映在storm ui中的进程延迟中:

我目前的stormcrawler架构是:

spouts:
  - id: "spout"
    className: "com.digitalpebble.stormcrawler.elasticsearch.persistence.AggregationSpout"
    parallelism: 25

bolts:
  - id: "partitioner"
    className: "com.digitalpebble.stormcrawler.bolt.URLPartitionerBolt"
    parallelism: 1
  - id: "fetcher"
    className: "com.digitalpebble.stormcrawler.bolt.FetcherBolt"
    parallelism: 6
  - id: "sitemap"
    className: "com.digitalpebble.stormcrawler.bolt.SiteMapParserBolt"
    parallelism: 1
  - id: "parse"
    className: "com.digitalpebble.stormcrawler.bolt.JSoupParserBolt"
    parallelism: 1
  - id: "index"
    className: "de.hpi.bpStormcrawler.BPIndexerBolt"
    parallelism: 1
  - id: "status"
    className: "com.digitalpebble.stormcrawler.elasticsearch.persistence.StatusUpdaterBolt"
    parallelism: 4
  - id: "status_metrics"
    className: "com.digitalpebble.stormcrawler.elasticsearch.metrics.StatusMetricsBolt"
    parallelism: 1

配置(这里是最相关的部分):

config:
  topology.workers: 1
  topology.message.timeout.secs: 300
  topology.max.spout.pending: 100
  topology.debug: false

  fetcher.threads.number: 50

  worker.heap.memory.mb: 2049
  partition.url.mode: byDomain

  fetcher.server.delay: 10.0

这里是风暴形态(也只是相关部分):

nimbus.childopts: "-Xmx1024m -Djava.net.preferIPv4Stack=true"

ui.childopts: "-Xmx768m -Djava.net.preferIPv4Stack=true"

supervisor.childopts: "-Djava.net.preferIPv4Stack=true"

worker.childopts: "-Xmx1500m -Djava.net.preferIPv4Stack=true"

你知道有什么问题吗?还是只是硬件的问题?
我已经试过了
将fetcher.server.delay增加到一个不改变任何内容的更高和更低的值
减少和增加获取程序线程的数量
玩弄平行性
如果是网络带宽,则计算。如果带宽为400mbit/s,平均页面大小为0.5MB,则为15mb/s,即120mbit/s,这也不是问题所在
增加工人数量
你还有什么想法,我应该检查或理由,可以解释缓慢的抓取?也许也只是硬件慢?或者瓶颈是elasticsearch?
事先非常感谢
编辑:
我将拓扑更改为两个worker,并且出现了一个重复的错误

2018-07-03 17:18:46.326 c.d.s.e.p.AggregationSpout Thread-33-spout-executor[26 26] [INFO] [spout #12]  Populating buffer with nextFetchDate <= 2018-06-21T17:52:42+02:00
2018-07-03 17:18:46.327 c.d.s.e.p.AggregationSpout I/O dispatcher 26 [ERROR] Exception with ES query
java.io.IOException: Unable to parse response body for Response{requestLine=POST /status/status/_search?typed_keys=true&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&preference=_shards%3A12&search_type=query_then_fetch&batched_reduce_size=512 HTTP/1.1, host=http://ts5565.byod.hpi.de:9200, response=HTTP/1.1 200 OK}
	at org.elasticsearch.client.RestHighLevelClient$1.onSuccess(RestHighLevelClient.java:548) [stormjar.jar:?]
	at org.elasticsearch.client.RestClient$FailureTrackingResponseListener.onSuccess(RestClient.java:600) [stormjar.jar:?]
	at org.elasticsearch.client.RestClient$1.completed(RestClient.java:355) [stormjar.jar:?]
	at org.elasticsearch.client.RestClient$1.completed(RestClient.java:346) [stormjar.jar:?]
	at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:119) [stormjar.jar:?]
	at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:177) [stormjar.jar:?]
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:436) [stormjar.jar:?]
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:326) [stormjar.jar:?]
	at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) [stormjar.jar:?]
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) [stormjar.jar:?]
	at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) [stormjar.jar:?]
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588) [stormjar.jar:?]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171]
Caused by: java.lang.NullPointerException

不过,爬行过程似乎更加平衡,但仍然无法获取大量链接

同样,在运行拓扑数周后,延迟也增加了很多

w9apscun

w9apscun1#

抱歉,回信迟了,刚放假回来。
从图中可以看出,worker被重新启动,这让我觉得有什么东西正在阻塞或破坏拓扑。过了一段时间什么也没发生,worker被重新启动,它处理了一些url,问题再次发生。
你检查过日志中的错误信息了吗?日志中是否有内存转储?你能找出引起这个问题的网址吗?

8aqjt8rx

8aqjt8rx2#

当你不这样做的时候就会发生 ack() 或者 fail() 所有(自定义)螺栓中的所有元组。另外,当从中间螺栓发出时,请确保将新元组正确地锚定到上一个元组。看看这个答案。
我也有同样的问题,还有es设置。我最初以为是关于 nextFetchDate es喷口的逻辑,但禁用自定义螺栓后,问题得到修复。所以我发现我错过了 ack() 一个元组。这导致未确认的元组在拓扑中丢失,然后将在10分钟/600秒后重新发出。
尽管我没有找到10分钟重播超时的定义,因为storm重播机制通过设置为5分钟 topology.message.timeout.secs: 300

相关问题