SparkStreaming+kafka参数设置

近期项目中对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","true")
      //开启推测,防止某节点网络波动或数据倾斜导致处理时间拉长(推测会导致无数据处理的批次,也消耗与上一批次相同的执行时间,但不会超过批次最大时间,可能导致整体处理速度降低)
      .set("spark.speculation","true")
      
      val ssc=new StreamingContext(sparkConf,Seconds(10))

关于“反压”说明:由于流计算中逻辑需要与Hbase进行交互,在Hbase节点出现故障或其他问题时,会导致原本10s一批次的任务无法按时完成,导致Job计算任务一直堆积,假设原有参数设置每批次接收10000条,在堵塞过程每个Batch会按照原有参数继续进行接收,此时“反压”生效后续堵塞的job会降低原有数据接收最大上限,以我项目中实例,原有每批次最大10000条,在Hbase故障后,堵塞延迟的job接收数据量为990~1000.待Hbase回复后,job计算效率回复,堵塞的批次逐步恢复正常。

 

 

 

 

你可能感兴趣的:(Spark)