flink简介
官网
概述:
学习Flink具体包括四个关键概念:流数据的持续处理,事件时间,有状态流处理和状态快照。
Apache Flink 是一个开源的流处理框架,旨在处理批处理和实时数据处理,具有高吞吐量和低延迟的特点。
Apache Flink 是一个用于对无界和有界数据流进行有状态计算的框架和分布式处理引擎。Flink 被设计为可在所有常见的集群环境中运行,并以内存速度和任意规模执行计算。
特点:
- 流处理:Flink 将批处理视为流处理的一种特殊情况。这种方法允许实时数据处理,实现即时的洞察和行动。
- 有状态计算:Flink 提供强大的状态管理,使得在处理流的过程中可以保持状态。这一特性对于需要容错和一致性的应用至关重要。
- 事件时间处理:Flink 允许用户基于事件时间来处理数据,即使数据无序到达,也能提供准确及时的结果。
- 容错性:Flink 的状态管理和检查点机制确保系统在出现故障时能够恢复而不丢失状态,维护数据完整性和应用一致性。
- 高吞吐量和低延迟:Flink 的架构优化了高吞吐量和低延迟,适合高性能应用。
- 可扩展性:Flink 可以扩展到数千个节点,能够处理大规模数据处理任务。
- 灵活的部署选项:Flink 可以部署在各种环境中,包括独立集群、云环境和容器编排平台(如 Kubernetes)。
应用:
Flink 集群始终由一个 JobManager和一个或多个 Flink TaskManager组成。JobManager 负责处理作业提交、作业监管以及资源管理。Flink TaskManager 是工作进程,负责执行构成 Flink 作业的实际 任务。在本实践中,您将从单个 TaskManager 开始,但稍后可以扩展到更多 TaskManager。
实践
创建一个meven项目
引入pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>flink-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-java -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.20.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>1.20.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-clients -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>1.20.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-table-api-java-bridge -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge</artifactId>
<version>1.20.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-table-api-java -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java</artifactId>
<version>1.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-base</artifactId>
<version>1.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Flink 中的 DataStream 程序是常规程序,用于对数据流进行转换(例如,过滤、更新状态、定义窗口、聚合)。数据流最初由各种来源(例如,消息队列、套接字流、文件)创建。结果通过接收器返回,接收器可以将数据写入文件或标准输出(例如命令行终端)。Flink 程序可以在各种上下文中运行,独立运行或嵌入到其他程序中。执行可以在本地 JVM 中,也可以在多台机器组成的集群中执行。
代码如下:
package org.example.snow.demo1;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.core.fs.FileSystem;
import org.apache.flink.datastream.api.ExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
/**
* @author snowsong
*/
public class StartRunApp {
public static void main(String[] args) throws Exception {
// 数据来源
String inPath = "dataMsg/dataSourceFile.txt";
// 数据输出
String outputPath = "dataMsg/result.csv";
// 初始化
StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();
// 读取文件信息
DataStreamSource<String> textFile = executionEnvironment.readTextFile(inPath);
SingleOutputStreamOperator<Tuple2<String, Integer>> flatMap = textFile
.flatMap(new Splitter())
.keyBy(value -> value.f0)
.sum(1);
textFile.print();
// 写入数据到 CSV 文件,使用 writeAsText 或 writeAsCsv
flatMap.writeAsCsv(outputPath,FileSystem.WriteMode.OVERWRITE," ","\n")
// 这是设置并行度的参数,表示执行该操作的任务的数量。在这里,setParallelism(1) 表示该操作会在 单个任务 中执行,而不是并行执行多个任务。通常情况下,Flink 在处理流或批数据时可以通过并行执行来加速处理,而设置并行度为 1 可以强制数据写入在一个线程中进行。
.setParallelism(1);
// 调用 execute() 后,Flink 会开始处理数据流中的每个操作,并根据定义的逻辑执行数据转换、聚合等操作。
// 作业名称:"file.txt -> result.csv" 是为了描述输入文件和输出文件的关系,可以帮助你理解这个作业的目的。这个名称在 Flink 的执行日志和监控界面中会显示
executionEnvironment.execute("file.txt -> result.csv");
}
public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
for (String word: sentence.split(" ")) {
out.collect(new Tuple2<String, Integer>(word, 1));
}
}
}
}
运行结果 将文章进行了分词处理