如何在Spark中启用Kafka Producer度量标准?

时间:2018-05-17 17:46:13

标签: apache-spark apache-kafka

我们正在使用Kafka 0.10和Spark 2.1,我发现我们的制作人发布消息总是很慢。在向Spark执行者提供8个核心之后,我只能达到1k / s左右,而其他帖子说他们的汽车很容易达到数百万/秒。 我试着调整linger.ms和batch.size以找出答案。但是我发现linger.ms = 0看起来对我来说是最优的,而batch.size并没有太大的效果。我每次迭代发送160k事件。看起来我必须启用Kafka Producer Metrics以了解究竟发生了什么。但看起来在Spark Executor中启用它并不容易。

有人可以分享一些灯吗?

我的代码是这样的:

linewidths

1 个答案:

答案 0 :(得分:0)

我终于找到了答案。 1. KafkaProducer有一个metrics()函数,可以获取生产者的指标。只需打印就足够了。

这样的一些代码应该有效:

public class MetricsProducerReporter implements Runnable {
private final Producer<String, StockPrice> producer;
private final Logger logger =
        LoggerFactory.getLogger(MetricsProducerReporter.class);

//Used to Filter just the metrics we want
private final Set<String> metricsNameFilter = Sets.set(
        "record-queue-time-avg", "record-send-rate", "records-per-request-avg",
        "request-size-max", "network-io-rate", "record-queue-time-avg",
        "incoming-byte-rate", "batch-size-avg", "response-rate", "requests-in-flight"
);

public MetricsProducerReporter(
        final Producer<String, StockPrice> producer) {
    this.producer = producer;
}

@Override
public void run() {
    while (true) {
        final Map<MetricName, ? extends Metric> metrics
                = producer.metrics();

        displayMetrics(metrics);
        try {
            Thread.sleep(3_000);
        } catch (InterruptedException e) {
            logger.warn("metrics interrupted");
            Thread.interrupted();
            break;
        }
    }
}
  1. 我的代码很慢,因为scala地图默认情况下没有启用并行。我将不得不使用messages.par.map()来实现并行性。