Super Columnに値が入れようとするとエラーが出る症状を解決するには。
非常に間抜けな事でつまずいたので備忘録的にメモメモ。
Keyspace ― ColumnFamily ― 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と一緒に扱いたい場合(…って殆どのケースがそうでしょうが)には必ず別の番号を振り直すようにしましょう。これも時間泥棒が現れる原因になります。