If you are here its probably because you've tried to get RocksDB working on a Raspberry PI and had the following exception:
Exception in thread "main-broker-b066f428-2e48-4d73-91cd-aab782bd9c4c-StreamThread-1" java.lang.UnsatisfiedLinkError: /tmp/librocksdbjni7453541812184957798.so: /tmp/librocksdbjni7453541812184957798.so: cannot open shared object file: No such file or directory (Possible cause: can't load IA 32 .so on a ARM platform)
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2452)
The reason for this is that your rocksdbjni jar file doesn't include the required shared library (.so file) for the ARM platform, it doesn't include x86 for Linux, a Windows DLL and a PPC(!) library but not for Linux so you are going to have to roll your own.
Step 1 - Doing the apt-gets
sudo apt-get install cmakesudo apt-get install vagrant
sudo apt-get update --fix-missing
sudo apt-get install vagrant
The vagrant part appears to be not actually required but I had issues when it wasn't installed so it is probably a dependency of the apt-get pulls in.
Step 2 - getting the code for RocksDB
git clone https://github.com/facebook/rocksdb.git rocksdb
Then change directory into rocksdb. If you are a Java developer you are possibly about to discover for the first time a tool that is why Java people created ant and maven because they REALLY hated how it worked...
Step 3 - running make
Then you want to run
make rocksdbjavastaticrelease
Which will take a while but produce you a nice JNI jar file for your Raspberry PI that you can add to your classpath and you will be away.... the jar file will be under the "target" directory under rocksdb, so if you are on the default install with user "pi" it will be
/home/pi/dev/rocksdb/java/target/rocksdbjni-6.12.0-linux32.jar
Copy that file into your classpath and rocks DB should now work fine
Step 4 - if running a Kafka Streams application
Exception in thread "main-broker-00a490b4-b50a-4cc4-aded-d6324ad0f291-StreamThread-1" org.apache.kafka.streams.errors.ProcessorStateException: Error opening store reading-topic-STATE-STORE-0000000000 at location /tmp/kafka-streams/main-broker/0_0/rocksdb/reading-topic-STATE-STORE-0000000000
at org.apache.kafka.streams.state.internals.RocksDBTimestampedStore.openRocksDB(RocksDBTimestampedStore.java:87)
at org.apache.kafka.streams.state.internals.RocksDBStore.openDB(RocksDBStore.java:188)
at org.apache.kafka.streams.state.internals.RocksDBStore.init(RocksDBStore.java:224)
at org.apache.kafka.streams.state.internals.WrappedStateStore.init(WrappedStateStore.java:48)
at org.apache.kafka.streams.state.internals.ChangeLoggingKeyValueBytesStore.init(ChangeLoggingKeyValueBytesStore.java:42)
This is weird as it had never successfully run (as it couldn't create the DB), but for some reason there is state somewhere (I assume in the broker) that still exists for the app id, I assume because that runs before the linker. So the fix there is to change "application.id" in the kafka configuration file to be something new and it should all run fine.
2 comments:
Great - that blog entry should give me another kick to crosscompile RocksDB for RaspberryPi. I saw that RocksDB is available also for ARM64 or AARCH64 platform (64Bit) and tried it on Ubuntu 64Bit on Arm, but found that there are naming differences in the 64Bit architecture that don't seem to match.
So as I understand your blog entry you use the standard source of RocksDB and crosscompiled everything on the pi as static and use the special library.
I want to make zeebe.io available on the pi and therefore need the used rocksdb on the pi. Will give it a try!
Thanks for your post!
Uwe
Let me know how it goes!
Post a Comment