クラスorg.xerial.snappy.Snappyを初期化できない

クラスパスからライブラリを使用できるにもかかわらず、Snappyの圧縮/解凍を有効にしたときにエラーが発生する可能性があります。

クラスパスからライブラリを使用できるにもかかわらず、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.sosnappy-java-1.0.4.1.jarファイルに含まれています。JVMがJARを初期化すると、ライブラリはデフォルトのtempディレクトリーに追加されます。デフォルトのtempディレクトリーがnoexecオプションを使用してマウントされる場合、上記の例外が発生します。

解決策の1つは、以下のように、noexecオプションを使用しないで、すでにマウントされている別のtempディレクトリーを指定することです。

  • DSE/Cassandraのコマンド$_BIN/dse cassandraまたは$_BIN/cassandraを使用する場合は、以下のコマンドラインを追加します。
    • DSE:bin/dse cassandra -t -Dorg.xerial.snappy.tempdir=/path/to/newtmp
    • Cassandra:bin/cassandra -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はこの変数を検索し、これに値を追加します。

cassandra-env.shファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/cassandra/cassandra-env.sh
tarボール・インストール install_location/conf/cassandra-env.sh