Flink开发(一):概述与基础
目录
1. Flink概述
1.1 什么是Flink?
1.2 Flink的主要特点
2. Flink的核心组件
2.1 Flink架构
2.2 数据流模型
3. Flink的基础应用
3.1 开发环境配置
3.3 数据源和数据接收器
4. Flink的高级功能
4.1 状态管理与容错
4.2 窗口操作
5. Flink的应用场景
5.1 实时数据分析
5.2 机器学习
在现代数据处理领域,Apache Flink已成为实时大数据处理的首选技术之一。Flink的高效、低延迟和强大的容错能力使其在流处理和批处理场景中广受欢迎。本文将介绍Flink的基本概念、核心组件以及基础应用,帮助读者全面了解Flink的开发与应用。
1. Flink概述
1.1 什么是Flink?
Apache Flink是一款开源的流处理框架,支持实时数据流和批处理任务。它具有高吞吐量、低延迟和良好的容错性,能够处理海量数据并提供实时分析。
1.2 Flink的主要特点
- 低延迟和高吞吐量:Flink采用流式计算模型,能够实现毫秒级延迟,并且在处理大规模数据时仍能保持高吞吐量。
- 统一的流处理和批处理:Flink的API设计使得同一个代码可以同时用于流处理和批处理任务,简化了开发工作。
- 状态管理和容错机制:Flink通过检查点和状态快照技术,实现了强大的容错能力,确保数据处理的准确性和一致性。
2. Flink的核心组件
2.1 Flink架构
Flink的架构由以下几个核心组件构成:
- JobManager:负责协调作业的执行,包括任务调度、检查点管理和故障恢复。
- TaskManager:执行具体的计算任务,并管理任务的状态。
- Client:提交作业到Flink集群,并监控作业的执行状态。
2.2 数据流模型
Flink的核心是其数据流模型,主要包括以下三个部分:
- 数据源(Source):从外部系统读取数据,如Kafka、HDFS等。
- 转换操作(Transformation):对数据进行处理和转换,如map、filter、reduce等。
- 数据接收器(Sink):将处理结果输出到外部系统,如数据库、文件系统等。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 数据源
DataStream<String> text = env.readTextFile("path/to/input");// 转换操作
DataStream<Tuple2<String, Integer>> wordCounts = text.flatMap(new Tokenizer()).keyBy(0).sum(1);// 数据接收器
wordCounts.writeAsCsv("path/to/output");env.execute("Word Count Example");
3. Flink的基础应用
3.1 开发环境配置
要开始使用Flink,首先需要配置开发环境。以下是配置Flink开发环境的步骤:
- 安装Java:Flink依赖Java环境,需要安装Java JDK(推荐版本为JDK 8)。
- 下载Flink:从Apache Flink官方网站下载最新版本的Flink,并解压到本地目录。
- 配置IDE:推荐使用IntelliJ IDEA或Eclipse进行Flink开发,并安装相应的插件以支持Flink项目。
3.2 编写第一个Flink程序
下面是一个简单的Flink程序示例,实现了从文本文件读取数据并进行词频统计:
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.sink.PrintSinkFunction;
import org.apache.flink.streaming.api.functions.source.FileProcessingMode;public class WordCount {public static void main(String[] args) throws Exception {// 创建执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 读取文本文件DataStream<String> text = env.readFile(FileProcessingMode.PROCESS_ONCE, "path/to/input.txt");// 进行词频统计DataStream<Tuple2<String, Integer>> counts = text.flatMap(new Tokenizer()).keyBy(0).sum(1);// 打印结果counts.addSink(new PrintSinkFunction<>());// 执行程序env.execute("Word Count Example");}
}
3.3 数据源和数据接收器
Flink支持多种数据源和数据接收器,包括文件、Kafka、数据库等。以下是从Kafka读取数据并将结果写入Kafka的示例:
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;import java.util.Properties;public class KafkaExample {public static void main(String[] args) throws Exception {// 创建执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// Kafka消费者配置Properties consumerProperties = new Properties();consumerProperties.setProperty("bootstrap.servers", "localhost:9092");consumerProperties.setProperty("group.id", "test");// 从Kafka读取数据DataStream<String> stream = env.addSource(new FlinkKafkaConsumer<>("input-topic", new SimpleStringSchema(), consumerProperties));// 处理数据(示例:将所有字符转换为大写)DataStream<String> processedStream = stream.map(String::toUpperCase);// Kafka生产者配置Properties producerProperties = new Properties();producerProperties.setProperty("bootstrap.servers", "localhost:9092");// 将结果写入KafkaprocessedStream.addSink(new FlinkKafkaProducer<>("output-topic", new SimpleStringSchema(), producerProperties));// 执行程序env.execute("Kafka Example");}
}
4. Flink的高级功能
4.1 状态管理与容错
Flink提供了丰富的状态管理和容错机制,确保在处理数据时的高可靠性和一致性。Flink支持有状态的流处理,通过检查点和状态快照实现故障恢复。
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;public class StatefulFlatMap extends RichFlatMapFunction<String, Tuple2<String, Integer>> {private transient ValueState<Integer> countState;@Overridepublic void open(Configuration parameters) {ValueStateDescriptor<Integer> descriptor =new ValueStateDescriptor<>("count", Integer.class, 0);countState = getRuntimeContext().getState(descriptor);}@Overridepublic void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {Integer count = countState.value();count++;countState.update(count);out.collect(new Tuple2<>(value, count));}
}
4.2 窗口操作
窗口操作是流处理中的核心概念,Flink支持多种窗口操作,包括滚动窗口、滑动窗口和会话窗口。以下是一个滚动窗口的示例:
import org.apache.flink.streaming.api.windowing.time.Time;DataStream<Tuple2<String, Integer>> counts = text.flatMap(new Tokenizer()).keyBy(0).timeWindow(Time.minutes(1)).sum(1);
5. Flink的应用场景
5.1 实时数据分析
Flink广泛应用于实时数据分析场景,如实时日志分析、监控数据处理、点击流分析等。
DataStream<String> logStream = env.addSource(new FlinkKafkaConsumer<>("log-topic", new SimpleStringSchema(), consumerProperties));DataStream<Tuple2<String, Integer>> errorCounts = logStream.filter(line -> line.contains("ERROR")).flatMap(new Tokenizer()).keyBy(0).timeWindow(Time.minutes(1)).sum(1);errorCounts.addSink(new FlinkKafkaProducer<>("error-count-topic", new SimpleStringSchema(), producerProperties));
5.2 机器学习
Flink可以与机器学习库集成,用于实时预测和模型训练。
import org.apache.flink.ml.api.misc.param.Params;
import org.apache.flink.ml.feature.standardscaler.StandardScaler;
import org.apache.flink.ml.feature.standardscaler.StandardScalerModel;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.table.api.bridge.java.Tumble;StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);// 从Kafka读取数据
DataStream<String> stream = env.addSource(new FlinkKafkaConsumer<>("input-topic", new SimpleStringSchema(), consumerProperties));// 转换为Table
Table inputTable = tEnv.fromDataStream(stream);// 标准化处理
StandardScaler scaler = new StandardScaler().setInputCol("features").setOutputCol("scaledFeatures");StandardScalerModel model = scaler.fit(inputTable);
Table scaledTable = model.transform(inputTable);scaledTable.executeInsert("output-topic");
相关文章:
Flink开发(一):概述与基础
目录 1. Flink概述 1.1 什么是Flink? 1.2 Flink的主要特点 2. Flink的核心组件 2.1 Flink架构 2.2 数据流模型 3. Flink的基础应用 3.1 开发环境配置 3.3 数据源和数据接收器 4. Flink的高级功能 4.1 状态管理与容错 4.2 窗口操作 5. Flink的应用场景 …...

GD32E503实现串口中断收发功能
如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…...

照片怎么提取文字?分享5种简单好用的提取方法
在我们日常的学习或者是办公中,往往会使用到大量的图片文件,而在这些图片中往往蕴含着丰富的文字信息,但手动输入不仅费时费力,还容易出错。如果能够一键提取出图片中的文字就会大大提高工作效率,下面给大家分享5种提取…...
最佳云服务器推荐:三丰云免费虚拟主机和云服务器
随着云计算技术的不断发展,越来越多的企业和个人开始将业务迁移到云端。在这个过程中,选择一款稳定、高效、性价比高的云服务器至关重要。今天,我就为大家推荐一家备受好评的云服务器提供商——三丰云(https://www.sanfengyun.com…...
IPKISS Tutorial 目录(目前 45 篇 持续更新中,部分教程尚未制作成目录)
IPKISS Tutorial 目录 芯片版图绘制教程IPKISS Tutorial(5)Basis直接创建结构(1)PCell(3)Layer and Template(Trace Template)(2)参数查询(2)Lumerical API&a…...

加强混合工作时代的组织网络安全态势
随着组织转向采用和实施混合和远程工作模式,网络安全的重要性从未如此重要。虽然工作场所的这种演变提供了灵活性并有望提高生产力,但它也带来了组织无法忽视的无数网络安全挑战。多样化工作环境的整合需要强大的安全措施、创新的保护策略和警惕的文化&a…...

vivado报错:file ended before end of clause
最近在学习Xilinx FPGA时,遇到 Vivado 报错如下图所示: 刚开始,看到错误是在第1行代码中出现的,我的第一反应是该行代码写错了,然后搜了搜语法,发现没错。 分析报错信息发现,该错误应该是和文件…...

基于asp.net的webform框架的校园点餐系统源码
今天给大家分享一套基于asp.net的webform框架的网页点餐系统,适合课程设计参考及其自己学习,需要的小伙伴自己参考下,下载链接我放在后面了 主要功功能 系统的主要功能包含:前端点餐页面、加入购物车、商品食物浏览、我的购 物车…...

俞敏洪,真窝囊?
文|琥珀食酒社 作者 | 璇子 大家都被俞敏洪骗了 当年《中国合伙人》一播出 俞敏洪竟抱怨黄晓明说: “你把我演得太窝囊!” 那俞敏洪真的不窝囊吗? 他培养出董宇辉 让他赚了近6亿 结果人没留住、公司也送了人 还要被丈母娘…...
速盾:高防ip和cdn哪个好?
高防IP和CDN是两种常见的网站安全解决方案,它们在提供网站安全保护方面有着不同的优势和特点。下面,我们将从技术原理、性能优势和适用场景等方面进行比较,帮助您选择适合自己网站的解决方案。 首先,我们来看看高防IP的特点。高防…...

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理
本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理,同时总结一些代表性工作。 注:图像代表Image,视频代表Video(不含声音),音频代表 Audio/Music,语音代表Speech 各种…...

如何使用 Puppeteer 和 Node.JS 进行 Web 抓取?
什么是 Headlesschrome? Headless?是的,这意味着这个浏览器没有图形用户界面 (GUI)。不用鼠标或触摸设备与视觉元素交互,你需要使用命令行界面 (CLI) 来执行自动化操作。 Headlesschrome 和 Puppeteer 很多网页抓取工具都可适用…...
JDK 8 有哪些新特性?
JDK 8 引入了一系列新特性,主要包括: 1. 元空间替代了永久代 解决了永久代的内存管理、性能问题。提高了类加载器的隔离性。增强了可扩展性和跨平台性。提升了与垃圾收集器的兼容性。 因为 JDK8 要把 JRockit 虚拟机和 Hotspot 虚拟机融合,…...

C++ Win32API 贪吃蛇游戏
程序代码: #include <windows.h> #include <list> #include <ctime>// 定义游戏区域大小 const int width 20; const int height 20;// 定义贪吃蛇的方向 enum Direction { UP, DOWN, LEFT, RIGHT };// 定义贪吃蛇的节点 struct SnakeNode {in…...

【Python实现代码视频/视频转字符画/代码风格视频】
该程序改良自GitHub开源项目VideoCharDraw 在源程序CharDraw_thread.py 带压缩和多线程版本字符画的基础上使用Tkinter库添加了图形化的操作,使用户操作体验更方便。 什么是视频字符画? 视频转字符画是一种将视频中的每一帧图像转换为由字符组成的图…...

基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统
Title 题目 Evaluation of a Cascaded Deep Learning–based Algorithm for Prostate Lesion Detection at Biparametric MRI 基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估 Background 背景 Multiparametric MRI (mpMRI) improves prostate cancer (PCa) de…...

基于STM32开发的智能门铃系统
目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭门铃系统智能社区门禁管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能门铃系统结合了传统门铃功能与现代技术,通过摄像头、麦克风、…...
【WebRTC指南】远程视频流
远程视频流使用入门 RTCPeerConnection 连接到远程对等设备后,就可以在它们之间流式传输音频和视频。此时,我们会将从 getUserMedia() 收到的数据流连接到 RTCPeerConnection。媒体流包含至少一个媒体轨道,当我们想将媒体传输到远程对等设备时,它们会分别添加到 RTCPeerCo…...
前端构建URL的几种方法比对,以及函数实现
当我们在前端开发中处理 URL 时,可能会用到字符串拼接、ES6 模板语法 (template literals) 或者使用 new URL() 构造函数。这三者各有优劣,适用于不同的场景。 1. 字符串拼接与 ES6 模板语法 字符串拼接 和 ES6 模板语法 都是将不同的字符串片段组合在…...

场外个股期权如何发出行权指令?
场外期权行权指令也就是平仓指令的意思,一般场外个股期权交易有三种方式开仓和行权平仓指令,分别是市价,限价和半小时询价,跟普通股票的买卖和交易方式类似,唯一区别是手动发出场外个股期权的行权指令,下文…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...