簡體   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