クラスorg.xerial.snappy.Snappyを初期化できない
Linuxプラットフォームで、クラスパスからライブラリを使用できるにもかかわらず、Snappyの圧縮/解凍を有効にしたときにエラーが発生する可能性があります。
cassandra-env.sh
cassandra-env.shファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/cassandra-env.sh |
tarボール・インストール | installation_location/resources/cassandra/conf/cassandra-env.sh |
Linuxプラットフォームで、クラスパスからライブラリを使用できるにもかかわらず、Snappyの圧縮/解凍を有効にしたときにエラーが発生する可能性があります。
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError:
Could not initialize class org.xerial.snappy.Snappy
...
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy
at org.apache.cassandra.io.compress.SnappyCompressor.initialCompressedBufferLength
(SnappyCompressor.java:39)
Snappy圧縮のネイティブ・ライブラリsnappy-1.0.4.1-libsnappyjava.soはsnappy-java-1.0.4.1.jarファイルに含まれています。JVMがJARを初期化すると、ライブラリはデフォルトのtempディレクトリーに追加されます。デフォルトのtempディレクトリーがnoexecオプションを使用してマウントされる場合、上記の例外が発生します。
解決策の1つは、以下のように、noexecオプションを使用しないで、すでにマウントされている別のtempディレクトリーを指定することです。
- DSE起動コマンド$_BIN/dse cassandraまたは$_BIN/cassandraを使用する場合は、以下のコマンドラインを追加します。
bin/dse cassandra -t -Dorg.xerial.snappy.tempdir=/path/to/newtmp
- service dse startまたはservice cassandra startを使用してパッケージから起動する場合、以下の値をシステム環境変数JVM_OPTSに追加します。
JVM_OPTS=-Dorg.xerial.snappy.tempdir=/path/to/newtmp
JVMの起動時に、デフォルトの cassandra-env.sh はこの変数を検索し、これに値を追加します。