gpt4 book ai didi

java - Cassandra - CQLSSTableWriter 是否支持在一个 JVM 实例中同时写入多个列族?

转载 作者:搜寻专家 更新时间:2023-10-30 23:06:17 24 4
gpt4 key购买 nike

我正在运行 Cassandra 2.1.0 作为我的客户端,因为 2.0.9 不支持同一个表上的并发写入器,2.0.9 在集群上。

我可以为一个 JVM 实例中的单个 CF 使用并发 CQLSStableWriter 对象。但是,当我尝试对一个 JVM 实例中的两个 CF 使用两个 CQLSStableWriter 对象时,每个 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 的多个 CQLSSTableWriters?我是否正确使用了 API?

我写入多个 CF 的原因是我需要构建主表以及一个或多个索引。 sstableloader 似乎是批量加载的推荐方法。如果 CQLSSTableWriter 不支持我的用例,是否有任何其他体面的方法来解决这个问题,例如首先加载主表,然后使用 CQL 客户端迭代主 CF 中的行并插入索引?或者只是切换到完全使用 CQL BATCH?

第一个测试数据集是 10 的 TB。数据位于 gzip 压缩文本文件或 Postgres 数据库中。

最佳答案

在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....

对我有用
希望对你有帮助

关于java - Cassandra - CQLSSTableWriter 是否支持在一个 JVM 实例中同时写入多个列族?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com