当使用Spark Streaming的Direct方式接受Kafka数据时, 如果kafka中的数据过多, 会导致spark数据积压, 无法准时完成作业, 甚至OOM。
Spark的运行指标及调优的目标
共两个运行指标:调度延迟与执行延迟。
调优的目标是在SparkStreaming设定的批次时间间隔内, spark能够完整处理完一个批次, 而不会出现无法准时完成作业, 数据堆压等问题。
PS: 要提升数据处理的吞吐量, 就提升kafka的分区数
限制Kafka的最大流量
配置项
spark.streaming.kafka.maxRatePerPartition
, 设置了每秒钟从每个分区中所获得的数据条数的最大值, 每个批次处理的数据条数 = 批次时间 * 分区数 * N
背压机制(back pressure) 弹性地调整Kafka的流量
在上一节中的配置项难以调控, 具体的值不易设置, 可以使用back pressure机制来动态地调整从kafka获得的数据量。 back pressure机制会根据上一批次的运行情况来动态调整获取的数据量。
打开back pressure: 设置
spark.streaming.backpressure.enabled
为
true
二者结合来调控kafka的流量
在开启背压机制时, 程序运行的第一个批次没有其他批次的运行情况作为参考, 会获取相当多的数据, 可能会导致OOM, 因此需要设置kafka的最大流量。 在两者均开启的情况下, 背压机制划定了数据量的下限, 另一个划定了上限, 可以有效控制SparkStreaming所接受到的数据量。
转载于:https://my.oschina.net/dreamness/blog/3072799