heritrixキャプチャ速度の向上
最近ずっとheritrixでウェブサイトを登って、夜heritrixはずっと運行して、しかし不思議なことにheritrixはスピードをつかんでとても遅くて、1つのウェブサイトをつかんで、8時間余り使って、意外にも運行し終わっていません.そこでLOGに基づいて遅い原因を分析してみました
SNOOZED QUeneの中にはずっとそこにある画像があり、かなり長い間稼働していました.
ブラウザで開くと、その画像は存在しないので、その画像はずっとQUENEの中にあります.
次にheritrixのコードを分析しました.
workQueneFrontierには次のコードがあります.画像が存在しないためneedsRetryingコードブロックに入ります.
retryDelayForメソッドは、失敗をキャプチャし、待機時間を計算するために使用されます.コードは次のとおりです.
heritrixはデフォルトで900秒待ち、つまり15分なので、キャプチャに失敗しても1時間に4回、8時間に32回しか実行できないので、ずっと実行しているのも無理はないでしょう.
原因がわかったらやりやすいので、プロファイルを修正します.
これはheritrix 3の構成で、時間を90秒に変更し、つまり1分半しか待つことができません.
H 1の構成であれば、管理インタフェースで構成できます.
速度を変えてみると、8時間で1つのサイトを登ることができたが、今は2時間でいい.
もう一度heritrixを使えば
インクリメンタルキャプチャでは、次にこのWebサイトをキャプチャすると、速度が大幅に増加します.これで問題は解決した
-----===== SNOOZED QUEUES =====-----
SNOOZED#0:
Queue us,imageshack,img245,+2 (p1)
1 items
wakes in: 99m19s74ms
last enqueued: http://img245.xxx.us/img245/596/193183637x01ss500sclzzzbx0.jpg last peeked: http://img245.xxxx.us/img245/596/193183637x01ss500sclzzzbx0.jpg total expended: 12 (total budget: -1)
active balance: 2988
last(avg) cost: 1(1)
totalScheduled fetchSuccesses fetchFailures fetchDisregards fetchResponses robotsDenials successBytes totalBytes fetchNonResponses
2 1 0 0 1 0 59 59 12
SimplePrecedenceProvider
1
SNOOZED QUeneの中にはずっとそこにある画像があり、かなり長い間稼働していました.
ブラウザで開くと、その画像は存在しないので、その画像はずっとQUENEの中にあります.
次にheritrixのコードを分析しました.
workQueneFrontierには次のコードがあります.画像が存在しないためneedsRetryingコードブロックに入ります.
if (needsRetrying(curi)) {
// Consider errors which can be retried, leaving uri atop queue
if(curi.getFetchStatus()!=S_DEFERRED) {
wq.expend(curi.getHolderCost()); // all retries but DEFERRED cost
}
long delay_sec = retryDelayFor(curi);
curi.processingCleanup(); // lose state that shouldn't burden retry
wq.unpeek(curi);
// TODO: consider if this should happen automatically inside unpeek()
wq.update(this, curi); // rewrite any changes
if (delay_sec > 0) {
long delay_ms = delay_sec * 1000;
snoozeQueue(wq, now, delay_ms);
} else {
reenqueueQueue(wq);
}
// Let everyone interested know that it will be retried.
appCtx.publishEvent(
new CrawlURIDispositionEvent(this,curi,DEFERRED_FOR_RETRY));
doJournalRescheduled(curi);
return;
}
retryDelayForメソッドは、失敗をキャプチャし、待機時間を計算するために使用されます.コードは次のとおりです.
/**
* Return a suitable value to wait before retrying the given URI.
*
* @param curi
* CrawlURI to be retried
* @return millisecond delay before retry
*/
protected long retryDelayFor(CrawlURI curi) {
int status = curi.getFetchStatus();
return (status == S_CONNECT_FAILED || status == S_CONNECT_LOST ||
status == S_DOMAIN_UNRESOLVABLE)? getRetryDelaySeconds() : 0;
// no delay for most
}
public int getRetryDelaySeconds() {
return (Integer) kp.get("retryDelaySeconds");
}
heritrixはデフォルトで900秒待ち、つまり15分なので、キャプチャに失敗しても1時間に4回、8時間に32回しか実行できないので、ずっと実行しているのも無理はないでしょう.
/** for retryable problems, seconds to wait before a retry */
{
setRetryDelaySeconds(900);
}
原因がわかったらやりやすいので、プロファイルを修正します.
<!-- FRONTIER: Record of all URIs discovered and queued-for-collection -->
<bean id="frontier"
class="org.archive.crawler.frontier.BdbFrontier">
<!-- <property name="holdQueues" value="true" /> -->
<!-- <property name="queueTotalBudget" value="-1" /> -->
<!-- <property name="balanceReplenishAmount" value="3000" /> -->
<!-- <property name="errorPenaltyAmount" value="100" /> -->
<!-- <property name="precedenceFloor" value="255" /> -->
<!-- <property name="queuePrecedencePolicy">
<bean class="org.archive.crawler.frontier.precedence.BaseQueuePrecedencePolicy" />
</property> -->
<!-- <property name="snoozeLongMs" value="300000" /> -->
<property name="retryDelaySeconds" value="90" />
<!-- <property name="maxRetries" value="30" /> -->
<!-- <property name="recoveryDir" value="logs" /> -->
<!-- <property name="recoveryLogEnabled" value="true" /> -->
<!-- <property name="maxOutlinks" value="6000" /> -->
<!-- <property name="outboundQueueCapacity" value="50" /> -->
<!-- <property name="inboundQueueMultiple" value="3" /> -->
<!-- <property name="dumpPendingAtClose" value="false" /> -->
</bean>
これはheritrix 3の構成で、時間を90秒に変更し、つまり1分半しか待つことができません.
H 1の構成であれば、管理インタフェースで構成できます.
速度を変えてみると、8時間で1つのサイトを登ることができたが、今は2時間でいい.
もう一度heritrixを使えば
インクリメンタルキャプチャでは、次にこのWebサイトをキャプチャすると、速度が大幅に増加します.これで問題は解決した