что я должен делать для "com.datastax.driver.core.exceptions.ReadTimeoutException"?

63
5

Я поставил почти 190 million records в кластере Cassandra (2.1.11) с 3 узлами, а коэффициент репликации равен 1, затем я пишу клиентское приложение для подсчета всех записей с помощью datastax Java Driver, код фрагмента следующим образом:

Statement stmt = new SimpleStatement("select * from test" );

System.out.println("starting to read records ");
stmt.setFetchSize(10000);
ResultSet rs = session.execute(stmt);

//System.out.println("rs.size " + rs.all().size());
long cntRecords = 0;

for(Row row : rs){
cntRecords++;

if(cntRecords % 10000000 == 0){
System.out.println("the " + cntRecords/10000000 + " X 10 millions of records");
}
}

После того, как вышеперечисленная переменная cntRecords составляет более 30 миллионов, я всегда получаю исключение:

Exception in thread "main" com.datastax.driver.core.exceptions.ReadTimeoutException: 
Cassandra timeout during read query at consistency ONE (1 responses were required but only
0 replica responded)

Я получил несколько результатов в google и изменил настройки для кучи и GC, следующие мои относительные настройки:

-XX:InitialHeapSize=17179869184 
-XX:MaxHeapSize=17179869184
-XX:MaxNewSize=12884901888
-XX:MaxTenuringThreshold=1
-XX:NewSize=12884901888
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCompressedOops
-XX:+UseConcMarkSweepGC
-XX:+UseCondCardMark
-XX:+UseGCLogFileRotation
-XX:+UseParNewGC
-XX:+UseTLAB
-XX:+UseThreadPriorities
-XX:+CMSClassUnloadingEnabled

и я использовал GCViewer для анализа файла журнала gc, а пропускные способности - 99,95%, 98,15% и 95,75%.

UPDATED BEGIN: И я использовал jstat для мониторинга одного из трех узлов и обнаружил, что, когда значение S1 изменилось на 100.00 я быстро получу приведенную выше ошибку:

/usr/java/jdk1.7.0_80/bin/jstat -gcutil 8862 1000 
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 100.00 28.57 36.29 74.66 55 14.612 2 0.164 14.776

И как только S1 изменится на 100.00, S1 больше не будет уменьшаться, я не знаю, что это относительно ошибки? Или какое свойство в cassandra.yaml или cassandra-env.sh Я должен установить для этого?

Что я должен сделать для завершения задачи, чтобы считать все записи? Заранее спасибо!

ATTACH: следующие варианты:

-XX:+CMSEdenChunksRecordAlways 
-XX:CMSInitiatingOccupancyFraction=75
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSParallelRemarkEnabled
-XX:CMSWaitDuration=10000
-XX:CompileCommandFile=bin/../conf/hotspot_compiler
-XX:GCLogFileSize=94371840
-XX:+HeapDumpOnOutOfMemoryError
-XX:NumberOfGCLogFiles=90
-XX:OldPLABSize=16
-XX:PrintFLSStatistics=1
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintPromotionFailure
-XX:+PrintTenuringDistribution
-XX:StringTableSize=1000003
-XX:SurvivorRatio=8
-XX:ThreadPriorityPolicy=42
-XX:ThreadStackSize=256

спросил(а) 2021-01-28T01:16:24+03:00 4 месяца, 3 недели назад
1
Решение
77

Изучите, почему вам нужно знать количество строк. Вам действительно нужно знать ваше приложение? Если он может выживать с "просто" хорошим приближением, тогда создайте счетчик и увеличивайте его при загрузке ваших данных.

http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html

Что вы можете попробовать:

    Выберите один столбец вместо *. Это может снизиться за счет давления газа и потребления сети. Предпочтительно выбрать столбец с небольшим количеством байтов и является частью первичного ключа: select column1 from test Добавьте короткую паузу после каждого 1M записи. Сделайте паузу паузы на 500 мс или около того каждые 1 М записи. Это может дать узлам быстрый передышку, чтобы заботиться о таких вещах, как GC Измените cassandra.yaml на своих узлах и увеличьте range_request_timeout_in_ms и read_request_timeout_in_ms Определите диапазоны токенов, назначенные каждому узлу, и выдайте отдельный запрос для каждого диапазона токенов. Добавьте подсчеты из каждого запроса. Это использует драйвер, поддерживающий токен, для выдачи каждого запроса "диапазон токенов" непосредственно на узел, который может ответить на него. См. Эту статью в блоге для полного описания с образцом кода.

ответил(а) 2021-01-28T01:16:24+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема