solr 9.8.0 とデータインポートハンドラ | KandaSearch Community Support Forum

solr 9.8.0 とデータインポートハンドラ

トピック作成者:ks-solruserml-bot (2025/04/30 11:33 投稿)
7
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/0yj4f495wr0dp4xk7f7ykl870w18j2t9 into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

要約:

複数回のデルタインポートを実行すると、Solr がインポートに失敗し、Solr アプリケーションを停止・再起動しない限りインポートできなくなる。

複数回のフルインポートを実行しても同様に、Solr はインポートに失敗し、アプリケーションの停止と再起動が必要になる。

Solr は再起動後は正常に動作するが、それ以降インポート処理は行われない。

4回目のデルタインポートまたは6回目のフルインポートの際に、read call の例外が発生。


例外メッセージ:

rt.DataImportHandlerException: Unable to execute query: select mds.id,
mds.defn_id, mdef.md_key, mdsddd.id PICK_ID, mdsddd.code
CUSTOM_MD_DEFN_DROP_DOWN FROM custom_md mds  LEFT OUTER JOIN
custom_md_defn mdef ON mds.defn_id=mdef.id  LEFT OUTER JOIN
custom_md_defn_drop_down mdsddd ON mds.pick_id=mdsddd.id  WHERE
mds.pick_id IS NOT null AND asset_id='8' Processing Document # 1
    at
org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:69)
org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to
execute query: select mds.id, mds.defn_id, mdef.md_key, mdsddd.id
PICK_ID, mdsddd.code CUSTOM_MD_DEFN_DROP_DOWN FROM custom_md mds  LEFT
OUTER JOIN custom_md_defn mdef ON mds.defn_id=mdef.id  LEFT OUTER JOIN
custom_md_defn_drop_down mdsddd ON mds.pick_id=mdsddd.id  WHERE
mds.pick_id IS NOT null AND asset_id='8' Processing Document # 1
    at
org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:69)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:326)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource.createResultSetIterator(JdbcDataSource.java:287)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:282)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:51)
~[?:?]
    at
org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:59)
~[?:?]
    at
org.apache.solr.handler.dataimport.SqlEntityProcessor.nextRow(SqlEntityProcessor.java:73)
~[?:?]
    at
org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:267)
~[?:?]
    at
org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:494)
~[?:?]
    at
org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:535)
~[?:?]
    at
org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:433)
~[?:?]
    at
org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:348)
~[?:?]
    at
org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:236)
~[?:?]
    at
org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:424)
~[?:?]
    at
org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:483)
~[?:?]
    at
org.apache.solr.handler.dataimport.DataImporter.lambda$runAsync$0(DataImporter.java:466)
~[?:?]
    at java.base/java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.sql.SQLRecoverableException: IO Error: Got minus one
from a read call
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:854)
~[?:?]
    at
oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793)
~[?:?]
    at
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57)
~[?:?]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747)
~[?:?]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$1.call(JdbcDataSource.java:191)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$1.call(JdbcDataSource.java:171)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource.getConnection(JdbcDataSource.java:527)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:316)
~[?:?]
    ... 15 more
Caused by: oracle.net.ns.NetException: Got minus one from a read call
    at oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:557)
~[?:?]
    at oracle.net.ns.NIOPacket.readNIOPacket(NIOPacket.java:403) ~[?:?]
    at
oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:127)
~[?:?]
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:340) ~[?:?]
    at
oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1596) ~[?:?]
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:588)
~[?:?]
    at
oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793)
~[?:?]
    at
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57)
~[?:?]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747)
~[?:?]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$1.call(JdbcDataSource.java:191)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$1.call(JdbcDataSource.java:171)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource.getConnection(JdbcDataSource.java:527)
~[?:?]
    at
org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:316)
~[?:?]
    ... 15 more

このエラーは Processing Document # 1(1件目のドキュメント処理中)に発生し、クエリ実行時に read call が失敗している様子が見られます。


例外の原因の一つとして、以下のようなエラーも発生しています:

Caused by: java.sql.SQLRecoverableException: IO Error: Got minus one from a read call

これは、ソケット通信のエラーによるもので、データベースへの接続が失敗していることを示しています。

さらに深く追うと:

Caused by: oracle.net.ns.NetException: Got minus one from a read call

重要な点:

  • このエラーはインポート中、またはインポート後に Solr をシャットダウンしたときに頻繁に発生。
  • JDBC 接続が正しくクローズされていないことが原因と思われる。
  • 実際にログにも、リソースリークの可能性を示すメッセージが多数表示されている:
JdbcDataSource was not closed prior to finalize(), indicates a bug -- POSSIBLE RESOURCE LEAK!!!

このメッセージは、JdbcDataSource が使用後に明示的にクローズされていないことを示しており、アプリケーション内にバグがある可能性を指摘しています。


補足:

このような状況は、データベース接続を明示的に閉じないまま放置することに起因します。これは多くのプロジェクトで実際に問題となるケースであり、接続が使われた後は確実に close() でクローズする必要があります。

返信投稿者:ks-solruserml-bot (2025/04/30 11:34 投稿)

こんにちは、Mike。

まず最初に、DIH(DataImportHandler)はSolr本体から分離され、現在は以下の場所でメンテナンスされています:
https://github.com/SearchScale/dataimporthandler

個人的には、deltaImport(増分インポート)には頼らず、特別な形式のSQL SELECT文を使ったfull import(全件インポート)で対応するようにしています。

full import がハングするのは問題です。ヒープメモリが十分か確認してみてください。必要であれば拡張してください。可能であればヒープダンプも確認してみてください。

oracle.net.ns.NetException: Got minus one from a read call」は、ドライバかシステム固有の問題であり、DIHのせいにはできません。

全体として、DIHは現在ではやや時代遅れのETLソリューションかもしれません。

ところで、Solrはスタンドアロンで使っていますか?それともSolrCloudモードで動かしていますか?

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2025/04/30 11:34 投稿)

参考までに言うと、私たちは delta import を動作させることが一度もできませんでした。DIH が Solr 本体の一部だった頃でさえも、です。
full import に関しても onError 設定で十分な問題がありましたが、それでも一応実行されて、大部分のデータはインポートされました…。

— Dima

返信投稿者:ks-solruserml-bot (2025/04/30 11:34 投稿)

いつからおかしくなったんでしょうか?
私たちは Solr 8.4.1 を使用していて、full import も delta import も問題なく動作しています。
ただ、ログ関連のセキュリティ脆弱性(CVE)がないバージョンの Solr に移行する必要があり、私たちは DIH に依存しています。

DIH プロジェクトのみに連絡を取るためのメーリングリストや連絡方法はありますか?

DIH は MariaDB にしか対応していない、というのは誤解を招く表現だと思います。
正確に言えば、「MariaDB の JDBC ドライバだけが DIH の Git プロジェクトに含まれている」と言うべきではないでしょうか。
他のデータベースと連携させるには、該当する JDBC ドライバをアップロードし、data-config.xml に正しい SQL を記述すれば済む話です。

私たちのプロジェクトは、Solr インデックスを常に最新の状態に保つために、完全に Data Import Handler に依存しています。

返信投稿者:ks-solruserml-bot (2025/04/30 11:35 投稿)

こちらにホストされています:
https://github.com/SearchScale/dataimporthandler

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2025/04/30 11:35 投稿)

確かに、スキーマが十分に単純で、データがクリーンで、できれば各テーブルに「最終更新日時」の列があれば、うまく動作するでしょう。
でも、私たちのソースデータベースにはそれがないんですよ。

— Dima

返信投稿者:ks-solruserml-bot (2025/04/30 11:35 投稿)

私のデータベースへの接続数は次のように増加します:

  • フルインポート1回目後:25接続
  • フルインポート2回目後:50接続
  • フルインポート3回目後:73接続
  • フルインポート4回目後:90接続

そして、「読み取り時の例外」が発生します。これは間違いなく、データベース接続がクリーンアップされていないことに関連しています。

Solrをシャットダウンすると、接続はすべてクリアされます。Solrを再起動して4回フルインポートを実行すると、接続数は再び同じように増加し、最終的に失敗します。

これはおそらく、リソースの問題で、接続が解放されないことが原因です。

「oracle.net.ns.NetException: Got minus one from a read call」というエラーは、ドライバやシステム特有の問題であり、DIHのせいにするのは難しいです。ただし、DIHは今日ではやや古いETLソリューションかもしれません。

ちなみに、Solrはスタンドアロンモードで実行していますか?それともSolrCloudモードですか?

一方、バージョン8.4.1でフルインポートを実行している間は、接続数は25まで増加し、フルインポートが完了すると接続数はゼロに戻ります。

このことから、接続が解放されていないのは明らかであり、これは問題です。
Data Import Handler のコードでこれを調査できるのは誰でしょうか?

返信投稿者:ks-solruserml-bot (2025/04/30 11:35 投稿)

参考までに:https://github.com/SearchScale/dataimporthandler/issues/91
ここに原因、解決策、および緩和策が記載されています。

--
よろしくお願いします、
Mikhail Khludnev

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2025 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?