您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Flink入门知识点有哪些
## 一、Flink概述
### 1.1 什么是Flink
Apache Flink是一个开源的**分布式流处理框架**,最初由柏林工业大学开发,后成为Apache顶级项目。它能够处理**有界(batch)和无界(stream)数据流**,提供高吞吐、低延迟的计算能力,并保证Exactly-Once的精确一次处理语义。
核心特点:
- **事件驱动型架构**:基于事件触发计算
- **状态管理**:内置完善的分布式状态管理机制
- **容错机制**:通过Checkpoint和Savepoint实现故障恢复
- **多语言支持**:支持Java/Scala/Python等API
### 1.2 Flink vs 其他框架
| 特性 | Flink | Spark | Storm |
|------------|-------------|-------------|-------------|
| 处理模型 | 流批一体 | 微批处理 | 纯流处理 |
| 延迟 | 毫秒级 | 秒级 | 毫秒级 |
| 状态管理 | 完善 | 有限 | 依赖外部 |
| 语义保证 | Exactly-Once| Exactly-Once| At-Least-Once|
## 二、核心架构
### 2.1 运行时架构
```mermaid
graph TD
Client -->|提交作业| JobManager
JobManager -->|任务分配| TaskManager
TaskManager -->|状态反馈| JobManager
env.setParallelism(4); // 设置全局并行度
dataStream.map(...).setParallelism(2); // 算子级设置
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String, Integer>> counts = text
.flatMap((String value, Collector<Tuple2<String, Integer>> out) -> {
for (String word : value.split(" ")) {
out.collect(new Tuple2<>(word, 1));
}
})
.keyBy(0)
.sum(1);
counts.print();
env.execute("WordCount");
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSet<String> text = env.readTextFile("file:///path/to/file");
-- 注册表
tableEnv.executeSql("CREATE TABLE orders (...) WITH (...)");
-- SQL查询
Table result = tableEnv.sqlQuery(
"SELECT product, SUM(amount) FROM orders GROUP BY product");
-- 转换为DataStream
DataStream<Row> resultStream = tableEnv.toDataStream(result);
Keyed State:与Key绑定的状态
Operator State:算子级别状态
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 每10秒做一次Checkpoint
env.enableCheckpointing(10000);
// 精确一次语义
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// Checkpoint超时时间
env.getCheckpointConfig().setCheckpointTimeout(60000);
# 触发Savepoint
flink savepoint <jobId> [targetDirectory]
# 从Savepoint恢复
flink run -s :savepointPath [:runArgs]
DataStream<Event> withTimestampsAndWatermarks = stream
.assignTimestampsAndWatermarks(
WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5))
.withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);
窗口类型 | 说明 |
---|---|
Tumbling | 固定大小,不重叠 |
Sliding | 固定大小,可重叠 |
Session | 基于活动间隔 |
Global | 全局窗口 |
stream.keyBy(<key selector>)
.window(TumblingEventTimeWindows.of(Time.seconds(30)))
.reduce(<reduce function>);
// Source
KafkaSource<String> source = KafkaSource.<String>builder()
.setBootstrapServers("brokers:9092")
.setTopics("input-topic")
.setGroupId("my-group")
.setValueOnlyDeserializer(new SimpleStringSchema())
.build();
// Sink
stream.sinkTo(KafkaSink.<String>builder()
.setBootstrapServers("brokers:9092")
.setRecordSerializer(
KafkaRecordSerializationSchema.builder()
.setTopic("output-topic")
.setValueSerializationSchema(new SimpleStringSchema())
.build()
)
.build());
模式 | 适用场景 | 特点 |
---|---|---|
Local | 开发测试 | 单JVM进程 |
Standalone | 小规模生产 | 自带资源管理 |
YARN | 企业级部署 | 资源隔离好 |
Kubernetes | 云原生环境 | 弹性伸缩 |
Docker | 容器化部署 | 环境隔离 |
# 启动YARN session
./bin/yarn-session.sh -n 4 -jm 1024m -tm 4096m
# 提交作业
./bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 2048 ./examples/WordCount.jar
# flink-conf.yaml 示例
taskmanager.numberOfTaskSlots: 4
parallelism.default: 8
state.backend: rocksdb
state.checkpoints.dir: hdfs://namenode:8020/flink/checkpoints
资源分配:
状态后端选择:
反压处理:
taskmanager.network.memory.fraction
isBackPressured
metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
metrics.reporter.prom.port: 9999
flowchart LR
Kafka[用户行为日志] --> Flink[实时计算]
Flink --> Redis[实时大屏]
Flink --> HBase[用户画像]
Flink --> ES[实时搜索]
DataStream<SensorReading> readings = env.addSource(new SensorSource());
// 每5秒计算平均温度
readings.keyBy(r -> r.sensorId)
.timeWindow(Time.seconds(5))
.process(new TemperatureAverager());
// 高温报警
readings.filter(r -> r.temperature > 50.0)
.addSink(new AlertSink());
总结:Flink作为新一代流处理引擎,其核心优势在于统一的批流处理、完善的状态管理和强大的时间语义支持。建议初学者从DataStream API入手,逐步掌握时间窗口、状态管理等核心概念,再结合实际业务场景进行深度实践。 “`
注:本文档约4000字,采用Markdown格式编写,包含代码示例、流程图和表格等元素。实际使用时可根据需要调整内容深度或补充具体案例细节。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。