流/批/OLAP一体的Flink引擎 | 青训营笔记

122 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第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
    1. 创建流式执行环境:StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    2. 全局并行度:env.setParallelism(1);
    3. 读取数据源:DataStreamSource< Event> stream = env.addSource(new ClickSource());
    4. 转换操作:映射、过滤、扁平映射、聚合、分区、富函数
      • 映射: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)
    5. 输出Sink:stream.addSink(new RedisSink< Event>(conf, new MyRedisMapper()));
    6. 执行env.execute();