Flink入门(更新中)

目录

1.1 基本概念

1.1.1 flink简介

1.2 flink编程模版

1.3 常用概念

1.2.1 datastream

1.2.2 算子、Task

1.2.3 多流操作

1.2.6 时间语义

二、Flink编程实战(Java)

2.1 wordcount


1.1 基本概念

1.1.1 flink简介

1.图片介绍

性能:

  1. 低延迟
  2. 高吞吐
  3. 内存计算

运维:

  1. 弹性实施部署机制
  2. 高可用配置
  3. 保存点恢复机制

准确性保证:

  1. exactly-once 状态一致性
  2. 事件时间处理
  3. 专业的迟到数据处理

2.对比mapreduce

相似性

  1. 数据处理框架:都是大数据处理框架,都提供了一套编程模型和API,使得开发人员能处理大规模数据集。

  2. 分布式处理:都支持分布式处理,即数据可以在多个节点上并行处理。在MapReduce中,作业被拆分成多个map任务和reduce任务,这些任务在集群的多个节点上并行执行。在Flink中,数据流也被分割成多个部分,并在不同的任务(Task)中并行处理。

  3. 数据分区和聚合:在MapReduce中,map阶段的数据通常会被分区(sharding),并在reduce阶段进行聚合(如求和、计数等)。在Flink中,也有类似的机制,比如使用keyBy算子对数据进行分区,然后使用聚合函数(如summax等)对分区内的数据进行处理。

  4. 容错机制:都提供了容错机制,以确保在节点故障或数据丢失时能够恢复作业的执行。MapReduce通过检查点(checkpointing)和重试机制来实现容错,而Flink则提供了包括基于状态的容错和精确一次(exactly-once)语义的保证。

区别:

  1. 处理模式MapReduce是批处理框架,处理的是静态数据集(即数据在作业开始之前就已经存在)。而Flink是流处理框架,它处理的是实时数据流(即数据是持续不断地产生的)。

  2. 实时性:Flink支持低延迟的实时数据处理,能够处理毫秒级甚至微秒级的数据。而MapReduce则更适合于离线批处理场景,其处理延迟通常较高。

  3. 状态管理:Flink提供了更强大的状态管理能力,它能够在任务之间或故障恢复后保持状态的一致性,且API更丰富。

1.2 flink编程模版

1.万卷不离其宗!!!运行模型通常包括三个部分:Source(数据源)、Transformation(转换操作)、Sink(输出)。

  1. 获取一个编程之行入口环境env
  2. 通过数据源组建,加载,创建datastream
  3. 对datastream调用各种处理算子表达计算逻辑
  4. 通过sink算子指定计算结果指定计算结果的输出方式
  5. 在env上触发程序提交执行

2.添加依赖

对于Maven项目,在pom.xml文件中添加<dependency>元素,代码举例:

<dependencies>  <!-- Flink核心库 -->  <dependency>  <groupId>org.apache.flink</groupId>  <artifactId>flink-core</artifactId>  <version>你的Flink版本号</version>  <!-- 通常这个依赖的作用域设置为provided,但根据你的项目需求可以调整 -->  <!-- <scope>provided</scope> -->  </dependency>  <!-- Flink流处理库(Java API) -->  <dependency>  <groupId>org.apache.flink</groupId>  <artifactId>flink-streaming-java_你的Scala版本</artifactId>  <version>你的Flink版本号</version>  <!-- 如果在IDE中运行,可能需要将作用域设置为compile或runtime -->  <!-- <scope>compile</scope> -->  </dependency>  <!-- 如果你还需要使用Table API或SQL,则可以添加以下依赖 -->  <!-- Flink Table API和SQL的Java桥接库 -->  <dependency>  <groupId>org.apache.flink</groupId>  <artifactId>flink-table-api-java-bridge_你的Scala版本</artifactId>  <version>你的Flink版本号</version>  <!-- 通常这个依赖的作用域也设置为provided -->  <!-- <scope>provided</scope> -->  </dependency>  <!-- 注意:上述示例中的“你的Flink版本号”和“你的Scala版本”需要替换为实际的版本号 -->  <!-- Flink的版本号可以从Apache Flink的官方网站或Maven中央仓库获取 -->  <!-- Scala的版本号取决于你使用的Flink版本和Scala兼容性 -->  
</dependencies>

1.3 常用概念

1.2.1 datastream

  1. DataStream代表一个数据流,它可以是无界的,也可以是有界的;
  2. DataStream类似于spark的rdd,它是不可变的(immutable);
  3. 无法对一个datastream进行自由的添加或删除或修改元素;
  4. 只能通过算子对datastream中的数据进行转换,将一个datastream转成另一个datastream;
  5. datastream可以通过source算子加载、映射外部数据而来;或者从已存在的datastream转换而来

1.2.2 算子、Task

1.算子(Operator)可以被通俗地理解为一种可以调用的函数或操作,它们对数据进行处理或转换。不过,与传统的函数相比,Flink的算子是在分布式环境中执行的,它们能够处理无限的数据流或有限的数据集。

举例:

  • Window算子:Window算子就像是一个定时闹钟和一堆小盘子。你设置了时间间隔(比如每分钟、每小时),当时间到了,闹钟就会响,然后你把这段时间内收集到的所有食材(数据)放到一个小盘子里进行统一处理。这样可以让你看到数据随时间变化的趋势。

  • Filter算子:Filter算子就像是一个筛子。你把食材(数据)倒进筛子里,只有满足特定条件(比如大小、颜色等)的食材才能通过筛子继续向下流动。这个过程中,不满足条件的食材就被淘汰了。
  • Sink算子(Sink Operator):是数据流处理管道中的一个重要组成部分,它负责将处理后的数据输出到外部系统或存储中。Sink是数据流处理的终点,它接收来自上游算子的数据,并将其发送到目的地,如文件系统、数据库、消息队列等。

2.task,subtask

  1. flink程序中,每一个算子都可以成为一个独立任务(task);
  2. flink程序中,视上下游算子间数据分发规则、并行度、共享槽位设置,可组成算子链成为一个task
  3. 每个任务在运行时都可拥有多个并行的运行实例(subTask);
  4. 且每个算子任务的并行度都可以在代码中显式设置;

3. Task和算子的联系

  1. 共同作用于数据流处理:Task和算子都是处理数据流的关键组成部分。Task是执行单元,而算子定义了数据流上的具体操作。
  2. 优化与执行:为了提高处理效率和减少资源消耗,Flink会将多个算子链接(chain)成一个Task,在同一个线程中执行。

1.2.3 多流操作

多流操作指的是在数据流处理过程中,对两个或多个数据流进行各种转换和合并的操作。这些操作使得Flink能够处理复杂的数据流场景,如数据分流(将一条数据流拆分成多条)、数据合流(将多条数据流合并成一条)以及双流联结(基于特定条件将两条数据流联结起来)等。

1.2.6 时间语义

1. 事件时间(Event Time)

事件时间是指数据本身所携带的时间戳,即数据实际发生或产生的时间。你可以把它想象成每个数据项都自带了一个“出生证”,上面写着它是什么时候被创造出来的。在Flink中,事件时间允许我们按照数据实际发生的时间顺序来处理数据,即使这些数据在系统中是乱序到达的。

2. 处理时间(Processing Time)

处理时间是指数据在Flink系统中被处理时所在机器的系统时间。你可以把它想象成每个处理节点都有一个“本地时钟”,这个时钟告诉节点当前是什么时候,并且所有基于时间的操作都使用这个时钟的时间。

3. 摄入时间(Ingestion Time)

摄入时间是指数据进入Flink系统的时间戳,即数据被Flink Source算子接收的时间。你可以把它想象成Flink系统有一个“大门”,所有数据都要通过这个大门进入,而大门上有一个“计时器”,记录着每个数据项进门的时间。

二、Flink编程实战(Java)

2.1 wordcount

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI推出SearchGPT:革新搜索体验的新工具

引言 原文链接 在信息爆炸的时代&#xff0c;搜索引擎已经成为人们日常生活中不可或缺的工具。然而&#xff0c;传统的搜索引擎在理解复杂查询和提供准确答案方面仍有许多不足。为了解决这一问题&#xff0c;OpenAI与20240725推出了SearchGPT原型&#xff0c;将生成式AI与传统…

kafka源码阅读-ReplicaStateMachine(副本状态机)解析

概述 Kafka源码包含多个模块&#xff0c;每个模块负责不同的功能。以下是一些核心模块及其功能的概述&#xff1a; 服务端源码 &#xff1a;实现Kafka Broker的核心功能&#xff0c;包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…

Vue常用指令及其生命周期

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.常用指令 1.1 v-bind 1.2 v-model 注意事项 1.3 v-on 注意事项 1.4 v-if / v-else-if / v-else 1.5 v-show 1.6 v-for 无索引 有索引 生命周期 定义 流程 1.常用指令 Vue当中的指令…

数据库水印算法三道题

针对数据库水印算法的面试题&#xff0c;由简单到困难&#xff0c;可以设计以下三道题目&#xff1a; 1. 基础理解题 题目&#xff1a;请简要解释什么是数据库水印算法&#xff0c;并说明其主要应用场景。 参考答案&#xff1a; 数据库水印算法是一种在数据库中嵌入隐蔽信息…

Red Hat 9.4 配置Yum镜像源

1. 虚拟机信息 镜像&#xff1a;rhel-server-9.4-x86_64-dvd.iso 系统版本&#xff1a;Red Hat 9.4 版本信息&#xff1a; cat /etc/redhat-release Red Hat Enterprise Linux release 9.4 (Plow)2. 配置文件 vim /etc/yum.repos.d/local.repo # 按i键&#xff0c;输入以下内…

Linux 普通用户启动Nginx使用80端口,小于1024的端口

让 Nginx 运行在 root 权限下&#xff1a; 在root用户下执行 cd /usr/local/nginx/sbin/ chown root nginx chmod us nginx或者&#xff1a;cd /usr/local/nginx/sbin/ sudo chown root nginx sudo chmod us nginx

远程项目调试-informer2020

informer2020 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文&#xff09;Informer 是一个基于Transformer的模型&#xff0c;是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方…

[笔记]ONVIF服务端实现[进行中...]

1.文档搜索&#xff1a; 从&#xff1a;https://www.cnblogs.com/liwen01/p/17337916.html 跳转到了&#xff1a;ONVIF协议网络摄像机&#xff08;IPC&#xff09;客户端程序开发&#xff08;1&#xff09;&#xff1a;专栏开篇_onvif 许振坪-CSDN博客 1.1原生代码支持&…

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 &#xff08;一&#xff09;、用户的概念 &#xff08;二&#xff09;、组的概念 补充组 主要组 二、获取超级用户访问权限 &#xff08;一&#xff09;、su 命令和su -命令 &#xff08; 二&#xff09;、sudo命令 三、管理本地用户账户 &…

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 目录 ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/61780…

Transformer自然语言处理实战pdf阅读

一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前&#xff0c;NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环&#xff0c;允许信息从一步传播到另一 步&#xff0c;使其成为对文本等序列数据进行建模的理想选择。如…

图片检查 python脚本

图片检查 python脚本 import os from PIL import Imagedef is_image_broken(image_path):try:img Image.open(image_path)img.verify() # Verify that it is, in fact an imagereturn Falseexcept (IOError, SyntaxError) as e:return Truedef check_images_in_directory(di…

Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

如果某些字段在每个构造函数中都要进行初始化&#xff0c;很多人都喜欢在字段声明时就进行初始化&#xff0c;对于一个非继承自MonoBehaviour的脚步&#xff0c;这样做是没有问题的&#xff0c;然而继承自MonoBehaviour后就会造成内存的浪费&#xff0c;为什么呢&#xff1f;因…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么&#xff1f; Q-Former是一种新型的神经网络架构&#xff0c;专注于通过查询&#xff08;Query&#xff09;机制来改进信息检索和表示学习。在这篇博客中&#xff0c;我们将详细探讨Q-Former的工作原理、应用场景&#xff0c;并在必要时通过…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

大数据学习之Flink基础

Flink基础 1、系统时间与时间时间 系统时间&#xff08;处理时间&#xff09; 在Sparksreaming的任务计算时&#xff0c;使用的是系统时间。 假设所用窗口为滚动窗口&#xff0c;大小为5分钟。那么每五分钟&#xff0c;都会对接收的数据进行提交任务. 但是&#xff0c;这里有…

GoogleCTF2023 Writeup

GoogleCTF2023 Writeup Misc NPC Crypto LEAST COMMON GENOMINATOR? Web UNDER-CONSTRUCTION NPC A friend handed me this map and told me that it will lead me to the flag. It is confusing me and I don’t know how to read it, can you help me out? Attach…

VSCode切换默认终端

我的VSCode默认终端为PowerShell&#xff0c;每次新建都会自动打开PowerShell。但是我想让每次都变为cmd&#xff0c;也就是Command Prompt 更改默认终端的操作方法如下&#xff1a; 键盘调出命令面板&#xff08;CtrlShiftP&#xff09;中,输入Terminal: Select Default Prof…

Hisilicon 适配新遥控器

Hisilicon 适配新遥控器 适配NEC红外遥控器: 相关文档: Android解决方案开发指南:输入 红外驱动使用说明及注意事项 Application Notes HMS 开发指南:IR HMS sample 使用指南:IR 1、查看公版遥控器 sample_ir 没有此命令,不是没有编译打开,而是名字变成ir_user:…

Java 中的Stream流

Stream流就像工厂中的流水线操作。 如何使用Stream&#xff1f; 1、首先要获取Stream流&#xff0c;那么如何获取呢? 对于不同的数据&#xff0c;有不同的获取方法。 ①单列集合 方法名说明default Stream<E> stream()Collection接口中的默认方法 所以实现了Colle…