Я использую Apache Spark для чтения данных из Cassandra, который под капотом выполняет сканирование на основе диапазона токенов. Но в последнее время я вижу много сбоев при чтении данных из моей таблицы Cassandra.
Ошибка чтения по следующей причине:
Caused by: com.datastax.driver.core.exceptions.ReadFailureException: Cassandra failure during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded, 1 failed)
at com.datastax.driver.core.exceptions.ReadFailureException.copy(ReadFailureException.java:85)
at com.datastax.driver.core.exceptions.ReadFailureException.copy(ReadFailureException.java:27)
at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:68)
Когда я проверил системные журналы, я обнаружил следующую проблему:
ERROR [ReadStage-1] 2020-04-09 10:25:59,701 StorageProxy.java:1896 - Scanned over 100001 tombstones during query 'SELECT * FROM my_keyspace.my_table WHERE token(id) > -5868586221781016365 AND token(id) <= -5347313590141106513 LIMIT 5000' (last scanned row partion key was (my_key_1)); query aborted
Журнал ошибок прост, чтение не выполняется из-за сканирования захоронения.
Чего я не понимаю, так это того, что я выполнял одну и ту же работу Spark более года и никогда не сталкивался с этой проблемой. Но это вторично. Сначала я хотел бы знать, как я могу это исправить?
Надгробия могут быть созданы для значений столбца, которые не передаются, поскольку я использую функцию Cassandra Insert Json для вставки документа. Подтверждено здесь, что этот подход создаст надгробия.
Как я могу это исправить? Создание нескольких запросов на вставку на основе ненулевых значений - сложный вариант.
На мой взгляд, даже вставка фиктивного значения непрактична. Все клиенты, которые читают данные из этих таблиц, должны внести изменения.
Я лично считаю, что Cassandra никогда не должна создавать Tombstone для столбца, если столбец не существует в JSON.
Какие еще варианты решения этой проблемы?
Map
илиtext
типе и сохранив JSON. Нам нужна схема. Не стесняйтесь предложить, думали ли вы о какой-либо другой модели данных, чтобы избежать надгробий? Спасибо!! :) - person Bikas Katwal   schedule 13.05.2020