0

当我们增加线程数或 Fetcher Bolt 的执行程序数时,我们一直收到以下错误。

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:286) ~[stormjar.jar:?]
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263) ~[stormjar.jar:?]
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190) ~[stormjar.jar:?]
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) ~[stormjar.jar:?]
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[stormjar.jar:?]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71) ~[stormjar.jar:?]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:220) ~[stormjar.jar:?]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:164) ~[stormjar.jar:?]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:139) ~[stormjar.jar:?]
at com.digitalpebble.stormcrawler.protocol.httpclient.HttpProtocol.getProtocolOutput(HttpProtocol.java:206) ~[stormjar.jar:?]

这是由于资源泄漏还是对 http 线程池大小的一些硬限制?如果是关于线程池,有没有办法增加池大小?

4

1 回答 1

0

HttpProtocol中设置的池的最大连接数是使用的线程数(fetcher.threads.number)。由于池是静态的,它被同一个工作人员上的所有执行程序使用。我建议您为每个工作人员使用一个 FetcherBolt 实例,然后它的值将与 fetcher.threads.number 相同,并且您不会遇到此问题。

或者,您可以尝试使用okhttp 协议。它对于开放和大规模的爬网更加健壮。有关功能比较,请参阅协议上的 WIKI 页面。

于 2018-03-07T11:08:53.397 回答