Flink源码解读系列:Flink工程目录

201 阅读4分钟

背景

Flink已经成为未来流计算趋势,目前包括阿里在内的很多大厂已经广泛使用。前段时间在团队内部分享了flink的基本概念相关,感觉深入还是需要去撸下代码,相关内核就是java代码实现的,最近开始学习浏览Flink源码,把相关的学习过程记录分享下来,本文作为学习过程的第一站,对Flink工程目录做一个了解,知道工程下各个模块的作用,方便遇到问题时能准确定位到代码

一、Flink工程目录

官网下载flink1.14发行版源码,比较适合学习

用IDEA打开Flink的工程,可以看到下图所示的一些子工程目录,下面会介绍各个模块的作用,其中核心比较重要的属于flink-core、flink-runtime和flink-table是我们需要重点学习的。

  • flink-annotations:Flink自定义的一些注解,用于配制、控制编译等功能。
  • flink-clinets:Flink客户端,用于向Flink集群提交任务、查询状态等。其中org.apache.flink.client.cli.CliFronted就是执行./flink run的程序启动入口。
  • flink-connectors:Flink连接器,相当于Flink读写外部系统的客户端。这些连接器指定了外部存储如何作为Flink的Source或者Sink。例如对于Kafka来说,flink-connector-kafka 定义了FlinkKafkaConsumer和FlinkKafkaProducer类分别作为Flink的Source和Sink,实现了对kafka消费和生产的功能。从下图可以看出,flink支持许多外部的开源存储。

  • flink-container:Flink对docker和K8S的支持。
  • flink-contrib:社区开发者提供的一些新特性。
  • flink-core:Flink核心的API、类型的定义、包括底层的算子、状态、时间的实现,是Flink最重要的部分,Flink内部的各种参数配置也都定义在这个模块的configuration中 --重点学习
  • flink-dist:Flink编译号之后的jar包会放在这个文件夹下,也就是可运行的版本。其中包括集群启动、终止脚本、集群的配置文件等。
  • flink-docs:该模块是Flink文档生成的代码
  • flink-filesystems:Flink对各种文件系统的支持,包括HDFS、AWS S3、阿里云OSS等分布式文件系统
  • flink-formats:Flink对各种格式的数据输入输出的支持。诸如Json、CSV、Avro等常用的格式
  • flink-java:Flink java的API,实现flink应用时用到的map、window、keyBy、State等类或者函数的实现 --相关原理,也可学习
  • flink-jepsen:对Flink分布式系统正确性的测试,主要验证flink的容错机制
  • flink-libraries:对Flink的高级API、包括CEP(复杂事件处理)、Gelly图处理库等。
  • flink-mesos:Flink对mesos集群管理的支持
  • link-metrics: Flink监控上报。支持上报到influxdb、prometheus等监控系统。具体的使用配置可以在flink-core模块的org.apache.flink.configuration.MetricOptions中找到。
  • flink-python: Flink对python的支持
  • flink-queryable-state: Flink对可查询状态的支持,其中flink-queryable-state-runtime子模块实现了StateClientProxy和StateServer。这两部分都运行在TaskManager上,StateClientProxy负责接收外部请求,StateServe负责管理内部的queryable state。flink-queryable-state-client-java子模块实现了QueryableStateClient,作为外部系统访问queryable state的客户端。
  • flink-runtime: flink运行时核心代码,--重点学习。
  • flink-runtime-web: Flink Web Dashboard的实现。默认启动standalone集群后,访问http://localhost:8081 出现的界面。
  • flink-scala: Flink scala的API。
  • flink-scala-shell: Flink提供的scala命令行交互接口。
  • flink-state-backends: flink状态存储的方式,目前这个模块中只有RocksDBStateBackend,未来可能会支持更多种的状态存储,阿里集团内部使用的是
  • flink-streaming-java: Flink Streaming的java API。
  • flink-streaming-scala: Flink Streaming的scala API。
  • flink-table: Flink Table API,--重点学习。
  • flink-yarn: Flink对yarn集群管理的支持。

后面通过调试对flink-core、flink-runtime和flink-table三个模块源码展开具体讲解。

二、本地环境搭建

编译打包

mvn clean install -Drat.skip=true -DskipTests

启动

代码编译完成后,可cd进入/flink-dist/target/ flink-1.14-SNAPSHOT-bin/flink-1.14-SNAPSHOT/目录下,flink-1.14.SNAPSHOT即是官网上下载的发行版

继续进入bin/目录,执行start-cluster.sh脚本启动flink。

调试

打开浏览器访问localhost:8081可看到flink web界面

本人MAC电脑环境问题,还在调试配置中.....

后面就可以通过断点的方式对代码进行分析,小鸡啄米开始遨游源码的解读