【问题标题】:Cassandra - Does CQLSSTableWriter support writing to multiple column families concurrently in one JVM instance?Cassandra - CQLSSTableWriter 是否支持在一个 JVM 实例中同时写入多个列族?
【发布时间】: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


    【解决方案1】:

    在 writer1 和 writer2 之间放置你可以插入这个

    import org.apache.cassandra.config.KSMetaData;
    import org.apache.cassandra.config.Schema;
    ...
    CQLSSTableWriter writer1 = CQLSSTableWriter.builder().inDirectory("keyspace/cf_1").forTable(<cf_1 create statement>).using(<cf_1 insert statement>).build();
    ... do your stuff with writer1....
    // remove keyspace definition
    KSMetaData ksm = Schema.instance.getKSMetaData("keyspace");
    Schema.instance.clearKeyspaceDefinition(ksm);
    CQLSSTableWriter writer2 = CQLSSTableWriter.builder().inDirectory("keyspace/cf_2").forTable(<cf_2 create statement>).using(<cf_2 insert statement>).build();
    ... do your stuff with writer2....
    

    它对我有用
    希望对你有帮助

    【讨论】:

    • 这种全局共享状态并不酷。但是很好地弄清楚如何克服它 - 你的回答是一个很大的帮助! (希望没有“副作用”:-))。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2017-02-21
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多