Hector を使用してレコードを挿入しようとしていますが、時々このエラーが発生します。
me.prettyprint.hector.api.exceptions.HUnavailableException: : May not be enough replicas present to handle consistency level.
at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:59)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:264)
at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:113)
at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243)
at me.prettyprint.cassandra.service.template.AbstractColumnFamilyTemplate.executeBatch(AbstractColumnFamilyTemplate.java:115)
at me.prettyprint.cassandra.service.template.AbstractColumnFamilyTemplate.executeIfNotBatched(AbstractColumnFamilyTemplate.java:163)
at me.prettyprint.cassandra.service.template.ColumnFamilyTemplate.update(ColumnFamilyTemplate.java:69)
at ustocassandra.USToCassandraHector.consumer(USToCassandraHector.java:271)
at ustocassandra.USToCassandraHector.access$100(USToCassandraHector.java:41)
at ustocassandra.USToCassandraHector$2.run(USToCassandraHector.java:71)
at java.lang.Thread.run(Thread.java:724)
Caused by: UnavailableException()
at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20841)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964)
at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:104)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)
... 9 more
通常の説明では、十分なノードが稼働していないということですが、そうではありません。すべてのノードが稼働しています:
./nodetool ring
Note: Ownership information does not include topology; for complete information, specify a keyspace
Datacenter: DC1
==========
Address Rack Status State Load Owns Token
4611686018427388000
172.16.217.222 RAC1 Up Normal 353.36 MB 25.00% -9223372036854775808
172.16.217.223 RAC2 Up Normal 180.84 MB 25.00% -4611686018427388000
172.16.217.224 RAC3 Up Normal 260.34 MB 25.00% -2
172.16.217.225 RAC4 Up Normal 222.71 MB 25.00% 4611686018427388000
20 個のスレッドを使用してレコードを挿入しています (使用するスレッドを減らすべきでしょうか? 私の知る限り、この場合のエラーは利用不可ではなく過負荷になります)。私は ONE の書き込み一貫性を使用しています。AutoDiscoveryAtStartup と LeastActiveBalancingPolicy を使用しています。複製係数は 2 です。
Cassandra 1.2.8 を使用しています (2.0 で試してみましたが、同じです)。
エラーは最初から発生していません。通常、エラーが発生する前に約 200 万件のレコードを挿入できます。私のコードは、エラーが発生したときに再試行するように設定されています。数十回の再試行の後、挿入は通常成功します。その後、数百万回の挿入で再び正常に動作し、再びエラーが発生してサイクルが続きます。
gc_grace = 60 に設定したからでしょうか? とにかく、60秒ごとにエラーが発生するわけではないので、これが理由ではないと思います。
このエラーの理由と、どうすればよいかについて、いくつか提案をいただけますか?
編集:
「nodetool tpstats」は、いくつかのメッセージが削除されたと言っています:
Message type Dropped
RANGE_SLICE 0
READ_REPAIR 0
BINARY 0
READ 0
MUTATION 11
_TRACE 0
また、ログ ファイルに次の警告が表示されます。
WARN [ScheduledTasks:1] 2013-09-30 09:20:16,633 GCInspector.java (line 136) Heap is 0.853986836999536 full. You may need to reduce memtable and/or cache sizes. Cassandra is now reducing cache sizes to free up memory. Adjust reduce_cache_sizes_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically
WARN [ScheduledTasks:1] 2013-09-30 09:20:16,634 AutoSavingCache.java (line 185) Reducing KeyCache capacity from 1073741824 to 724 to reduce memory pressure
WARN [ScheduledTasks:1] 2013-09-30 09:20:16,634 GCInspector.java (line 142) Heap is 0.853986836999536 full. You may need to reduce memtable and/or cache sizes. Cassandra will now flush up to the two largest memtables to free up memory. Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically
WARN [ScheduledTasks:1] 2013-09-30 09:20:16,634 StorageService.java (line 3618) Flushing CFS(Keyspace='us', ColumnFamily='my_cf') to relieve memory pressure
これは、Hector が Unavailable 例外をスローした正確な時間です。したがって、おそらくメモリ関連の問題です。警告が示すことを試してみると思います:memtableのサイズを減らします。