近期项目中对SparkStreaming+Kafka模式使用过程中需要限制单批次最大数据量,在容器节点计算出现延迟或故障时进行自动降低消费频率,在此对几个参数进行分享,同时也为加深自己的印象;
由于项目中使用的技术组件主要为SparkStreaming+Kafka+Hbase+Elasticsearch,覆盖了从数据接入-逻辑计算-结果输出几个环节,且业务需求关系,计算逻辑较为复杂,需要与Hbase进行交互,计算结果写入ES,故保障Streaming的实施性及稳定性就非常关键;
val sparkConf = new SparkConf().setAppName("...")
//单位:毫秒,设置从Kafka拉取数据的超时时间,超时则抛出异常重新启动一个task
.set("spark.streaming.kafka.consumer.poll.ms", "100000")
//控制每秒读取Kafka每个Partition最大消息数(500*3*10=15000),若Streaming批次为10秒,topic最大分区为3,则每批次最大接收消息数为15000
.set("spark.streaming.kafka.maxRatePerPartition","500")
//开启KryoSerializer序列化
.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
//开启反压
.set("spark.streaming.backpressure.enabled"