UnsatisfiedLinkError на Lib качает DB dll при разработке с Kafka Streams

Я пишу приложение Kafka Streams на своей машине Windows для разработки. Если я попытаюсь использовать функции leftJoin и branch Kafka Streams, я получу следующую ошибку при выполнении приложения jar:

Exception in thread "StreamThread-1" java.lang.UnsatisfiedLinkError: C:\Users\user\AppData\Local\Temp\librocksdbjni325337723194862275.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.java:78)
    at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:56)
    at org.rocksdb.RocksDB.loadLibrary(RocksDB.java:64)
    at org.rocksdb.RocksDB.<clinit>(RocksDB.java:35)
    at org.rocksdb.Options.<clinit>(Options.java:22)
    at org.apache.kafka.streams.state.internals.RocksDBStore.openDB(RocksDBStore.java:115)
    at org.apache.kafka.streams.state.internals.Segment.openDB(Segment.java:38)
    at org.apache.kafka.streams.state.internals.Segments.getOrCreateSegment(Segments.java:75)
    at org.apache.kafka.streams.state.internals.RocksDBSegmentedBytesStore.put(RocksDBSegmentedBytesStore.java:72)
    at org.apache.kafka.streams.state.internals.ChangeLoggingSegmentedBytesStore.put(ChangeLoggingSegmentedBytesStore.java:54)
    at org.apache.kafka.streams.state.internals.MeteredSegmentedBytesStore.put(MeteredSegmentedBytesStore.java:101)
    at org.apache.kafka.streams.state.internals.RocksDBWindowStore.put(RocksDBWindowStore.java:109)
    at org.apache.kafka.streams.state.internals.RocksDBWindowStore.put(RocksDBWindowStore.java:101)
    at org.apache.kafka.streams.kstream.internals.KStreamJoinWindow$KStreamJoinWindowProcessor.process(KStreamJoinWindow.java:65)
    at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:48)
    at org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:188)
    at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:134)
    at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:83)
    at org.apache.kafka.streams.kstream.internals.KStreamFlatMapValues$KStreamFlatMapValuesProcessor.process(KStreamFlatMapValues.java:43)
    at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:48)
    at org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:188)
    at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:134)
    at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:83)
    at org.apache.kafka.streams.kstream.internals.KStreamFilter$KStreamFilterProcessor.process(KStreamFilter.java:44)
    at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:48)
    at org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:188)
    at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:134)
    at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:83)
    at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:70)
    at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:197)
    at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:641)
    at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:368)

Кажется, Kafka не находит DLL, но подождите... Я разрабатываю Java-приложение!

В чем может быть проблема? И почему эта ошибка не появляется, если я пытаюсь выполнять более простые потоковые операции, такие как только filter?

ОБНОВИТЬ:

Эта проблема возникает только при наличии сообщения в брокере. Я использую Kafka Streams версии 0.10.2.1.

Это часть кода, которая поднимает проблему

public class KafkaStreamsMainClass {

    private KafkaStreamsMainClass() {
    }

    public static void main(final String[] args) throws Exception {
        Properties streamsConfiguration = new Properties();
        streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "kafka-streams");
        streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-server:9092");
        streamsConfiguration.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "schema-registry:8082");
        streamsConfiguration.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 10 * 1000);
        streamsConfiguration.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 0);
        streamsConfiguration.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, GenericAvroSerde.class);
        streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, GenericAvroSerde.class);
        KStreamBuilder builder = new KStreamBuilder();
        KStream<GenericRecord, GenericRecord> sourceStream = builder.stream(SOURCE_TOPIC);

        KStream<GenericRecord, GenericRecord> finishedFiltered = sourceStream
                .filter((GenericRecord key, GenericRecord value) -> value.get("endTime") != null);

        KStream<GenericRecord, GenericRecord>[] branchedStreams = sourceStream
                .filter((GenericRecord key, GenericRecord value) -> value.get("endTime") == null)
                .branch((GenericRecord key, GenericRecord value) -> value.get("firstField") != null,
                        (GenericRecord key, GenericRecord value) -> value.get("secondField") != null);

        branchedStreams[0] = finishedFiltered.join(branchedStreams[0],
                (GenericRecord value1, GenericRecord value2) -> {
                    return value1;
                }, JoinWindows.of(TimeUnit.SECONDS.toMillis(2)));

        branchedStreams[1] = finishedFiltered.join(branchedStreams[1],
                (GenericRecord value1, GenericRecord value2) -> {
                    return value1;
                }, JoinWindows.of(TimeUnit.SECONDS.toMillis(2)));

        KafkaStreams streams = new KafkaStreams(builder, streamsConfiguration);
        streams.setUncaughtExceptionHandler((Thread thread, Throwable throwable) -> {
            throwable.printStackTrace();
        });
        streams.start();

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

}

Я открыл архив rocksdbjni-5.0.1.jar, загруженный Maven, и он включает библиотеку librocksdbjni-win64.dll. Кажется, что он пытается получить библиотеку снаружи RocksDB, а не изнутри.

Я разрабатываю на машине с Windows 7.

Вы когда-нибудь сталкивались с этой проблемой?


person gvdm    schedule 02.05.2017    source источник
comment
Это странно. Для справки: я запустил набор mvn test демонстрационных приложений Kafka Streams от Confluent (github.com/confluentinc/examples). ) в Windows 10 с Oracle JDK 1.8 вчера, и (за одним исключением из-за ошибки брокера Kafka в Windows = не связанной с Kafka Streams) все работало из коробки. Возможно, вы можете предоставить более подробную информацию о своей среде (версия Windows, версия Java и т. д.), точную версию Kafka Streams, которую вы используете, и код, чтобы его было легче воспроизвести?   -  person Michael G. Noll    schedule 03.05.2017
comment
Я думаю, что нашел проблему. В моем локальном репозитории Maven у меня было две версии RocksDB, версия 4.4.1 и 5.0.1 (та, которую я использую в Kafka Streams 0.10.2). Удалил версию 4.4.1 и проблема ушла. Странно то, что Maven использовал старую версию библиотеки.   -  person gvdm    schedule 03.05.2017
comment
Нет, проблема снова в нем. Это не было показухой, потому что у меня не было сообщений в брокере (они были удалены заданием удаления Kafka). Я обновлю свой вопрос с необходимой информацией   -  person gvdm    schedule 03.05.2017
comment
См. также stackoverflow.com/questions/41291996/   -  person Matthias J. Sax    schedule 04.05.2017
comment
@gvdm - проблема решена? Я получаю точно такую ​​​​же проблему. странная вещь, такая же установка работает на другом подобном компьютере.   -  person Mudit bhaintwal    schedule 22.06.2017
comment
Привет @Mudit. Нет, когда мне нужно разрабатывать на Kafka Streams, я использую машину с Linux, и все работает.   -  person gvdm    schedule 22.06.2017
comment
Очень странно, что Kafka до сих пор не поддерживает Windows!!! Вы пробовали также с cygwin.   -  person Mudit bhaintwal    schedule 22.06.2017
comment
Нет, но проблема в компиляции с помощью Maven в среде Windows. Я думаю, что Cygwin не поможет в этом случае.   -  person gvdm    schedule 23.06.2017


Ответы (6)


Недавно я тоже столкнулся с этой проблемой. Мне удалось решить это в два этапа:

  1. Удалите все librocksdbjni[...].dll файлы из папки C:\Users\[your_user]\AppData\Local\Temp.
  2. Добавьте зависимость maven для rocksdb в свой проект, это работает для меня: https://mvnrepository.com/artifact/org.rocksdb/rocksdbjni/5.0.1

Скомпилируйте приложение Kafka Stream и запустите его. Он должен работать!

person David Corral    schedule 08.01.2018
comment
Привет @David, спасибо за ответ. Работает ли это решение также в среде разработки Linux или искажает путь к классам в такой среде? - person gvdm; 09.01.2018
comment
Здравствуйте @gvdm, извините, но я не знаю, потому что на самом деле у меня есть доступ только к разработке в Windows. - person David Corral; 09.01.2018
comment
Хорошо @David, я постараюсь, как только смогу, и дам тебе знать - person gvdm; 10.01.2018
comment
Привет, Дэвид. Решил проблему обновлением до 1.0.0. Подробнее см. в ответе lib качает db dll при разработке с потоками kafka%2348340251">stackoverflow.com/questions/43742423/ . Спасибо за Вашу поддержку. - person gvdm; 19.01.2018
comment
Большое спасибо, я использовал Windows, и обновление версии не помогло. - person meobeo173; 03.04.2018
comment
Почему 5.0.1 работает нормально, но 5.7.3, включенный в зависимости плагином управления spring boot 2.1, не работает? - person CHEM_Eugene; 12.04.2019

Я обновил свой проект kafka-streams до последней выпущенной версии 1.0.0.

Эта версия страдает этой ошибкой, но после ее исправления и загрузки этой исправленной версии на на внутреннем сервере Artifactory мы смогли запустить нашего агента kafka-streams как в Windows, так и в Linux. В следующих версиях 1.0.1 и 1.1.0 эта ошибка будет исправлена, поэтому, как только одна из этих версий будет выпущена, мы переключимся на них вместо исправленной версии.

Подводя итог, ребята из Kafka решили эту ошибку в выпуске 1.0.0.

person gvdm    schedule 19.01.2018

Моя проблема заключалась в разрешениях в каталоге /tmp/ (CentOS)

RockDB использует

java.io.tmpdir 

системное свойство внутри, чтобы решить, где разместить librocksdbjnifile, обычно что-то вроде этого /tmp/librocksdbjni2925599838907625983.so

Решено путем установки другого свойства tempdir с соответствующими разрешениями в приложении kafka-streams.

System.setProperty("java.io.tmpdir", "/opt/kafka-streams/tmp");
person SeaBiscuit    schedule 20.01.2020

Вам не хватает некоторых родных библиотек, от которых зависит dll rockdb. См. https://github.com/facebook/rocksdb/issues/1302.

person Nicholas    schedule 02.05.2017
comment
Да, это очевидно, но почему консольное приложение Maven Java пытается использовать внешнюю библиотеку DLL? Он должен использовать только материал из пути к классам! - person gvdm; 03.05.2017
comment
Привет @Николас. Решил проблему обновлением до 1.0.0. Подробнее см. в ответе lib качает db dll при разработке с потоками kafka%2348340251">stackoverflow.com/questions/43742423/ . Спасибо за Вашу поддержку. - person gvdm; 19.01.2018

У меня была такая же проблема при использовании jdk 1.8. Это было решено, когда я изменил его на jre.

person Akhil K Kamal    schedule 20.05.2020

Столкнулся с аналогичной проблемой на Mac. По этой ссылке https://github.com/facebook/rocksdb/issues/5064 проблема связана со старой libc, установленной в моей версии Mac OS (10.11.6).

person Naga Venkata Pradeep Namburi    schedule 06.08.2020