- 博客(101)
- 收藏
- 关注
原创 Flink-DataStreamAPI-生成水印
为了处理事件时间,Flink需要知道事件时间戳,这意味着流中的每个元素都需要分配其事件时间戳。这通常是通过使用TimestampAssigner从元素中的某个字段访问/提取时间戳来完成的。时间戳分配与生成水印密切相关,水印告诉系统事件时间的进度。我们可以通过指定WatermarkGenerator来配置它。Flink API需要一个包含TimestampAssigner和WatermarkGenerator的WatermarkStrategy。
2025-03-07 08:55:34
1138
原创 Flink-DataStreamAPI-执行模式
注意:自定义运算符是Apache Flink的高级使用模式。对于大多数用例,请考虑改用(keyed-)进程函数。在编写自定义运算符时,记住对BATCH执行模式所做的假设非常重要。否则,适用于流式传输模式的运算符可能会在BATCH模式下产生错误的结果。运算符永远不会限定为特定键,这意味着他们会看到Flink试图利用的BATCH处理的某些属性。首先,您不应该在运算符中缓存最后看到的水印。在BATCH模式下,我们逐个键处理记录。因此,水印将在每个键之间从MAX_VALUE切换到MIN_VALUE。
2025-03-06 10:16:41
697
原创 Flink-序列化
几乎每个Flink作业都必须在其运算符之间交换数据,由于这些记录不仅可以发送到同一JVM中的另一个实例,还可以发送到单独的进程,因此需要先将记录序列化为字节。类似地,Flink的堆外状态后端基于本地嵌入式RocksDB实例,该实例以本机C++代码实现,因此也需要在每次状态访问时转换为字节。如果执行不正确,仅有线和状态序列化就很容易消耗作业的大量性能,因此,每当您查看Flink作业的分析器输出时,您很可能会在使用CPU周期的顶部看到序列化。因此,
2025-02-11 11:03:59
1187
原创 Flink-DataStream API
Flink的DataStream API 允许流式传输他们可以序列化的任何内容。Flink自己的序列化程序用于基本类型我们已经很熟悉了,下面我们看下复合类型。
2025-02-11 11:03:29
925
原创 Flink-WordCount源码解析
1、解析输入参数2、为Flink应用程序创建执行环境,该环境提供了控制作业执行(如设置并行性或容错/检查点参数)和与外部交互(数据访问)的方法。3、为环境设置执行模式,默认为STREAMING4、将Flink UI中的参数设置到环境中5、根据输入文件创建DataStreamSource<String>(它表示DataStream的起点),如果输入参数没有设置则用事先在内存中准备好的数据,这是整个程序第一个DataStream,像Spark程序一样可以使用算子将其转化成其他DataStream。
2025-02-06 17:49:18
1162
原创 Flink-初识
具有明确的开始和结束时间的数据流,且数据量是确定的:没有结束时间的数据流流是数据的自然栖息地,流可以来自网络服务器的事件、证券交易所的交易,工厂车间机器上的传感器等。但是当我们分析数据时,我们既可以将其当作有界流也可以当作无界流,选择哪种范式会产生深远的影响。
2025-02-06 17:48:46
908
原创 Spark-Streaming有状态计算
Spark-Streaming初识》中的NetworkWordCount示例只能统计每个微批下的单词的数量,那么如何才能统计从开始加载数据到当下的所有数量呢?下面我们就来通过官方例子学习下Spark-Streaming有状态计算。
2025-01-02 17:43:08
1183
原创 Structured-Streaming集成Kafka
Structured-Streaming初识》博客中已经初步认识了Structured-Streaming,Kafka作为目前最流行的一个分布式的实时流消息系统,是众多实时流处理框架的最优数据源之一。下面我们就跟着官方例子来看看Structured-Streaming是如何集成Kafka的?
2025-01-02 17:42:50
1407
原创 Structured-Streaming初识
Structured Streaming是一个基于SparkSQL引擎构建的可扩展且容错的流处理引擎。可以像在静态数据上表达批量计算一样表达流计算。SparkSQL引擎将负责以增量方式连续运行它,并在流数据继续到达时更新最终结果。可以使用Scala、Java、Python或R中的Dataset/DataFrame API来进行流聚合、事件时间窗口、流到批处理连接等的开发。它基于SparkSQL引擎优化而执行。最后,系统通过 checkpoint 和预写日志确保端到端的精确一次容错保证。
2024-12-27 18:10:49
836
原创 Spark-Streaming direct模式源码解析
Spark Streaming 一共有两种模式:receiver模式和direct模式,《Spark-Streaming receiver模式源码解析》中我们已经深入学习了receiver模式的原理,大致就是spark启用一个接收器取接收流数据并将其存储在自身的BlockManager中,每个微批任务会从其中获取未使用的数据进行计算。那么下面我们就来深入学习下direct模式。代码入口来源于《Spark-Streaming集成Kafka》中的示例。
2024-12-27 15:40:38
588
原创 Spark-Streaming receiver模式源码解析
Spark-Streaming初识》博客中我们用NetworkWordCount例子大致了解了Spark-Streaming receiver模式的运行。下面我们就通过该代码进行源码分析,深入了解其原理。
2024-12-20 16:59:04
1333
原创 Spark-Streaming集成Kafka
Spark Streaming集成Kafka是生产上最多的方式,其中集成Kafka 0.10是较为简单的,即:Kafka分区和Spark分区之间是1:1的对应关系,以及对偏移量和元数据的访问。与高版本的Kafka Consumer API 集成时做了一些调整,下面我们一起来看看吧。
2024-12-19 16:41:25
1392
原创 Spark-Streaming容错语义
为了理解Spark Streaming提供的语义,我们先回顾西Spark RDD的基本容错语义学。Spark对HDFS或S3等容错文件系统中的数据进行操作。因此,从容错数据生成的所有RDD也是容错的。然而,Spark Streaming并非如此,因为在大多数情况下,数据是通过网络接收的(使用fileStream时除外)。为了实现所有生成的RDD的相同容错属性,接收到的数据将在集群中工作节点的多个Spark executors 之间复制(默认复制因子为2)。
2024-12-19 09:07:34
703
原创 Spark-Streaming性能调优
Spark中的内存使用分为两类:执行和存储。执行内存是指用于洗牌、连接、排序和聚合中的计算,而存储内存是指用于缓存和跨集群传播内部数据的内存。在Spark中,执行和存储共享一个统一的区域(M)。当不使用执行内存时,存储可以获取所有可用内存,反之亦然。如果需要,执行可能会驱逐存储,但只有在总存储内存使用低于某个阈值(R)之前。换句话说,R描述了M中的一个子区域,其中缓存块永远不会被驱逐。由于实现的复杂性,存储可能不会驱逐执行。这种设计确保了几个理想的属性。
2024-12-16 17:39:44
942
原创 Spark-Streaming初识
Spark Streaming是Spark的上一代流式计算引擎。Spark Streaming不再有更新,它是一个遗留项目。Spark中有一个更新且更易于使用的流式计算引擎:Structured Streaming。因此我们只要做到初步了解并简单使用Spark Streaming就可以了。下面就让我们跟着官网来学习吧。
2024-12-16 10:54:38
1076
原创 Kafka-Streams初识
Kafka Streams是一个用于构建应用程序和微服务的客户端库,其中输入和输出数据存储在Kafka集群中,它结合了在客户端编写和部署标准Java和Scala应用程序的简单性与Kafka的服务器端集群技术的优势。它是编写实时应用程序和微服务的最简单方法。
2024-12-10 08:52:17
796
原创 Kafka-Connect源码分析
中我们尝试了零配置启动producer和consumer去生产和消费数据,那么它内部是如何实现的呢?下面我们从源码来揭开它神秘的面纱。
2024-12-03 23:59:17
1398
原创 Kafka-Connect自带示例
Kafka-Connect》中已经阐述了Kafka-Connect的理论知识,为了更生动的理解它,我们今天通过官方的一个小例子来感受下它的妙用。
2024-12-03 00:02:39
1075
原创 Kafka-Connect
Kafka Connect是一个在Apache Kafka和其他系统之间可扩展且可靠地流式传输数据的工具。细心的你会发现,我们编写的producer、consumer都有很多重复的代码,KafkaConnect就是将这些通用的api进行了封装。让我们可以只关心业务部分(数据的处理逻辑)。它可以以配置定义的方式实现数据的生产和消费。Kafka Connect可以将整个数据库或所有应用服务器的指标收集到Kafka主题中,使数据能够以低延迟进行流处理。
2024-11-29 14:04:09
1783
原创 Kafka-Consumer源码分析
1、构建并初始化KafkaConsumer2、订阅topic列表或指定分区拉取3、调用KafkaConsumer的poll()拉取数据4、调用LegacyKafkaConsumer的poll()拉取数据5、判断FetchBuffer中是否由数据,如果有直接返回6、如果FetchBuffer中没有数据,则开始拉取数据7、更新并校验元数据8、获取每个TopicPartition的目标节点(默认是该分区的leader节点)如果满足以下三个条件,则不从leader节点拉取1、之前已设置了首选副本。
2024-11-29 08:46:58
1717
原创 Kafka-Consumer理论知识
之前的博客我们分析了Kafka的设计思想、Kafka的Producer端、Kafka的Server端的分析,为了完整性,我们接下来分析下Kafka的Consumer。》中有对应的Consumer示例代码,我们以它为入口进行分析。
2024-11-22 14:02:24
1745
原创 Kafka-副本分配策略
我们大致分析了topic创建的流程,为了保持它的完整性和清晰度。细节并没有展开分析。下面我们就来分析下副本的分配策略以及副本中的leader角色的确定逻辑。当有了副本分配策略,才会得到分区对应的broker,才可以在topic目录下写入对应的数据。Controller端才可以让这些分区和副本上线去提供服务。副本的leader角色确定后才能使producer生产的数据知道第一个写入的broker节点是哪个?以及follower的同步工作。
2024-11-22 09:03:40
966
原创 Kafka-创建topic源码
从源码中我们可以看到,Controller这端会不断的将新的topic以及其下的topic_id、adding_replicas、removing_replicas、partitions 信息加载到缓存,并使用它们的状态机将它们更新至可用状态。并剔除掉删除的topic。》中当一个broker当选为Controller时第一件事就是注册监听器,去监听broker改变、topic改变、topic删除、isr改变等,并分别准备好了响应的处理逻辑。如果在描述主题时设置,则仅显示isr计数 < 配置的最小值的分区。
2024-11-19 15:10:25
4147
原创 Kafka-Controller角色需要做什么?
博客中分析了Controller是如何选举出来的,且比如会执行onControllerFailover()。接下来让我们看看Controller角色都承担了哪些职责。
2024-11-19 08:55:49
1133
原创 Kafka-Controller选举
1、设置zookeeper,如:zookeeper.connect=hostname1:2181,hostname2:2181,hostname2:2181/kafka并创建持久化目录:consumers、brokers/ids、brokers/topics、config/changes、admin/delete_topics、brokers/seqid、isr_change_notification、latest_producer_id_block、log_dir_event_notification。
2024-11-12 17:27:54
1080
原创 Kafka-follower同步leader数据
为每一个分区创建一个线程去leader拉取数据,如果这些分区的leader指向同一个broker,那么使用同一个线程。//每一个分区制作一个拉取器////为每一个分区拉取器创建一个线程,并启动起来// 如果多个分区的leader在一个broker上,那么重复使用fetcher线程,减少连接数//向线程添加分区时,会删除失败的分区//....//依次向leader所在的broker发送拉取请求try {//发送拉取请求} catch {、、....//处理拉取到的数据。
2024-11-12 14:47:44
1223
原创 Kafka-确定broker中的分区是leader还是follower
1、Kafka启动2、调用ApiKeys.LEADER_AND_ISR请求3、每个borker的ReplicaManager判断自身所持有的TopicPartition是leader还是follower4、leader角色的分区将自己的身份更新到元数据,并停止拉取数据5、follower角色的分区把自己标记为副本,producer以后也不会向其生产数据,而是启动fetcher线程去leader搬运数据。
2024-11-07 16:18:07
539
原创 Kafka-broker处理producer请求-leader篇
1、producer调用send发送数据2、kafka调用对应的api进行处理3、获取请求体中的数据4、校验是否有有效数据,如果没有立即返回5、调用副本管理器(ReplicaManager)将数据进行追加6、校验事务完成后处理回调,执行真正的数据追加7、对acks进行校验(必须是0、1、-1)8、循环处理这次请求中的每个topic、partition,调用Partition进行数据追加。
2024-11-07 08:52:59
981
原创 Kafka-broker粗粒度启动流程
1、将BrokerState置成 STARTING2、启动 ZkClient3、创建或获取cluster_id4、加载元数据5、生成brokerId6、启动KafkaScheduler7、配置并启动指标类服务8、确保所有存储目录都有meta.properties文件,并对其中的数据进行校验9、启动LogManager(负责日志的创建、检索和清理。
2024-10-30 16:37:25
1016
原创 Kafka-生产者源码分析
从前面的博客,我们已经了解了Kafka的设计思想、常用命令、参数配置、示例代码。下面我们从源码的角度来看下Kafka的生产者的内部细节。源码下载链接:https://downloads.apache.org/kafka/3.8.0/kafka-3.8.0-src.tgzproducer是一个将记录推送到Kafka集群的客户端producer是线程安全的,且跨线程共享单个生产者实例通常比拥有多个实例更快。它有一个缓冲内存池和一个后台I/O线程组成,缓冲内存池保存尚未传输到服务器的记录,后台I/O线程负责将这些
2024-10-29 15:31:18
937
原创 Kafka-设计思想-2
现在我们对生产者和消费者的工作方式有了一些了解,让我们讨论一下Kafka在生产者和消费者之间提供的语义保证。1、最多发送一次:会造成数据丢失2、至少发送一次:会造成数据重复消费3、只发送一次:我们想要的效果Kafka默认采用2,但允许用户通过在处理一批消息之前禁用生产者的重试并在消费者中提交偏移量来实现1想要达到第3点需要满足两点:1、生产者发布消息的持久性保证2、消费者使用消息的循序性保证期间可能出现的现象有:1、生产者和消费者可能挂掉2、多个消费者消费情况。
2024-10-16 17:39:53
1906
原创 SparkSQL-性能调优
在这个举国同庆的时刻,我们首先献上对祖国的祝福:第二,祝福我们国家未来的路越走越宽广,科技更发达,人民更幸福第三,我们会紧紧跟随您的脚步,一起为美好的未来奋斗。
2024-10-01 22:17:33
1698
原创 SprakSQL-Catalog
Catalog可以翻译为目录,意思就是用户在使用的时候可以通过它大致了解整个数据的框架和结构,比如:充当底层元存储(例如Hive元存储)的代理、管理其所属Spark会话的临时视图和函数。从源码的调用,我们可以清楚的知道Catalog对临时视图、hive库表、分区、函数进行了统一管理,其中临时视图是用要给map来维护它们的关系,hive方面的实体表是委托给HiveExternalCatalog调用HiveClient来进行操作。
2024-10-01 11:53:29
1103
原创 SparkSQL-执行流程
/为给定的SQL字符串创建逻辑计划//获取将ParseTree转换为AST的构建器(访问者)//这里用到了ANTLR的知识case _ =>//1、将sql转换成字符流//2、将字符流全部转换成大写,这大大简化了对流的词法分析,同时我们可以保持原始命令//3、词法分析是基于Hive的org.apache.hadoop.hive.ql.parse.ParseDriver.ANTLRNoCaseStringStream//4、Hive词法分析是基于ANTLR4。
2024-09-25 17:25:14
1403
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人