2016-10-10 5 views
0

Я новичок в Apache Flink и стараюсь понять некоторые рекомендации по масштабированию работ Flink Streaming вместе с Kafka. Некоторые вопросы, на которые я не могу найти ответы, включают:Масштабирование потока Apache Flink

  1. Сколько потоковых заданий может/должно быть запущено? Есть ли проблема с масштабируемостью при запуске слишком большого количества потоков? Сколько их слишком много?
  2. Если мы запустим, скажем, 2000 потоков, чтобы удовлетворить потребности бизнеса, каков наилучший способ управления этими потоками?
  3. Каков предпочтительный способ чтения данных потока из одного потока в другой? Можем ли мы присоединиться к потокам, выполнять непрерывные запросы и т. Д.??

Заранее благодарим за любую поддержку и извиняюсь, если эти вопросы кажутся несколько базовыми, но я пытаюсь получить лучшую ручку этой технологии. Я прочитал большую часть документации, но, по общему признанию, возможно, не объединять некоторые концепции из-за моего отсутствия опыта в этой области. спасибо за любую помощь!

ответ

1

-> Ограничений по количеству потоков нет, флайн будет масштабироваться в зависимости от памяти/CPU диспетчера заданий/диспетчера задач, используемой распараллеливания и количества слотов. Я использую YARN для управления ресурсами. Если количество подключенных потоков велико, тогда нам нужно быть немного осторожным, чтобы не все/основная часть обработки выполнялась в некоторых диспетчерах задач, так как это замедлит процесс. В кафкинском потоке могут быть задержки или внутренние задержки из-за того, что некоторые диспетчеры задач могут загружаться с большой нагрузкой, и для этого необходимо установить профилактические проверки.

-> Поддержка непрерывных запросов была построена как часть последней версии flink, вы можете проверить документацию flink для нее.

-> Если путем чтения одного потока данных другому вы подразумеваете подключение двух потоков в терминологии flink, тогда мы можем связать их с общим ключом и поддерживать состояние значения. Обратите внимание, что состояние значения сохраняется в диспетчере задач и не используется совместно с диспетчерами задач. Иначе, если вы подразумеваете объединение двух или более потоков, то мы можем строить плоские функции таким образом, чтобы данные из таких потоков поступали в стандартном формате.

Пример объединения: вал Stream1: DataStream [UserBookingEvent] = BookingClosure.getSource (RunMode) .getSource (ENV) .map (новый ClosureMapFunction)

вал stream2: DataStream [UserBookingEvent] = BookingCancel.getSource (RunMode) .getSource (ENV) .map (новый CancelMapFunction)

вал unionStream: DataStream [UserBookingEvent] = stream1.union (stream2)

import org.apache.flink.api.common.functions.MapFunction 
import org.json4s.jackson.JsonMethods.{parse => _, parseOpt => _} 
import org.json4s.native.JsonMethods._ 
import org.slf4j.{Logger, LoggerFactory} 

class CancelMapFunction extends MapFunction[String, Option[UserBookingEvent]] { 
    override def map(in: String): Option[UserBookingEvent] = { 
    val LOG: Logger = LoggerFactory.getLogger(classOf[CancelMapFunction]) 
    try { 
     implicit lazy val formats = org.json4s.DefaultFormats 

     val json = parse(in) 
     .............. 
    } catch { 
     case e: Exception => { 
     LOG.error("Could not parse Cancel Event= " + in + e.getMessage) 
     None 
     } 
    }