クラス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

DataStax Enterpriseヘルプ・センターでは、トラブルシューティング情報も提供しています。

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.sosnappy-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 はこの変数を検索し、これに値を追加します。