2015-08-10 1 views
2

Мне не нужны данные ни в одной из таблиц в пространстве ключей. Поэтому я решил отказаться от ключа, если он существует, и создать его немедленно. Я использую приведенный ниже код для достижения того же.Как сделать синхронизацию и создать пространство ключей в кассандре?

CassandraConnector(conf).withSessionDo { session => 
    session.execute(s"DROP KEYSPACE if EXISTS $keyspace") 
    session.execute("""CREATE KEYSPACE if NOT EXISTS %s 
    WITH replication = {'class':'SimpleStrategy','replication_factor':'1'};""".format(keyspace) 

) }

Но это не удается создать пространство ключей. Из журналов я мог видеть только предупреждение о том, что

Received a DROPPED notification for table test.table_tracker, but this keyspace is unknown in our metadata. 

Я также попытался использовать драйвер питон Кассандры. Но результаты одинаковы. Я верю, что есть какое-то состояние гонки, а drop keyspace происходит асинхронно (исправьте меня, если я ошибаюсь).

Как я могу синхронно сбросить и создать пространство ключей?

ответ

6

Если вы просто хотите, чтобы удалить все данные из таблицы (ы), вы должны рассмотреть возможность использования TRUNCATE, который удаляет все данные из таблицы, сохраняя при этом свою схему, а именно:

TRUNCATE test.table_tracker; 

Performing изменения схемы должны делайте это экономно, поэтому вам следует избегать его, когда это возможно. Кроме того, во всех версиях cassandra существует множество различных проблем, связанных с быстрым отбрасыванием и обновлением пространства ключей, поэтому маршрут усечения намного более надежный.

Одна из проблем, с которыми вы можете столкнуться, заключается в том, что, возможно, вы не ожидаете соглашения о схеме после выполнения каждой операции, что может быть проблематично, особенно в случае манипулирования одним и тем же ключом/таблицей в последующих операциях. Java-драйвер (и, следовательно, искровой коннектор) будет только ждать настраиваемого времени между изменениями схемы. Посмотрите это руководство в java-driver metadata doc для руководства о том, как ждать соглашения, т.е .:

if (cluster.getMetadata().checkSchemaAgreement()) { 
    // schema is in agreement 
} else { 
    // schema is not in agreement 
} 
+1

Великого ответ Энди – phact

+1

также отметить, что усечение создаст снимок автоматически. поэтому следите за дисковым пространством и запускайте «nodetool clearsnapshot» вручную, чтобы удалить их. – LHWizard

Смежные вопросы