Flink并行数据源:ClickSource实现详解

目录

代码分析:

类定义:

成员变量:

[run 方法:](#run 方法:)

[cancel 方法:](#cancel 方法:)

时间戳和水位线:

代码拓展

增加事件类型:

动态调整事件生成频率:

增加事件过滤:

增加事件聚合:

增加事件重试机制:

增加事件分区:


Scala 复制代码
​​package source

import java.util.Calendar

import org.apache.flink.streaming.api.functions.source.{ParallelSourceFunction, SourceFunction}
import org.apache.flink.streaming.api.watermark.Watermark

import scala.util.Random

/**
 *
 * @PROJECT_NAME: flink1.13
 * @PACKAGE_NAME: source
 * @author: 赵嘉盟-HONOR
 * @data: 2025-05-19 2:20
 * @DESCRIPTION
 *
 */
//class ClickSource extends SourceFunction[Event]{  //串行执行
class ClickSource extends ParallelSourceFunction[Event]{ //并行执行
  var Running=true
  override def run(sourceContext: SourceFunction.SourceContext[Event]): Unit = {
    val random = new Random()

    val users=Array("Mary","Alice","Bob","Cary")
    val urls=Array("./home","./cart","./fav","./prod?id=1","./prod?id=2","./prod?id=3")

    while (Running){
      val event=Event(
        users(random.nextInt(users.length)),
        urls(random.nextInt(urls.length)),
        Calendar.getInstance.getTimeInMillis
      )
/*      //为要发送的数据分配时间戳
      sourceContext.collectWithTimestamp(event,event.timestamp)
      //像下游直接发送水位线
      sourceContext.emitWatermark(new Watermark(event.timestamp-1L))*/

      sourceContext.collect(event)
      Thread.sleep(1000)
    }
  }

  override def cancel(): Unit = {
    Running=false
  }
}

这段代码定义了一个自定义的 Flink 数据源 ClickSource,它实现了 ParallelSourceFunction[Event] 接口,用于生成模拟的用户点击事件流。以下是代码的详细解释:


代码分析:

类定义:
  • ClickSource 类实现了 ParallelSourceFunction[Event] 接口,这意味着它是一个可以并行执行的 Flink 数据源。
  • Event 是一个自定义的数据类型,表示用户点击事件。
成员变量:
  • Running 是一个布尔变量,用于控制数据源的运行状态。当 Runningtrue 时,数据源会持续生成事件;当 Runningfalse 时,数据源停止生成事件。
run 方法:
  • run 方法是 SourceFunction 的核心方法,用于生成数据并发送到 Flink 的数据流中。
  • random 是一个 Random 对象,用于生成随机数。
  • usersurls 是两个数组,分别存储了模拟的用户名和 URL。
  • while 循环中,代码随机选择一个用户和一个 URL,生成一个 Event 对象,并将其发送到 Flink 的数据流中。
  • sourceContext.collect(event) 用于将生成的 Event 发送到下游。
  • Thread.sleep(1000) 用于控制事件生成的频率,这里设置为每秒生成一个事件。
cancel 方法:
  • cancel 方法用于停止数据源的运行,将 Running 设置为 false
时间戳和水位线:
  • 注释掉的代码 sourceContext.collectWithTimestamp(event, event.timestamp)sourceContext.emitWatermark(new Watermark(event.timestamp - 1L)) 用于为事件分配时间戳和发送水位线。水位线是 Flink 中用于处理事件时间的重要机制。

代码拓展

增加事件类型:
  • 可以扩展 Event 类,增加更多的事件类型,例如点击类型(如"浏览"、"购买"等),以便生成更复杂的事件流。
Scala 复制代码
case class Event(user: String, url: String, eventType: String, timestamp: Long)
动态调整事件生成频率:
  • 可以通过外部配置或动态参数来调整事件生成的频率,而不是硬编码 Thread.sleep(1000)
Scala 复制代码
val interval = 1000 // 可以从配置文件中读取
Thread.sleep(interval)
增加事件过滤:
  • 可以在生成事件时增加过滤逻辑,例如只生成特定用户或特定 URL 的事件。
Scala 复制代码
if (event.user == "Mary") {
  sourceContext.collect(event)
}
增加事件聚合:
  • 可以在生成事件时进行简单的聚合,例如统计每个用户的点击次数。
Scala 复制代码
val userClickCount = scala.collection.mutable.Map[String, Int]()
userClickCount(event.user) = userClickCount.getOrElse(event.user, 0) + 1
  1. 增加事件序列化:

    • 如果需要将事件发送到 Kafka 或其他消息队列,可以增加事件的序列化逻辑。
    Scala 复制代码
    val serializedEvent = serialize(event)
    sourceContext.collect(serializedEvent)
增加事件重试机制:
  • 在发送事件时,可以增加重试机制,以应对网络或下游系统的故障。
Scala 复制代码
var retryCount = 0
while (retryCount < 3) {
  try {
    sourceContext.collect(event)
    retryCount = 3
  } catch {
    case e: Exception =>
      retryCount += 1
      Thread.sleep(1000)
  }
}
增加事件分区:
  • 如果需要将事件发送到不同的分区,可以根据事件的某些属性(如用户 ID)进行分区。
Scala 复制代码
val partition = event.user.hashCode % numPartitions
sourceContext.collect(partition, event)

通过这些扩展,可以使 ClickSource 更加灵活和强大,适应不同的业务需求。

相关推荐
效率工作实验室4 小时前
实时数据分析平台有哪些?流式分析引擎对比
flink·实时数据分析平台·流式分析引擎·流处理引擎对比·实时olap数据库
数智启示录4 小时前
Flink CDC 机制精讲(四):一条 SQLServer CDC 事件如何保持顺序 【面试宝典】
数据库·面试·sqlserver·flink
数智启示录5 小时前
Flink CDC 机制精讲(五):Operator UID、Savepoint 与安全升级 【面试宝典】
大数据·面试·flink
数智启示录5 小时前
Flink CDC 机制精讲(七):用故障注入证明链路是否可靠 【面试宝典】
大数据·经验分享·面试·flink
存在morning6 小时前
【Flink SQL 学习笔记 三】维表关联:Lookup Join、Temporal Join、窗口 Join
sql·学习·flink
数智启示录16 小时前
Flink CDC 机制精讲(二):Checkpoint Barrier 如何形成一致快照 【面试宝典】
大数据·经验分享·面试·flink
数智启示录1 天前
实时数据湖 flink CDC + Kafka +Doris 【企业级实战】Checkpoint、Offset、事务与幂等如何闭环 06
大数据·flink·kafka
江畔柳前堤1 天前
消息队列:从直觉到精通的完整认知地图
开发语言·人工智能·算法·机器学习·ruby on rails·scala
数智启示录1 天前
实时数据湖 Flink CDC + Kafka +Doris 【企业级实战】之Kafka 事件缓冲层 【附核心源码】 04
java·大数据·flink·kafka·数据库开发
数智启示录1 天前
实时数据湖 flink CDC + Kafka +Doris 【企业级实战】性能调优与生产运维闭环 09
运维·flink·kafka