这是我参与「第四届青训营 」笔记创作活动的的第1天
- Flink是Master-Slave 架构:Master 角色对应着JobManager,Slave 角色则对应TaskManager。
- Flink 是流式计算框架。它的程序结构,其实就是定义了一连串的处理操作,每一个数据输入之后都会依次调用每一步计算。
- 在 Flink 代码中,我们定义的每一个处理转换操作都叫作 “算子”(Operator),所以我们的程序可以看作是一串算子构成的管道,数据则像水流一样有序地流过。
- Eg:在 WordCount 中,程序里定义了四个算子操作:源(Source)->转换(flatMap)->分组聚合(keyBy/sum)->输出(print)。基于执行环境调用的 socketTextStream()方法,就是一个读取文本流的算子; flatMap()方法,则是将字符串数据进行分词、转换成二元组的算子。
- 由于 keyBy 没有处理转换数据,所以不是算子
- 读取有界数据(文件)和无界数据(socket 文本流)
- Flink 中的几个关键组件:客户端(Client)、作业管理器(JobManager)(包含 dispatcher分发器+jpnMaster+ResourceManager)和任务管理器(TaskManager)。
- 代码实际上是由客户端获取并做转换(数据流图->作业图),之后提交给 JobManger 的。所以 JobManager 就是 Flink 集群里的“管事人”,对作业进行中央调度管理;而它获取到要执行的作业后,会进一步处理转换(作业图->执行图),然后分发任务给众多的TaskManager。这里的 TaskManager,就是真正“干活的人”,数据的处理操作都是它们来做的
- 执行环境-Environment-->数据源Source--->转换操作Transform--->输出Sink
- 创建流式执行环境:StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
- 全局并行度:env.setParallelism(1);
- 读取数据源:DataStreamSource< Event> stream = env.addSource(new ClickSource());
- 转换操作:映射、过滤、扁平映射、聚合、分区、富函数
- 映射:stream.map(new UserExtractor()).print();
- 过滤:stream.filter(new UserFilter()).print();
- 扁平映射:stream.flatMap(new MyFlatMap()).print();
- 聚合(先分组再聚合):.keyBy(r -> r.f0).reduce(new ReduceFunction<Tuple2<String, Long>>())
- 分区:随机分区(.shuffle())、轮询分区(.rebalance())、rescale重缩放分区(.rescale())、广播(.broadcast())、全局分区(.global())、自定义重分区(.partitionCustom)
- 输出Sink:stream.addSink(new RedisSink< Event>(conf, new MyRedisMapper()));
- 执行env.execute();