第一章 Flink简介

news2024/11/19 15:28:04

Flink 系列教程传送门

第一章 Flink 简介

第二章 Flink 环境部署

第三章 Flink DataStream API

第四章 Flink 窗口和水位线

第五章 Flink Table API&SQL

第六章 新闻热搜实时分析系统


前言

流计算产品实时性有两个非常重要的实时性设计因素,一个是待计算的数据,一个是计算的时钟。低延时要求流计算框架尽可能早的输出计算结果,但是由于存在数据延时和现实业务数据更新的客观情况,就会导致你前一秒计算的结果,因为下一秒来了一个对上一秒已经参与计算的那条数据的更新,进而导致在下一秒时候上一秒的计算结果就是无效的了,那么流计算产品低延时需求导致流计算产品不可能无限制的等待延时数据的到来,这就一定会造成数据计算结果不精准的问题。如果流计算产品想让自己的计算结果更准确,那就需要忍受对延时数据进行更长时间的等待,那就意味着流计算产品的低延时无法达成,所以在流计算产品中鱼和熊掌兼得是不那么容易的。


一、Flink概述

在德语中,Flink 一词表示快速和灵巧,项目采用一只松鼠的彩色图案作为 logo。

Apache Flink是Apache软件基金会的一个顶级项目,是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架,并且可以同时支持实时计算和批量计算

Flink起源于Stratosphere 项目,该项目是在2010年到2014年间由柏林工业大学、柏林洪堡大学和哈索普拉特纳研究所联合开展的,开始是做批处理,后面转向了流处理。

  • 2014年4月,Stratosphere代码被贡献给Apache软件基金会,并改名为Flink,成为Apache软件基金会孵化器项目,并开始在开源大数据行业内崭露头角。
  • 2014年8月,团队的大部分创始成员离开大学,共同创办了一家名为Data Artisans的公司。
  • 2015年4月,Flink发布了里程碑式的重要版本0.9.0。
  • 2019年1月,长期对Flink投入研发的阿里巴巴,以9000万欧元的价格收购了Data Artiscans公司。
  • 2019年8月,阿里巴巴将内部版本Blink开源,合并入Flink1.9.0版本。

目前最新版本Flink为1.16.0版本,本系列课程我们采用Flink1.14.5进行讲解。

二、Flink编程模型

在自然环境中,数据的产生原本就是流式的。无论是来自 Web 服务器的事件数据,证券交易所的交易数据,还是来自工厂车间机器上的传感器数据,其数据都是流式的。但是当你分析数据时,可以围绕 有界流(bounded)或 无界流(unbounded)两种模型来组织处理数据,当然,选择不同的模型,程序的执行和处理方式也都会不同。

  • 批处理是有界数据流处理的范例。在这种模式下,你可以选择在计算结果输出之前输入整个数据集,这也就意味着你可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。
  • 流处理正相反,其涉及无界数据流。至少理论上来说,它的数据输入永远不会结束,因此程序必须持续不断地对到达的数据进行处理。 

三、程序结构

在Hadoop中,实现一个MapReduce应用程序需要编写Map和Reduce两部分;实现一个Flink应用程序也需要同样的逻辑。一个Flink应用程序由3部分构成,或者说将Flink的操作算子可以分成3部分,分别为Source、Transformation和Sink,如图:

  • 数据源:Flink 在流处理和批处理上的数据源大概有4类:基于本地集合的数据源(fromCollectionfromElements)、基于文件的数据源(readTextFile)、基于网络套接字的数据源(socketTextStream)、自定义的数据源(KafkaSource)。常见的自定义数据源包括Kafka、RabbitMQ、NiFi等。
  • 数据转换:数据转换的各种操作包括map、 flatMap、filter、keyBy、reduce、aggregation、window、union、select等,可以将原始数据转换成满足要求的数据。
  • 数据输出:数据输出是指Flink将转换计算后的数据发送的目的地。常见的数据输出包括写入文件、打印到屏幕、写入Socket 、自定义Sink等 。

在 Flink 中,应用程序由用户自定义算子转换而来的流式 dataflows 所组成。这些流式 dataflows 形成了有向图,以一个或多个源(source)开始,并以一个或多个汇(sink)结束。

四、总图概览

 Flink 应用程序可以消费来自消息队列或分布式日志这类流式数据源(例如 Apache Kafka 或 Kinesis)的实时数据,也可以从各种的数据源中消费有界的历史数据。同样,Flink 应用程序生成的结果流也可以发送到各种数据汇中。

在 Flink 中,应用程序由用户自定义算子转换而来的流式 dataflows 所组成。这些流式 dataflows 形成了有向图,以一个或多个(source)开始,并以一个或多个(sink)结束。

从代码到逻辑视图。逻辑视图中圆圈表示算子,箭头表示数据流,可以在Flink Web UI中查看一个作业的逻辑视图,大数据框架的算子对计算做了抽象,方便用户进行并行计算、横向扩展和故障恢复。

通常,程序代码中的 transformation 和 dataflow 中的算子(operator)之间是一一对应的。但有时也会出现一个 transformation 包含多个算子的情况

五、入门案例

1、安装Maven整合IDEA开发工具

Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。

约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。
Maven 项目构建过程中,会自动创建默认项目结构,开发人员仅需要在相应目录结构下放置相应的文件即可。

官方下载地址,下载完成后,解压到合适的位置即可,建议放在D:/devtools目录下。

2、修改Maven的下载源地址和本地仓库地址

修改Maven安装目录下conf/settings.xml文件,具体修改项如下:

<localRepository>D:/devtools/apache-maven-3.6.1/localRepository</localRepository>
    
<mirrors>
  <mirror>
  <id>nexus-aliyun</id>  
  <mirrorOf>*</mirrorOf>    
  <name>Nexus aliyun</name>  
  <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror>
<mirror>  
  <id>nexus-osc</id>  
  <mirrorOf>*</mirrorOf>  
  <name>Nexus osc</name>  
  <url>http://mirrors.163.com/maven/repository/maven-central/</url>  
</mirror>
</mirrors>

<profiles>
<profile>
  <id>jdk-1.8</id>
  <activation>
  <!--这个字段表示默认激活-->
  <activeByDefault>true</activeByDefault>
  <jdk>1.8</jdk>
  </activation>
  <properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    
      <maven.compiler.encoding>UTF-8</maven.compiler.encoding> 
  </properties>
</profile>  
</profiles>

3、IDEA整合Maven

在IDEA的设置中,搜索maven,做如下修改,选择本地安装的Maven相关选项。

4、使用Flink实现批计算

使用Flink Scala完成批处理的词频统计案例,具体处理流程如下:

在pom.xml中添加flink所需依赖:

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-scala_2.12</artifactId>
  <version>1.14.5</version>
</dependency>
<!--No ExecutorFactory found to execute the application. 从 flink1.11.0 版本开始,需要多引入一个 flink-client 包-->
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-clients_2.12</artifactId>
  <version>1.14.5</version>
</dependency>

详细代码示例如下:

import org.apache.flink.api.scala._

object WordCountBatchTest {
  def main(args: Array[String]): Unit = {
    // 创建Flink的执行环境(批处理的)
    val env = ExecutionEnvironment.getExecutionEnvironment

    // Source 读取数据源
    val data = env.readTextFile("datasource/word.txt")

    // Transformation 转换 计算
    val result = data
        .flatMap(line=>line.split(" "))
        .map(word=>(word,1))
        .groupBy(0)
        .sum(1)

    // Sink 把转换的结果输出
    result.print()
  }
}

 从 flink1.11.0 版本开始,需要多引入一个 flink-client 包

5、使用Flink实现流计算

Flink流计算会借助NetCat工具进行流式数据进行数据录入,具体安装使用如下:

Netcat官网下载地址,下载netcat-win32-1.12.zip压缩包,解压到安装目录,并配置PATH环境变量。

  1. 输入nc -l -p 9000 -v监控9000端口,接收数据
  2. 输入nc localhost 9000进行连接,并发送数据

在cmd中输入命令:nc -l -p 666 监控666端口,并输入测试数据 

在pom.xml中添加flink流处理所需依赖:

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-scala_2.12</artifactId>
  <version>1.14.5</version>
  <!--<scope>provided</scope>-->
</dependency>

 使用Flink Scala编写流式数据处理程序

import org.apache.flink.streaming.api.scala._

object StreamWordCount {
  def main(args: Array[String]): Unit = {
    // 获取Flink流处理环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    // 数据源-监控Netcat数据端口666
    val data = env.socketTextStream("localhost", 666)
    // 数据转换
    val result = data
        .flatMap(_.split(" "))
        .filter(_.nonEmpty)
        .map((_,1))
        .keyBy(_._1)
        .sum(1)
    // Sink 数据输出到控制台
    result.print()
    // 流处理环境执行
    env.execute()
  }
}

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

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

相关文章

文档智能(一):基于OpenCV的文档图像校正

文档智能(一)&#xff1a;基于OpenCV的文档图像校正 发表时间&#xff1a; 2023年1月7日创作地点&#xff1a;湖北省武汉市作者&#xff1a;ixy_com&[Aneerban Chakraborty]封面图片来源&#xff1a;DocTr 本文关键词&#xff1a;文档智能、文档图像校正、OpenCV、形态…

从零实现Dooring低代码印章组件

上一篇文章和大家分享了低代码平台组件间通信方案的几种实现:低代码平台组件间通信方案复盘今天继续和大家分享一下比较有意思的可视化印章组件的实现.你将收获低代码组件的基本设计模式印章组件的设计原理(canvas相关)如何快速将任意组件集成到低代码平台正文低代码组件的基本…

雷鸟X2:开启可量产全彩MicroLED光波导AR眼镜新起点

从最近的AR眼镜新品来看&#xff0c;采用MicroLED光波导方案已经成为了明显的趋势&#xff0c;可见业内对于光学的大方向还是非常统一的。不仅如此&#xff0c;各个厂商都拿出自己最优的方案来进行探索和验证&#xff0c;比如有的看重“极轻”、有的看重“视觉”、有的看重“价…

使用Jenkins一键打包部署 SpringBoot应用

一般而言&#xff0c;一个项目部署的由&#xff1a;拉取代码->构建->测试->打包->部署等过程组成&#xff0c;如果我们经常需要部署项目&#xff0c;特别是在微服务时代&#xff0c;服务特别多的情况下&#xff0c;不停的测试打包部署&#xff0c;那估计得有个人一…

数学:一夜读罢头飞雪

文章目录引子代数&#xff0c;几何与分析数学之美微积分形式的统一之美伽罗华群论的深刻之美几何的形体之美公理与定理集合论的公理欧几里得几何公理算术公理实数系的公理系统数学攀登的路径数学的符号系统希腊字母表物理与数学推荐的数学读物参考链接引子 贺新郎读史 人猿相揖…

【阶段二】Python数据分析数据可视化工具使用05篇:统计直方图、面积图与箱型图

本篇的思维导图: 统计直方图 统计直方图(histogram)形状类似柱形图,却有着与柱形图完全不同的含义。统计直方图涉及统计学的概念,首先要从数据中找出它的最大值和最小值,然后确定一个区间,使其包含全部测量数据,将区间分成若干个小区间,统计测量结果出现在各…

详细讲解Linux PCI驱动框架分析

说明&#xff1a; Kernel版本&#xff1a;4.14 ARM64处理器 使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 从本文开始&#xff0c;将会针对PCIe专题来展开&#xff0c;涉及的内容包括&#xff1a; PCI/PCIe总线硬件&#xff1b; Linux PCI驱动核心框…

通俗理解Platt scaling/Platt缩放/普拉特缩放

一、引言 最近在读论文的时候接触到Platt scaling&#xff0c;有点不理解这个概念。然后好奇心比较重&#xff0c;就看了一些科普&#xff0c;并追根溯源调查了一下Platt scaling。最终搞懂了这个概念&#xff0c;写个博客记录一下。中文翻译有看到&#xff1a;普拉特缩放&…

通信原理与MATLAB(十一):QAM的调制解调

目录1.QAM的调制原理2.QAM的解调原理3.QAM代码4.结果图5.特点1.QAM的调制原理 QAM调制原理如下图所示&#xff0c;基带码元波形经过串并转换分成I、Q两路&#xff0c;然后再经过电平转换(00转换成-1,01转换成-3,10转换成1,11转换成3)&#xff0c;再与对应的载波相乘&#xff0…

scMDC:针对单细胞多模态数据进行聚类

目录摘要引言背景介绍单细胞数据聚类方法回顾ZINBscMDC摘要 单细胞多模态测序技术的发展是为了在同一细胞中同时分析不同模态的数据&#xff0c;它为在单细胞水平上联合分析多模态数据从而识别不同细胞类型提供了一个独特的机会。正确的聚类结果对于下游复杂生物功能研究至关重…

JavaEE多线程-认识多线程

目录一、认识操作系统二、认识进程三、内存管理四、什么是线程(Thread)&#xff1f;五、为什么要有线程&#xff1f;六、进程和线程的关系一、认识操作系统 我们需要简单了解一下操作系统。 操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织…

【Python】sklearn机器学习之DBSCAN聚类

文章目录基本原理测试构造函数基本原理 DBSCAN算法是比较经典的聚类算法了&#xff0c;除了sklearn之外&#xff0c;open3d这种常用的点云模块也提供了DBSCAN算法的实现&#xff0c;例如Open3d数据滤波和点云分割。 和其他聚类算法相比&#xff0c;DBSCAN存在一种去中心化的特…

六、Gtk4-Widgets (3)

1 Open 信号 1.1 G_APPLICATION_HANDLES_OPEN flag 在上一节中&#xff0c;我们使用GtkTextView、GtkTextBuffer和GtkScrolledWindow创建了一个非常简单的编辑器。我们将为程序添加文件读取功能&#xff0c;并将其改进为文件查看器。 要给出文件名&#xff0c;最简单的方法是…

(软考)系统架构师大纲

考试要求&#xff1a; 掌握计算机硬软件与网络的基础知识;熟悉信息系统开发过程;理解信息系统开发标准、常用信息技术标准;熟悉主流的中间件和应用服务器平台;掌握软件系统建模、系统架构设计基本技术;熟练掌握信息安全技术、安全策略、安全管理知识;了解信息化、信息技术有关…

使用Vite搭建vue3+TS项目

vite简介 vite 是一个基于 Vue3 单文件组件的非打包开发服务器&#xff0c;它具有快速的冷启动&#xff0c;不需要等待打包操作&#xff1b;并且官网说是下一代的前端构建工具。 初始化项目 npm init vitelatest1.输入项目名称 2.选择Vue 3.选择TS 4.启动项目 5.项目启…

【阶段三】Python机器学习07篇:模型评估函数介绍(回归模型)

本篇的思维导图: 模型评估函数介绍(回归模型) 绝对误差与相对误差: 设Y表示实际值, 表示预测值,则称E为绝对误差(Absolute Error),计算公式如式所示: e为相对误差(Relative Error),计算公式如式所示:

Maven怎么写本地仓库没有的架包坐标

什么是jar包的坐标&#xff1f; 当我们使用Maven开发一个项目时&#xff0c;需要向项目中导入很多个jar包&#xff0c;这些jar包不需要我们自己一个个的导入&#xff0c;只需要在创建的项目中的pom.xml文件中写上需要的jar包的坐标&#xff0c;Maven就会去本地仓库找有没有这个…

黑马学ElasticSearch(一)

目录&#xff1a; &#xff08;1&#xff09;初识ES-什么是elasticsearch &#xff08;2&#xff09;初识ES-倒排索引 &#xff08;3&#xff09;ES与MySQL的概念对比 &#xff08;4&#xff09;安装ES &#xff08;1&#xff09;初识ES-什么是elasticseach 随着业务的发…

MYSQL8.0+远程连接|主从复制配置|各种错误(吐血整理)

目录 环境介绍 主机/从机文件配置 主机部分 从机部分 连接测试 报错踩坑|解决办法 写在前面&#xff1a;最近在做项目优化&#xff0c;看完黑马的mysql的主从复制后&#xff0c;准备着手来练练&#xff0c;没想到这入坑就是三四天的错&#xff0c;心情烦躁。如今已解决&a…

SpringCloud笔记 - Day1 概念注册中心负载均衡

https://www.bilibili.com/video/BV1LQ4y127n4 1. 微服务导学 异步通信可以大大提高服务的并发。 服务的异常定位&#xff1a; 分布式日志服务系统监控和链路追踪 自动化部署&#xff1a;Jenkins——docker——k8s——RANCHER 持续集成 2. 微服务导学2 微服务治理、异步通…