ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

Super Columnに値が入れようとするとエラーが出る症状を解決するには。

 非常に間抜けな事でつまずいたので備忘録的にメモメモ。

KeyspaceColumnFamily Column Key&Value

 Cassandraは通常、上記のような階層構造を持ちます。RDBと照らし合わせると、KeyspaceがDB、ColumnFamilyがテーブル、Columnがレコードに相当します。が、Column FamilyとColumnの中間的な位置付けの「SuperColumn」という階層を使う事も出来るのですが、これにbatch_mutateメソッドでデータ突っ込もうとしてエラーで失敗する、という現象にずいぶん悩まされました。


 原因は非常にシンプル、設定ファイルでSuper Columnを使えるよう設定して無かっただけでした。ぎゃふん。


 以下その正しい設定内容。

%Cassandra_home%\conf\storage-conf.xml(一部抜粋)
  <Keyspaces>
    <Keyspace Name="Keyspace01">
      <ReplicaPlacementStrategy>org.apache.cassandra.locator.RackUnawareStrategy</ReplicaPlacementStrategy>
      
      <ReplicationFactor>1</ReplicationFactor>
      
      <EndPointSnitch>org.apache.cassandra.locator.EndPointSnitch</EndPointSnitch>
      
        <ColumnFamily Name="log"
                    ColumnType="Super"
                    CompareWith="BytesType"
                    KeysCached="1000"
                    RowsCached="100"
                    RowCacheSavePeriodInSeconds="0"
                    KeyCacheSavePeriodInSeconds="3600"/>
    </Keyspace>
  </Keyspaces>


 Super Columnを使用するには<ColumnFamily>タグに「ColumnType="Super"」を指定する必要があります。設定内容はちゃんと確認しましょうというお話でした。


 ちなみにCassandraの初期設定時にポート番号を指定する(<ThriftPort>というタグで)必要があるのですが、(※11/22追記:%CASSANDRA_HOME%\bin\cassandra.batの誤りでした。すみません。)デフォルトではTomcatと同じ「8080」が振られているので、Tomcatと一緒に扱いたい場合(…って殆どのケースがそうでしょうが)には必ず別の番号を振り直すようにしましょう。これも時間泥棒が現れる原因になります。