在从Kafka读取消息时,如何设置最佳配置值-触发时间,maxOffsetsPerTrigger-Spark结构化流?

时间:2019-06-17 07:51:26

标签: apache-spark apache-kafka spark-streaming spark-structured-streaming

我有一个结构化流应用程序,它从Kafka中读取消息。每天的总邮件数约为180亿,每分钟的峰值邮件数= 12,500,000。 邮件大小上限为2 KB。

如何确保结构化流应用程序能够处理这么大的数据量和速度?基本上,我只想知道如何设置最佳触发时间,maxOffsetsPerTrigger或任何其他使工作顺利进行并能够处理故障并重新启动的配置。

1 个答案:

答案 0 :(得分:1)

您可以按固定间隔的微型批次或连续运行spark结构化流应用程序。以下是一些可用于调整流式应用程序的选项。

Kafka配置:

Kafka中的分区数:

您可以增加Kafka中的分区数。结果,更多的使用者可以同时读取数据。根据输入速率和引导服务器的数量将此值设置为适当的数字。

火花流配置:

驱动程序和执行程序的内存配置:

计算每个批次中的数据大小(#records *每个消息的大小),并相应地设置内存。

执行人数量:

在kafka主题中将执行程序的数量设置为分区数。这增加了并行度。同时读取数据的任务数。

偏移量上限:

每个触发间隔处理的最大偏移数的速率限制。指定的偏移总数将按比例分配给不同卷的主题分区。

  val df = spark
    .read
    .format("kafka")
    .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
    .option("subscribe", "topicName")
    .option("startingOffsets", "latest")
    .option("maxOffsetsPerTrigger", "1000000")
    .load()

通过检查点从故障中恢复:

万一发生故障或有意关闭时,您可以恢复上一个查询的先前进度和状态,并在中断的地方继续进行。这是使用检查点日志和预写日志完成的。

finalDF
  .writeStream
  .outputMode("complete")
  .option("checkpointLocation", "path/to/HDFS/dir")
  .format("memory")
  .start()

触发:

流查询的触发器设置定义了流数据处理的时间,无论该查询是作为具有固定批处理间隔的微批查询还是作为连续处理查询执行。