auto.offset.reset = earliest
注意:和SparkStreaming整合时,上面的可选参数是无效的,只有两个可选参数:
参数角度:
1)调大每次获取的数据量
spark.streaming.kafka.maxRatePerPartition
参数来控制每个 Kafka 分区每秒最大接收的数据量
2)轮询间隔
spark.streaming.kafka.consumer.poll.ms
参数来调整 Kafka 消费者的轮询间隔,以减少消费者获取数据的延迟
3)checkpoint的目录设置在可靠的文件系统上
1.手动维护偏移量(kafka)
2.做完维护业务数据操作后,提交偏移量。
极端情况下在checkpoint提交时断电导致重复消费,所以在涉及金额等精确性非常高的环境里就使用 事务+偏移量 去保证精确一次消费。
默认消费Kafka后是自动提交偏移量的(默认5秒自动提交一次)
实现精确一次消费的常见方法:
生产者
1.消息队列的集成,如kafka,可以使用 Kafka 的 Offset 来记录已消费的消息的偏移量,并定期提交偏移量到 Kafka 的特殊主题中。在出现故障后,可以使用提交的偏移量来恢复消费过程,并确保不会重复消费数据。
消费者
2.写入外部存储:将接收到的数据写入外部存储系统(如 HDFS 或分布式数据库),并定期记录已处理数据的标识(如文件的偏移量或处理时间戳)。在故障恢复时,可以根据记录的标识来确定从哪里恢复数据处理
3.事务性写入:使用支持事务性写入的外部存储,如 Apache HBase 或 Apache Phoenix,可以在写入数据时确保事务的原子性,以避免数据丢失或重复写入。
SS内部:
内部状态管理:使用 Spark Streaming 内部的状态管理机制,如窗口操作或累加器,可以跟踪已处理数据的状态,并在故障恢复时使用该状态来恢复处理过程。
SS的checkpoint机制:
使用StreamingContext
对象的checkpoint()设置路径,可以实现在指定路径周期性的记录ss的一些元数据和状态信息,再通过对象的getorCreate()获得这些checkpoint信息StreamingContext,自动加载之前保存的 Checkpoint。
通过 spark.streaming.kafka.maxRatePerPartition 参数来设置 Spark Streaming 从 kafka 分区每秒 拉取的条数
spark.streaming.backpressure.enabled 参数设置为 ture,开启背压机制后 Spark Streaming 会 根据延迟动态去 kafka 消费数据,上限由 spark.streaming.kafka.maxRatePerPartition 参数控制, 所以两个参数一般会一起使用
动态控制SS消费数据的速率,监控数据输入和处理的速率和系统利用率等指标,来自动调节数据处理的速度。当生产数据速度大于消费数据的速度时,背压机制会自动降低数据的输入速率
背压实现的构成组件:
1.direct或receiver:基于d or r连接 监控速率
2.ratecontroller:核心组件,监控数据输入和处理的速率和系统利用率等指标,来自动调节数据处理的速度。
3.BlockGenerator:负责将接收到的数据切分成小块,并提交给ratecontroller处理。
SS中一个批处理包含若干个stages,每个stage包含多个操作,一个stage耗时是指一个批处理时间内,一个stage完成所需的时间。
SS中数据流被划分为很多的微批,即任务(1个微批=1个任务),是最小的执行单元,一个阶段stage可以包含多个任务。
总结,批处理是对一批数据进行处理,而stage是一组相关任务的逻辑单元,用于执行一系列相互依赖的转换操作。
Spark 引擎负责任务的划分、阶段的调度和任务的执行。整个批处理过程包括数据加载、转换操作、任务划分、阶段调度和结果输出等步骤。
spark.streaming.stopGracefullyOnShutdown=true,SS会在JVM关闭后 ,关掉 StreamingContext,而不是立马关闭。
yarn application -kill [applicationid]
Spark Streaming 默认分区个数
SparkStreaming默认分区个数与所对接的kafka的topic分区个数保持一致,不会使用repartition去增大分区个数,因为会引起shuffle降低效率。