繁体   English   中英

如何在Spark中启用Kafka Producer指标?

[英]How to enable Kafka Producer Metrics in Spark?

我们在Spark 2.1上使用Kafka 0.10,我发现我们的生产者发布消息总是很慢。 给Spark执行程序提供8个内核后,我只能达到大约1k / s,而其他帖子则说,他们的汽车轻松达到数百万/秒。 我试图调整linger.ms和batch.size找出答案。 但是我发现linger.ms = 0对我来说似乎是最佳选择,而batch.size的影响不大。 而且我每次迭代发送16万个事件。 看来我必须启用Kafka Producer指标才能知道确切发生了什么。 但是,在Spark Executor中启用它似乎并不容易。

可以给我几个灯吗?

我的代码是这样的:

private def publishMessagesAttempt(producer: KafkaProducer[String, String], topic: String, messages: Iterable[(String, String)], producerMaxDelay: Long,
                                 individualMessageMaxDelay: Long, logger: (String, Boolean) => Unit = KafkaClusterUtils.DEFAULT_LOGGER): Iterable[(String, String)] = {
val futureMessages = messages.map(message => (message, producer.send(new ProducerRecord[String, String](topic, message._1, message._2))))
val messageSentTime = System.currentTimeMillis
val awaitedResults = futureMessages.map { case (message, future) =>
  val waitFor = Math.max(producerMaxDelay - (System.currentTimeMillis - messageSentTime), individualMessageMaxDelay)
  val failed = Try(future.get(waitFor, TimeUnit.MILLISECONDS)) match {
    case Success(_) => false
    case Failure(f) =>
      logger(s"Error happened when publish to Kafka: ${f.getStackTraceString}", true)
      true
  }
  (message, failed)
}
awaitedResults.filter(_._2).map(_._1)
}

我终于找到答案了。 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()实现并行性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM