2015-10-07 3 views
1

У меня есть опыт искры, но только начинается с Кассандры. Я пытаюсь сделать очень простое чтение и получить очень плохую производительность - не могу понять, почему. Вот код, я использую:cassandra искровой разъем читать производительность

sc.cassandraTable("nt_live_october","nt") 
    .where("group_id='254358'") 
    .where("epoch >=1443916800 and epoch<=1444348800") 
    .first 

enter image description here

все 3 Params являются частью ключа на столе:

PRIMARY KEY (group_id, эпоха, group_name, auto_generated_uuid_field) ) С КЛАСТЕРНЫМ ЗАКАЗОМ BY (эпоха ASC, group_name ASC, auto_generated_uuid_field ASC)

И выход я вижу от моего водителя, как это:

15/10/07 15:05:02 INFO CassandraConnector: Connected Кассандре кластера: shakassandra 15/10/07 15:07 : 02 ОШИБКА сессия: Ошибка создание пула для attila./198.xxx:9042 com.datastax.driver.core.ConnectionException: [attila./198.xxx:9042] Непредвиденная ошибка во время транспортировки инициализации (ком. datastax.driver.core.OperationTimedOutException: [attila /198.xxx:9042] Время работы от времени)

15/10/07 15:07:02 INFO SparkContext: Начало работы: взять на CassandraRDD.scala: 121

15/10/07 15:07:03 INFO BlockManagerInfo: Добавлено broadcast_5_piece0 в память о osd09: 39903 (размер: 4.8 Кб, бесплатно: 265,4 МБ)

15/10/07 15:08:23 ИНФО TaskSetManager: Закончено задача 0.0 на стадии 6.0 (TID, 8) в 80153 мс на osd09 (1/1)

15/10/07 15:08:23 ИНФО TaskSetManager: Закончено задача 0.0 на стадии 6.0 (TID 8) в 80153 мс на osd09 (1/1)

15/10/07 15:08:23 INFO DAGScheduler: ResultStage 6 (взять на CassandraRDD.scala: 121) закончил в 80.958 сек 15/10/07 15:08:23 INFO TaskSchedulerImpl: Удалены набор задач 6.0, задачи которого все завершено, из бассейна

15/10/07 15:08:23 INFO DAGScheduler: Работа 5 завершена: взять на CassandraRDD.scala: 121, принял 81.043413 s

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

  1. Он занимает почти две минуты, чтобы получить ошибку сеанса - я передать IP-адрес из 3 узлов Спарка разъема Cassandra - есть способ, чтобы сказать ему, чтобы пропустить неудачные соединения быстрее ?
  2. Задача отправляется работнику Spark, который не является узлом Cassandra - это кажется мне довольно странным - есть ли способ получить информацию о том, почему планировщик решил отправить задачу удаленному узлу?
  3. Даже если задача была отправлена ​​на удаленный узел, размер ввода (Макс.) Для этого рабочего отображается как 334,0 B/1, но время выполнения составляет 1,3 минуты (см. Рисунок). Это, кажется, очень медленно - я бы ожидать, время будет потрачено на десериализации, не вычислить ... enter image description here

Любые советы о том, как отладить это, где искать потенциальных проблем, очень высокую оценку. Использование Spark 1.4.1 с разъемом 1.4.0-M3, cassandra ReleaseVersion: 2.1.9, все значения по умолчанию для настраиваемых параметров разъема

ответ

1

Я думаю, что проблема заключается в распределении данных между разделами. В вашей таблице есть один кластер (разделяющий) ключ - groupId, epoch - только столбец кластеризации. Данные распространяются на узлах кластера только с помощью groupId, поэтому у вас есть огромный раздел с groupId = '254358' на одном узле кластера. Когда вы запускаете свой запрос, Cassandra достигает очень быстрого раздела с помощью groupId = '254358', а затем фильтрует все строки, чтобы найти записи с эпохой между 1443916800 и 1444348800. Если есть много строк, запрос будет очень медленным. На самом деле этот запрос не распространяется, он всегда будет работать на одном узле.

Лучше дата экстракта практика или даже час и добавить его в качестве ключа разделения, в вашем случае что-то вроде

PRIMARY KEY ((group_id, date), epoch, group_name, auto_generated_uuid_field) 
WITH CLUSTERING ORDER BY (epoch ASC, group_name ASC, auto_generated_uuid_field ASC) 

Чтобы проверить свою гипотезу, вы можете запустить свой текущий запрос в cqlsh с включением трассировки чтения here как сделай это. Таким образом, проблема не имеет ничего общего с Spark.

Об ошибке и времени, чтобы получить его, все в порядке, потому что вы получили сообщение об ошибке после того, как произошел тайм-аут.

Также я помню рекомендации разъема spark-cassandra, чтобы расположить спутники Spark к узлам Cassandra точно, чтобы распределять запросы с помощью ключа разделения.

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