Тайм-аут во время исключения чтения в cassandra с java-драйвером datastax

Я пытаюсь вставить одну строку с несколькими столбцами размером 500 МБ в кластер cassandra, и я получаю сообщение об ошибке ниже.

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: [/10.138.90.207:9042, /10.138.90.208:9042, /10.138.90.191:9042, /10.138.90.240:9042, /10.138.90.232:9042, /10.138.90.205:9042, /10.138.90.236:9042, /10.138.90.246:9042] - use getErrors() for details)
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:65)
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:256)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:172)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
at com.tcs.asml.cassandra.Crud.Insert(Crud.java:44)
at com.tcs.asml.factory.PartToolInsert.main(PartToolInsert.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: [/10.138.90.207:9042, /10.138.90.208:9042, /10.138.90.191:9042, /10.138.90.240:9042, /10.138.90.232:9042, /10.138.90.205:9042, /10.138.90.236:9042, /10.138.90.246:9042] - use getErrors() for details)
at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:103)
at com.datastax.driver.core.RequestHandler$1.run(RequestHandler.java:175)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

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

Get errors: 
{/10.138.90.207:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.191:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.208:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.240:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.232:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.205:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.236:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read, /10.138.90.246:9042=com.datastax.driver.core.exceptions.DriverException: Timeout during read}

Детали кластера:

  • один центр обработки данных с 8 узлами по 16 ГБ ОЗУ каждый
  • Один жесткий диск в каждом узле.
  • Все узлы подключены с пропускной способностью 10 Мбит/с с задержкой по умолчанию.

Я попытался увеличить время чтения, используя команду ниже.

cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(60000);

Ниже приведена конфигурация yaml, используемая сейчас.

  • общий объем памяти: 4Gb
  • Размер сегмента журнала фиксации: 512 МБ.
  • read_request_timeout_in_ms (мс): 10000
  • request_timeout_in_ms (мс): 10000
  • одновременное чтение: 32
  • одновременно пишет: 32

Я столкнулся с той же проблемой, когда пытался вставить строку размером 250 МБ, и, установив время чтения на 30 секунд, устранил проблему.

cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(30000);

Но для размера строки 500 МБ это не работает.

Может ли кто-нибудь дать мне несколько идей, как настроить cassandra для вставки одной строки с огромными данными.

Спасибо.


person Naveen    schedule 21.08.2014    source источник


Ответы (1)


Вопрос: Зачем вам хранить 500 МБ или 200 МБ данных подряд в cassandra? Лучшее место для размеров разделов в cassandra — до 100 МБ, может быть, несколько сотен. Cassandra — это хранилище данных для быстрого хранения и быстрых запросов. 500мб данных тоже не дадут. Так зачем использовать кассандру для этого?

person ashic    schedule 21.08.2014
comment
Асик, согласен с тобой. Я пытаюсь выяснить, сколько времени Cassandra тратит на запись в зависимости от размера строки и пропускной способности клиента, координатора и целевых узлов. - person Naveen; 21.08.2014
comment
Если размер вашей строки соответствует распределению Пуассона, у вас обязательно будет несколько очень больших строк. Ответ, спрашивая, почему им нужно хранить так много данных в строке, упускает суть. - person Flavien; 06.12.2014