【发布时间】:2017-09-21 12:57:42
【问题描述】:
我正在运行 Cassandra 2.1.0 作为我的客户端,因为 2.0.9 不支持同一个表上的并发写入器,集群上的 2.0.9。
我可以在一个 JVM 实例中为单个 CF 使用并发 CQLSStableWriter 对象。但是,当我尝试在一个 JVM 实例中使用两个 CQLSStableWriter 对象,每个 CF 一个,两个 CF 时,我收到错误:
Exception in thread "Thread-2" java.lang.IllegalArgumentException: unconfigured columnfamily <the second column family>
at org.apache.cassandra.io.sstable.CQLSSTableWriter$Builder.getStatement(CQLSSTableWriter.java:460)
at org.apache.cassandra.io.sstable.CQLSSTableWriter$Builder.using(CQLSSTableWriter.java:391)
at CsvLoader.generateSSTables(CsvLoader.java:60)
at MultiThreadedCsvLoader$LoaderThread.run(MultiThreadedCsvLoader.java:93)
Caused by: org.apache.cassandra.exceptions.InvalidRequestException: unconfigured columnfamily avping_v2_file_sha2_id_idx
at org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily(ThriftValidation.java:115)
at org.apache.cassandra.cql3.statements.ModificationStatement$Parsed.prepare(ModificationStatement.java:730)
at org.apache.cassandra.cql3.statements.ModificationStatement$Parsed.prepare(ModificationStatement.java:724)
at org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:437)
at org.apache.cassandra.io.sstable.CQLSSTableWriter$Builder.getStatement(CQLSSTableWriter.java:449)
... 3 more
我正在运行的代码很简短:
CQLSSTableWriter writer1 = CQLSSTableWriter.builder().inDirectory("keyspace/cf_1").forTable(<cf_1 create statement>).using(<cf_1 insert statement>).build();
CQLSSTableWriter writer2 = CQLSSTableWriter.builder().inDirectory("keyspace/cf_2").forTable(<cf_2 create statement>).using(<cf_2 insert statement>).build();
第二次调用 using() 时出现错误。该程序有多个线程,但我限制在一个线程进行调试。
目前是否支持一个 JVM 实例中的多个 CF 的多个 CQLSSTableWriter?我是否正确使用了 API?
我写给多个 CF 的原因是我需要构建主表以及一个或多个索引。 sstableloader 似乎是批量加载的推荐方法。如果 CQLSSTableWriter 不支持我的用例,是否还有其他体面的方法来解决此问题,例如先加载主表,然后使用 CQL 客户端迭代主 CF 中的行并插入索引?还是直接切换到完全使用 CQL BATCH?
第一个测试数据集是 10 的 TB。数据位于 gzip 文本文件或 Postgres 数据库中。
【问题讨论】:
标签: java cassandra database nosql