Spark中的spark.streaming.kafka.maxRatePerPartition的模拟模拟

时间:2016-06-10 12:09:57

标签: apache-spark apache-kafka apache-storm

Spark Streaming中有spark.streaming.kafka.maxRatePerPartition属性,它限制每秒从Apache Kafka读取的消息数。 Storm有类似的属性吗?

2 个答案:

答案 0 :(得分:1)

我认为没有限制每秒邮件数量的属性。

如果您使用new kafka client(kafka 0.9)喷口,您可以设置' MaxUncommittedOffsets'这将限制未通知的偏移量(即机上信息的数量)。

但是,如果您仍在使用旧的kafka spout(0.9之前的kafka),则可以使用storm属性'topology.max.spout.pending'来限制每个spout任务的未确认消息总数。

答案 1 :(得分:0)

有一种解决方法,有助于在Storm中实现这一点。您可以简单地为KafkaSpout编写以下包装器,它将计算每秒spout发出的消息数。当它达到所需的数字(Config.RATE)时,它什么都不返回。

public class MyKafkaSpout extends KafkaSpout {
    private int counter = 0;
    private int currentSecond = 0;
    private final int tuplesPerSecond = Config.RATE;

    public MyKafkaSpout(SpoutConfig spoutConf) {
        super(spoutConf);
    }

    @Override
    public void nextTuple() {
        if (counter == tuplesPerSecond) {
            int newSecond = (int) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
            if (newSecond <= currentSecond) {
                return;
            }
            counter = 0;
            currentSecond = newSecond;
        }

        ++counter;
        super.nextTuple();
    }
}