Cassandra - Поддерживает ли CQLSSTableWriter запись в несколько семейств столбцов одновременно в одном экземпляре JVM?

1

Я запускаю Cassandra 2.1.0 в качестве моего клиента из-за 2.0.9, не поддерживающего одновременных авторов в той же таблице, 2.0.9 в кластере.

Я могу использовать параллельные объекты CQLSStableWriter для одного CF в одном экземпляре JVM. Однако, когда я пытаюсь использовать два объекта CQLSStableWriter, по одному для каждого CF, для двух CF в одном экземпляре JVM, я получаю ошибку:

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();

Ошибка возникает во время второго вызова использования(). Программа имеет несколько потоков, но я ограничился одним потоком для отладки.

Является ли несколько CQLSSTableWriters для нескольких CF в одном экземпляре JVM, поддерживаемом в настоящее время? Я правильно использую API?

Причина, по которой я пишу несколько CF, заключается в том, что мне нужно создать основную таблицу, а также один или несколько индексов. sstableloader, по-видимому, является рекомендуемым методом массовой загрузки. Существуют ли другие подходящие методы для решения этой проблемы, если CQLSSTableWriter не поддерживает мой прецедент, например, сначала загружает основную таблицу, а затем использует клиент CQL для перебора строк в основном CF и вставки в индекс? Или просто полностью переключитесь на CQL BATCH?

Первый набор тестовых данных - 10 ТБ. Данные находятся либо в текстовых файлах gzip'd, либо в базе данных Postgres.

Теги:
database
cassandra
nosql

1 ответ

2
Лучший ответ

между writer1 и writer2 put вы можете вставить это

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

это сработало для меня
Надеюсь, поможет

  • 0
    Не круто с таким глобальным общим состоянием. Но молодцы, выясняющие, как это преодолеть - ваш ответ очень помог! (надеюсь, нет никаких «побочных эффектов» :-)).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню