Kafka直接消费者开始将读取限制为每批(5 * 90)450个事件(5 * 90个分区),之前运行正常1或2天(每批约5000到40000个事件)
我正在使用在AWS中运行的spark独立群集(spark和spark-streaming-kafka版本1.6.1)并使用S3存储桶作为检查点目录StreamingContext.getOrCreate(config.sparkConfig.checkpointDir, createStreamingContext)
,每个都没有调度延迟和足够的磁盘空间工人节点。
没有更改任何Kafka客户端初始化参数,非常确定kafka的结构没有改变:
val kafkaParams = Map("metadata.broker.list" -> kafkaConfig.broker)
val topics = Set(kafkaConfig.topic)
val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc, kafkaParams, topics)
也无法理解为什么当直接消费者描述说The consumed offsets are by the stream itself
时我仍然需要在创建流式上下文时使用检查点目录?
答案 0 :(得分:1)
这通常是通过将spark.streaming.backpressure.enabled
设置为true来启用背压的结果。通常,当背压算法发现有更多的数据进入时,它会开始将每个批次限制在一个相当小的尺寸,直到它可以“稳定”为止。本身又来了。这有时会产生误报并导致您的流速降低处理速度。
如果你想稍微调整启发式,它会使用一些未记录的标志(只是确保你知道你正在做什么):
val proportional = conf.getDouble("spark.streaming.backpressure.pid.proportional", 1.0)
val integral = conf.getDouble("spark.streaming.backpressure.pid.integral", 0.2)
val derived = conf.getDouble("spark.streaming.backpressure.pid.derived", 0.0)
val minRate = conf.getDouble("spark.streaming.backpressure.pid.minRate", 100)
如果您需要血腥的详细信息,PIDRateEstimator
就是您正在寻找的内容。