ファイルクロールでEsAccessExceptionが発生する

Windowsサーバのファイルクロールにおいて、下記Exceptionが発生して該当ファイルがインデクシングされない現象が発生しております。

org.codelibs.fess.crawler.exception.EsAccessException: Failed to insert sKsJ7IEBIbI26gy_v8Pv-1.c21iOi8vSnJkNjg3NS8xMF_ntYTnuZTliKUvMTkwX-aKgOihky_jgqLjgq_jgrvjgrnliLbpmZAvMDAyX-ijveWTgeWIpS_ilqAwMTBf6KeS44OB44OD44OXKOaWsOS9k-ezuzIwMjAwOTExfikvMDcwMF_lpInmm7TotbfmoYhf6KeS44OB44OD44OXL-KXhuWkieabtOWujOS6hi9DQy1NTy1FUkotMjEtMDEzIFAwMyBTUFDlsI7lhaUv6KmV5L6h57WQ5p6cL3REYXRhLnhsc3gat org.codelibs.fess.crawler.service.impl.AbstractCrawlerService.insert(AbstractCrawlerService.java:232)at org.codelibs.fess.crawler.service.impl.EsDataService.store(EsDataService.java:59)at org.codelibs.fess.crawler.service.impl.EsDataService.store(EsDataService.java:40)at org.codelibs.fess.crawler.processor.impl.DefaultResponseProcessor.processResult(DefaultResponseProcessor.java:124)at org.codelibs.fess.crawler.processor.impl.DefaultResponseProcessor.process(DefaultResponseProcessor.java:79)at org.codelibs.fess.crawler.CrawlerThread.processResponse(CrawlerThread.java:287)at org.codelibs.fess.crawler.FessCrawlerThread.processResponse(FessCrawlerThread.java:238)at org.codelibs.fess.crawler.CrawlerThread.run(CrawlerThread.java:162)at java.base/java.lang.Thread.run(Thread.java:834)Caused by: org.codelibs.curl.CurlException: Failed to access to http://localhost:9201/.crawler.data/_doc/sKsJ7IEBIbI26gy_v8Pv-1.c21iOi8vSnJkNjg3NS8xMF_ntYTnuZTliKUvMTkwX-aKgOihky_jgqLjgq_jgrvjgrnliLbpmZAvMDAyX-ijveWTgeWIpS_ilqAwMTBf6KeS44OB44OD44OXKOaWsOS9k-ezuzIwMjAwOTExfikvMDcwMF_lpInmm7TotbfmoYhf6KeS44OB44OD44OXL-KXhuWkieabtOWujOS6hi9DQy1NTy1FUkotMjEtMDEzIFAwMyBTUFDlsI7lhaUv6KmV5L6h57WQ5p6cL3REYXRhLnhsc3g?timeout=1m&refresh=true&op_type=createat org.codelibs.curl.CurlRequest.lambda$connect$3(CurlRequest.java:201)at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)Caused by: org.codelibs.curl.CurlException: Failed to write a response.at org.codelibs.curl.CurlRequest$RequestProcessor.writeContent(CurlRequest.java:326)at org.codelibs.curl.CurlRequest$RequestProcessor.accept(CurlRequest.java:274)at org.codelibs.curl.CurlRequest.lambda$execute$4(CurlRequest.java:218)at org.codelibs.curl.CurlRequest.lambda$connect$3(CurlRequest.java:199)… 6 moreCaused by: java.io.IOException: Stream closedat java.base/java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:165)at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252)at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:292)at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:351)at java.base/java.io.FilterInputStream.read(FilterInputStream.java:107)at org.codelibs.curl.CurlRequest$RequestProcessor.writeContent(CurlRequest.java:301)… 9 more

Exceptionが発生したのは80MB程度のExcelファイルです。
調べた結果、ここまでは確認できております。
・1ファイルのみ指定してクロールしても上記Exceptionが発生する
・クロール間隔を増やしても上記Exceptionが発生する(1000ミリ秒→5000ミリ秒)
・ファイルサイズが原因の可能性を考えて他にもExcelファイルをクロール検証してみたところ
90MB超のExcelファイルが問題なくクロールできた

原因について分かる事、調査すると良さそうな点などございましたら、ご教示いただけませんでしょうか?
よろしくお願い致します。

fess-13.16.0 ※Elasticsearch連携なしで利用
jdk-11.0.10

※Elasticsearch連携なしで利用

組み込みElasticsearchは手軽なただのお試し版でしかないので、問題があれば、Docker版などを利用して、Elasticsearchとの連携した環境で試してください。

shinsuke様
Elasticsearch連携した方が安定動作するという事で理解いたしました。
現構成を維持してパラメータ変更等で対応できればという思いだったのですが、
解決が難しい場合はElasticsearch連携を試す方向でも検討を進めてみようと思います。
ご回答ありがとうございました。

この現象ですが、単純なファイルサイズではなく、クロールの際にテキスト化されたデータ量によって、Elasticsearch への書き込みがタイムアウトすると発生しました。

例えば、500万行のデータと、グラフのシートがあるようなファイルです。

Elasticsearch 側をチューニングしても変化なく、?timeout=1m のリクエストパラメーターが固定のため、ソースの変更が必要かもしれません。

contentlength.xml で、defaultMaxLength を 200MB などに設定すると、この問題に遭遇しやすくなりますが、運用で対処しています。

zolgear様
情報いただきありがとうございます。
確かにdefaultMaxLength を 10MBから100MBに変更して以降、本Exceptionが発生するようになっていました。

Exceptionが発生するExcel(80MB)を開いた場合は、開く迄に20秒ほどかかったのに対し、問題のなかったExcelファイル(90MB)は2秒ほどで開くので、ご指摘のとおり単純なファイルサイズというよりもテキスト量などが関係していそうです。

タイムアウトする時間の延長を行うにはソース変更が必要なのですね。
そこまでの対応は難しいので、せめてエラー検知してインデクシングできなかったファイルをリストアップしておくに留める方向で考え始めています。
差支えなければで結構なのですが、本問題を運用で対処されているとのこと、どのような対処をされているのかご参考までお教えいただけませんでしょうか?
よろしくお願い致します。

ほぼ同じ条件ですね!
ファイルオープンに20秒掛かるようなファイルは、クロール時の処理(FESSが呼び出す別のOSS)にも同程度の時間がかかり、未チューニングだと今回の例外や、クロールタイムアウト、サムネイル生成ができないという問題が出ます。

FESSが利用する多数のOSSを理解するのはとても時間が掛かるため、商用サポートを依頼できるならば、それがベストだと思います。

幸い、巨大なエクセルは少数だった為、マニュアル・ヘルプにて検索できないファイルの条件を示しています。

管理APIを駆使して、障害URL を取得してリストアップの自動化…はできそうなんですが、数件なので目視で対処しています。

zolgear様
ご回答ありがとうございます、大変参考になります。
まだ検証中といった位置づけのため、今後本格利用するとなった際に、確実にクロールする必要があるとなれば有償サポートを検討しようと思います。
当方でも同じく、本Exceptionが発生するのは数ファイルのみなので、当面は障害URLからチェックする手順を追加することで対応していこうと思います。
リストアップ自動化という方法についてはまだ把握しておりませんでしたので、
今後の状況次第でこちらの方法も調査進められればと思っております。
有用な情報をいただき、助かりました。簡単で恐縮ですがお礼まで。

1 Like