2015-12-23 1 views
14

Я использую spark 1.5.2. Мне нужно запустить искрообразование с кафкой в ​​качестве источника потоковой передачи. Мне нужно читать из нескольких тем в кафке и обрабатывать каждую тему по-разному.Spark: параллельно обрабатывается несколько вопросов о kafka

  1. Это хорошая идея сделать это на той же работе? Если да, должен ли я создать один поток с несколькими разделами или разными потоками для каждой темы?
  2. Я использую kafka прямое пар. Насколько я знаю, искра запускает длинные приемники для каждого раздела. У меня относительно небольшой кластер, 6 узлов с 4 ядрами каждый. Если у меня будет много тем и разделов в каждой теме, повлияет ли эффективность, так как большинство исполнителей заняты длинными приемниками? Пожалуйста, исправьте меня, если мое понимание не так

ответ

11

я сделал следующие замечания, в случае его полезным для кого-то:

  1. В Кафка прямого потока, приемники не запускать, как долго выполняющиеся задачи. В начале каждой партии inerval, сначала данные считываются от кафки у исполнителей. После чтения обрабатывающая часть берет верх.
  2. Если мы создадим один поток с несколькими темами, темы читаются один за другим. Кроме того, фильтрация dstream для применения другой логики обработки добавит еще один шаг к заданию
  3. Создание нескольких потоков помогло бы двумя способами: 1. Вам не нужно применять операцию фильтра для обработки разных тем по-разному. 2. Вы можете читать несколько потоков параллельно (в отличие от одного за другим в случае одного потока). Для этого существует недокументированный параметр конфигурации spark.streaming.concurrentJobs*. Итак, я решил создать несколько потоков.

    sparkConf.set("spark.streaming.concurrentJobs", "4"); 
    
+0

@CodyKoeninger, на какой уровень мы должны идти вниз, пока мы не знаем, все элементы внутри контейнеров из одной и той же темы? I.e., внутри RDD, я гарантированно, чтобы все записи были из одной темы? или это на уровне раздела? В этом случае существует ли API высокого уровня, который его раскрывает? – Stephane

+1

@Stephane До тех пор, пока вы не сделаете преобразование, разделение RDD прямого потока будет 1: 1 с тематическими разделами kafka. см. https://github.com/koeninger/kafka-exactly-once –

+0

@ prasad-khode - где я могу найти релевантность для этого «Если мы создадим один поток с несколькими темами, темы читаются один за другим», похоже, что это не задокументированная часть искрового потока кафки. – ASe

6

Я думаю, что правильное решение зависит от вашего прецедента.

Если ваша логика обработки одинакова для данных из всех тем, то, без сомнения, это лучший подход.

Если логика обработки отличается, я думаю, вы получаете одно RDD из всех тем, и вам нужно создать pairedrdd для каждой логики обработки и обрабатывать ее отдельно. Проблема в том, что это создает своего рода группировку для обработки, а общая скорость обработки будет определяться темой, для которой требуется самое длинное время для обработки. Поэтому темы с меньшим количеством данных должны ждать, пока данные из всех тем не будут обработаны. Одно из преимуществ заключается в том, что если это данные таймера, то обработка идет вместе, что может быть хорошо.

Другим преимуществом запуска независимых заданий является то, что вы получаете лучший контроль и можете настроить распределение ресурсов. Например, для заданий, которые обрабатывают тему с высокой пропускной способностью, может быть выделен более высокий процессор/память.

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