1

次のエラーが表示されます。

22:24:34.419 [run-main-0] DEBUG com.websudos.phantom - Executing query: com.datastax.driver.core.BatchStatement@3f4f5b68
22:24:34.426 [pool-15-thread-3] ERROR com.websudos.phantom - Batch too large
[error] (run-main-0) com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large
com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large

コードを再実行すると、毎回次の時点でこのエラーが発生します。

cqlsh> select count(*) from superchain.blocks  limit 1000000;

 count
-------
 51728

(1 rows)

Warnings :
Aggregation query used without partition key

洞察を事前に感謝します。

+++ アップデート +++

したがって、問題のコードは

//This file is Database.scala
class Database(val keyspace: KeySpaceDef) extends DatabaseImpl(keyspace) {
  def insertBlock(block: Block) = {
  //should note here that have also tried Batch.unlogged to same effect
    Batch.logged
      .add(ChainDatabase.block.insertNewRecord(block))
      .future()
  }

  def insertTransaction(tx: Transaction) = {
  //should note here that have also tried Batch.unlogged to same effect
    Batch.logged
      .add(ChainDatabase.tx.insertNewTransaction(tx))
      .future()
  }

  object block extends BlockTable with keyspace.Connector

  object tx extends TransactionTable with keyspace.Connector


}

object ChainDatabase extends Database(Config.keySpaceDefinition)

以下はトランザクションの挿入関数を示しており、ブロックにも同様のコードがあります。

フォローしようとした

https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-keyword-40f00e35e23e#.7zdd0qopv

&&

https://github.com/outworkers/phantom/wiki/Batch-statements

Batch too largeしかし、エラーにつながらない実装を見つけるのにまだ苦労しています。

//This file is Transaction.scala
abstract class TransactionTable extends TransactionColumnFamily with RootConnector {

  override val tableName = "transactions"

  def insertNew(tx: Transaction): Future[ResultSet] = insertNewTransaction(tx).future()

  def insertNewTransaction(tx: Transaction) = {
    insert
      .value(_.txid, tx.txid)
      .value(_.version, tx.version)
      .value(_.locktime, tx.locktime)
      .value(_.vout, tx.vout)
      .value(_.vin, tx.vin)
  }

}
4

3 に答える 3

2

Cassandra でのバッチの目的を誤解している可能性があります。

実際には、原子性が複数のクエリを実行しないようにして「高速」にするためのものです。

よく説明されていますここで見つけることができます:

https://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading-without-the-batch-keyword/

于 2016-04-06T09:33:11.653 に答える
1

他の人が言ったように、最初のエラー メッセージは、非常に大きな BATCH ステートメントからのものです。BATCH ステートメントは、従来のリレーショナル データベースで考えられるようなバッチ挿入用には設計されていません。BATCH ステートメントは、複数の非正規化テーブルに ATOMICALLY でデータを挿入する場合、または UNLOGGED BATCH を使用して同じパーティション キーにデータを挿入する場合にのみ役立ちます。

バッチ ステートメントは最適化手法として使用しないでください。速度を考慮して設計されておらず、実際にパフォーマンスが低下するためです。

最後に、これは ERROR メッセージです。Cassandra Client Driver は、クラスター内のノードをダウンさせる可能性がある (そしてダウンさせる) 非常に大きな BATCH ステートメントからクラスターを保護しようとしているためです。

SELECT count(*) FROM table;次に、 a を実行すると警告が表示されることを指摘します。

Aggregation query used without partition key.

count(*)パーティション キーを指定せずに is を使用することはアンチパターンです。上記と同様の理由で、クラスターの安定性に悪影響を及ぼす可能性があります。

最後に、Cassandra DSL ライブラリ (Phantom-DSL に精通していない) のどこかで、予期しない場所で BATCH を実行しているか、適切な使用法を完全に理解せずに意識的に BATCH を使用している可能性があると思います。spring-data では、アイテムのリストを挿入するときに BATCH を使用することを知っています (これはひどいアンチパターンです)。これにより、同様のエラーが発生する可能性があります。

于 2016-04-06T21:00:13.260 に答える