web-dev-qa-db-ja.com

IDE for Kafka StreamApplicationの状態ディレクトリの削除に失敗しました

トピックからメッセージを抽出し、変換後に別のトピックに配置する単純なKafkaストリームアプリケーションを開発しています。開発にはIntelijを使用しています。

このアプリケーションをデバッグ/実行するとき、私のIDEおよびKafkaサーバーがSAMEマシンにある場合は完璧に機能します

(つまり、BOOTSTRAP_SERVERS_CONFIG = localhost:9092およびSCHEMA_REGISTRY_URL_CONFIG = localhost:8081の場合)

ただし、別のマシンを使用して開発を行おうとすると

(つまり、BOOTSTRAP_SERVERS_CONFIG = XXX.XXX.XXX:9092およびSCHEMA_REGISTRY_URL_CONFIG = XXX.XXX.XXX:8081の場合、XXX.XXX.XXXは私のKafkaのIPアドレスです)、

デバッグプロセスの実行最初は問題なく。ただし、オフセットをリセットしてから2回実行すると、次のエラーが発生しました。

ERROR stream-thread [main] Failed to delete the state directory. (org.Apache.kafka.streams.processor.internals.StateDirectory:297) 
Java.nio.file.DirectoryNotEmptyException: \tmp\kafka-streams\my_application_id\0_0
Exception in thread "main" org.Apache.kafka.streams.errors.StreamsException: Java.nio.file.DirectoryNotEmptyException:

変更した場合my_application_id なので my_application_id2、実行すると、最初は再び動作しますが、再度実行するとエラーが発生します。

アプリケーションの最後の文に次のコードがあります。

Runtime.getRuntime().addShutdownHook(new Thread(streams::close));

この問題を解決する方法について何かアドバイスはありますか?

更新:

開発マシン(Windowsプラットフォーム)で作成された状態ディレクトリを確認しましたが、2回目の実行前にこれらのディレクトリを手動で削除しても、エラーは見つかりませんでした。 IDEを管理者として実行しようとしました。これは、フォルダーのアクセス許可に関するものである可能性があるためです。ただし、これは役に立ちません。

参考のためのフルスタック:

INFO Kafka version:1.1.0(org.Apache.kafka.common.utils.AppInfoParser:109)INFO Kafka commitId:fdcf75ea326b8e07(org.Apache。 kafka.common.utils.AppInfoParser:110)INFO stream-thread [main]クリーンアップを呼び出すユーザーとしてタスク0_0の状態ディレクトリ0_0を削除しています。(org.Apache.kafka.streams.processor.internals.StateDirectory:281)ターゲットから切断されましたVM、アドレス: '127.0.0.1:16552'、トランスポート: 'socket'スレッド "main"の例外org.Apache.kafka.streams.errors.StreamsException:Java.nio.file.DirectoryNotEmptyException:C:\ workspace\benychan\kafka-streams\my_application_001\0_0 at org.Apache.kafka.streams.processor.internals.StateDirectory.clean(StateDirectory.Java:231)at org.Apache.kafka.streams.KafkaStreams.cleanUp(KafkaStreams.Java:931)at com.macroviewhk.financialreport.simpleStream.start(simpleStream.Java:60)at com.macroviewhk.financialreport.simpleStream.main(simpleStream.Java:45)原因:Java.nio.file.DirectoryNotEmptyException:C:\ workspace\bennychan\kafk a-streams\my_application_001\0_0 at Sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.Java:266)at Sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.Java:103)atJava.nio.file.Files。 delete(Files.Java:1126)at org.Apache.kafka.common.utils.Utils $ 1.postVisitDirectory(Utils.Java:651)at org.Apache.kafka.common.utils.Utils $ 1.postVisitDirectory(Utils.Java: 634)Java.nio.file.Files.walkFileTree(Files.Java:2688)at Java.nio.file.Files.walkFileTree(Files.Java:2742)at org.Apache.kafka.common.utils.Utils.delete (Utils.Java:634)エラーstream-thread [main]状態ディレクトリの削除に失敗しました。 (org.Apache.kafka.streams.processor.internals.StateDirectory:297)org.Apache.kafka.streams.processor.internals.StateDirectory.cleanRemovedTasks(StateDirectory.Java:287)Java.nio.file.DirectoryNotEmptyException:C:\workspace\bennychan\kafka-streams\my_application_001\0_0 at org.Apache.kafka.streams.processor.internals.StateDirectory.clean(StateDirectory.Java:228)at Sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.Java: 266)... org.Apache.kafka.commonのJava.nio.file.Files.delete(Files.Java:1126)のSun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.Java:103)でさらに3つ。 utils.Utils $ 1.postVisitDirectory(Utils.Java:651)at org.Apache.kafka.common.utils.Utils $ 1.postVisitDirectory(Utils.Java:634)at Java.nio.file.Files.walkFileTree(Files.Java: 2688)Java.nio.file.Files.walkFileTree(Files.Java:2742)at org.Apache.kafka.common.utils.Utils.delete(Utils.Java:634)at org.Apache.kafka.streams.processor .internals.StateDirectory.cleanRemovedTasks(S tateDirectory.Java:287)at org.Apache.kafka.streams.processor.internals.StateDirectory.clean(StateDirectory.Java:228)at org.Apache.kafka.streams.KafkaStreams.cleanUp(KafkaStreams.Java:931)at com .macroviewhk.financialreport.simpleStream.start(simpleStream.Java:60)at com.macroviewhk.financialreport.simpleStream.main(simpleStream.Java:45)

更新2:別の詳細なチェックの後、IOExceptionをスローする以下の行

Files.walkFileTree(file.toPath(), new SimpleFileVisitor<Path>() {

この行は、kafka-clients-1.1.0.jarorg.Apache.kafka.common.utilsUtils.classにあります。

これはWindowsシステムの問題かもしれません(私は経験豊富なJavaプログラマーではありません)。

5
Benny Chan

グーガーのために..

私は現在、このScalaコードを使用して、Windowsの担当者が状態ストアの削除を処理できるようにしています。

if (System.getProperty("os.name").toLowerCase.contains("windows")) {
  logger.info("WINDOWS OS MODE - Cleanup state store.")
  try {
    FileUtils.deleteDirectory(new File("/tmp/kafka-streams/" + config.getProperty("application.id")))
    FileUtils.forceMkdir(new File("/tmp/kafka-streams/" + config.getProperty("application.id")))
  } catch {
    case e: Exception => logger.error(e.toString)
  }
}
else {
  streams.cleanUp()
}
5
Or Biran

これは、Windowsで動作するように実装したものです。これはKotlinで書かれています。

使用したバージョン:kafka-streams-test-utils:2.3.0。

重要なのは、例外をキャッチすることです。ディレクトリを削除しなくても、testDriver.close()によって発生した例外をキャッチする限り、テストは合格です。ただし、ディレクトリをクリーンアップすると、単体テストが独立して再現可能になります。

val directory = "test"

@BeforeEach
fun setup(){
    //other code omitted for setting the props
    props.setProperty(StreamsConfig.STATE_DIR_CONFIG,directory)
}

@AfterEach
fun tearDown(){
    try{
        testDriver.close()
    }catch(exception: Exception){
        FileUtils.deleteDirectory(File(directory)) //there is a bug on Windows that does not delete the state directory properly. In order for the test to pass, the directory must be deleted manually
    }
}
0
rajaj

https://issues.Apache.org/jira/browse/KAFKA-6647 に関連していると思われる@ ideano1に同意します-明示的にKafkaStreams#cleanUp()テスト間。 Window-OSに問題がある理由は不明です。 Atm、すべてのテストはLinuxで行われます。

0
Matthias J. Sax