导读:本文介绍如何导入Flink源代码,对源代码进行编译、构建及调试。

作者:罗江宇 赵士杰 李涵淼 闵文俊

来源:大数据DT(ID:hzdashuju)

01 获取与导入Flink源代码

1. 下载Flink源代码

获取Flink源代码的方式有两种:一种是通过官网的源代码下载地址直接下载,另一种是通过git clone的方式。

1)官网下载方式

下载地址为

https://flink.apache.org/downloads.html

选择Flink 1.9.0的Source版本下载。

2)git clone方式

输入git clone git@github.com:apache/flink.git 命令将源代码下载到本地,如图1-5所示。

▲图1-5 git clone方式下载

2. 导入Flink源代码

导入Flink 源代码分成两步,分别是将Flink源代码导入IDEA和配置Flink源代码的CheckStyle。其中,配置好Flink 源代码的CheckStyle是为了保证Flink 源代码修改符合CheckStyle里的规范要求。

将下载好的Flink源代码导入IDEA,流程如下。

  1. 启动IntelliJ IDEA 并单击欢迎窗口右上角的Open按钮。

  2. 在弹出窗口中选择Flink源代码的根目录。

  3. 选择Import project from external model和maven项,并单击Next按钮。

  4. 选择SDK。如果之前没有配置过SDK,单击“+”图标, 并点击JDK,选择你的JDK的目录,然后单击OK按钮。

  5. 单击Next 按钮完成Flink源代码的导入。

  6. 在导入的项目右侧单击Maven→Generate Sources and Update Folders的图标,将Flink Library 构建到Maven 本地仓库。

  7. 构建项目(单击Build→Make Project图标)。

想对Flink进行二次开发或者为开源社区贡献代码的读者可以选择配置CheckStyle。

1)Java CheckStyle配置流程

IntelliJ IDEA 通过CheckStyle-IDEA 插件来支持CheckStyle。

  1. 在IntelliJ IDEA 的Plugins Marketplace中查找并安装 CheckStyle-IDEA 插件。

  2. 依次选择Settings→Tools→Checkstyle并设置checkstyle。

  3. 将 Scan Scope设置为Only Java sources(including tests)。

  4. 在Checkstyle version下拉列表中选择checkstyle版本,并单击Apply按钮。(注:官方推荐版本为8.12。)

  5. 在Configuration File面板中单击“+”图标添加新配置:

    在弹窗中将Description设置为Flink;

    选中 Use a local Checkstyle file,并选择Flink源代码目录下的 tools/maven/checkstyle.xml文件;

    勾选Store relative to project location 选项,单击Next按钮;

    将checkstyle.suppressions.file的属性设置值为 suppressions.xml,单击Next按钮即完成配置。

  6. 勾选刚刚添加的新配置Flink,以将其设置为活跃的配置,依次单击Apply 和OK按钮,即完成Java 部分CheckStyle的配置。若源代码违反CheckStyle规范,CheckStyle会给出警告。

在CheckStyle 构建完成后,依次选择Settings→Editor→Code Style→Java,并单击齿轮图标,选择导入Flink源代码目录下的tools/maven/checkstyle.xml文件,这样就可以自动调整import的布局了。

可以在CheckStyle的窗口中单击Check Module按钮扫描整个模块,以检测代码的CheckStyle。

注意:目前Flink源代码的flink-core、flink-optimizer和 flink-runtime模块还没有完全符合设置的CheckStyle的要求,因此在这三个模块中出现违反CheckStyle的警告是正常的。

2)Scala CheckStyle配置流程

开启Scala 的CheckStyle,依次选择Settings→Editor→Inspections,再搜索Scala style inspections并勾选。将Flink源代码目录下的tools/maven/scalastyle_config.xml放置到Flink 源代码的.idea目录下,即完成Scala部分CheckStyle的配置。

02 编译与调试Flink源代码

1. 编译与构建Flink

源代码已经导入,CheckStyle也已配置好,接下来开始编译与构建Flink。

在构建源代码之前,假如有修改Flink 版本的需求,可以通过修改Flink源代码的tools/change-version.sh来实现。

Flink源代码的编译与构建会因Maven版本的不同而有所差异。对于Maven 3.0.x 版本、3.1.x版本、3.2.x版本,可以采用简单构建Flink的方式,在Flink源代码的根目录下运行以下命令。

$ mvn clean install -DskipTests

而对于Maven 3.3.x及以上版本,则要相对麻烦一点,在Flink源代码的根目录下运行下面的命令。

$ mvn clean install -DskipTests
$ cd flink-dist
$ mvn clean install

推荐使用Maven 3.2.5版本,下面就依据这个版本来介绍更多的构建内容。使用如下方式快速构建Flink源代码,会跳过测试、QA插件、Java docs。

$ mvn clean install -DskipTests -Dfast

在构建Flink时,会默认构建一个Flink特定的Hadoop 2的jar,以供Flink 使用HDFS 和YARN。大多数开发者有指定Hadoop版本的需求(建议选择Hadoop 2.4及以上版本)。

$ mvn clean install -DskipTests -Dhadoop.version=3.2.2 -Dinclude-hadoop

其中加上了-Dinclude-hadoop参数,这会将Hadoop的类打包到lib目录下的flink-

dist*.jar,否则Hadoop 会作为一个jar包放在opt目录下。

选择合适的方式构建Flink项目,会将Flink的构建放到本地Maven仓库中,并将Flink源代码构建结果放在build-target目录(Flink源代码构建目录)下。可以将build-target目录压缩到一个tar包,即与官网一样的Flink 二进制包。

2. Flink 源代码调试

调试Flink 源代码有助于我们了解源代码的执行流程和排查问题。Flink 源代码调试分为本地调试和远程调试,下面来分别介绍。

1)本地调试

以Flink源代码自带Streaming 的WordCount为例介绍如何进行本地调试。找到Flink 源代码目录flink-examples/flink-examples-streaming的多级子目录下的WordCount.java,再选择Debug。读者可以在Flink源代码中设置断点进行跟踪调试。

2)远程调试

本地调试仅限于部署模式中的Local模式,对于基于Standalone、on YARN、on Kubernetes的部署模式,需要使用远程调试。

远程调试方式有两种:一是修改日志等级,二是修改配置来开启Java远程调试。

  • 修改日志等级

打开Flink源代码的构建目录(build-target)下的conf/log4j.properties,根据需要将内容中的INFO改成DEBUG,如下所示,只是将rootLogger的赋值从INFO 修改为DEBUG。修改log4j.properties后构建和运行Flink,即可通过DEBUG日志进行远程调试。

# 设置全局的日志等级
log4j.rootLogger=DEBUG, file# 也可以按需改变Flink、Akka、Hadoop、Kafka和ZooKeeper包以及其他包的日志等级
log4j.logger.org.apache.flink=INFOlog4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO# Log all infos in the given file
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.file=${log.file}
log4j.appender.file.append=false
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}
%-5p %-60c %x - %m%n# Suppress the irrelevant (wrong) warnings from the Netty channel handler
log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel
.DefaultChannelPipeline=ERROR, file
  • 修改配置来开启Java远程调试

首先打开IDEA,创建Remote项(见图1-6)并复制Remote项的Java运行参数内容,然后修改Flink 构建目录下的conf/flink-conf.yaml,添加env.java.opts属性与值,添加的内容如下:

env.java.opts: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n, address=5005

▲图1-6 配置远程调试中的Remote项

还可以通过env.java.opts.jobmanager 与env.java.opts.taskmanager来设置JobManager 和TaskManager运行的参数,从而设置开启远程调试。设置配置后,基于这个构建目录运行Flink应用,根据运行的JobManager 与TaskManager 的IP修改原先配置的Remote项的host,在Flink源代码中设置断点,通过Debug 配置Remote项来进行远程调试。

设置env.java.opts、env.java.opts.jobmanager和env.java.opts.taskmanager的方法在on Kubernetes模式下很适用,因为Flink 运行的各个组件的IP不同。其他模式存在运行组件与IP、调试端口相同的问题,对于这种情况可以考虑采用修改日志等级的方式。

通过学习Flink源代码的编译与构建,我们知道如何根据需要构建一个Flink发布包。通过学习Flink源代码的调试,我们对源代码的调试有了更深的了解,为后续理解源代码和排查源代码问题打下了基础。

关于作者:罗江宇,Flink技术专家,先后就职于新浪微博、滴滴和某大型电商公司。先后主导或参与了多家公司的Flink实时计算服务的构建、对超大规模集群的维护以及Flink引擎的改造。拥有丰富的实时计算实战经验,目前专注于Kubernetes调度、Flink SQL及Flink流批一体化方向。

赵士杰,资深大数据技术专家,曾就职于滴滴、阿里巴巴等一线互联网公司。从0到1深度参与了滴滴的大数据建设,拥有非常丰富的大数据平台一线建设经验,对于大数据领域的计算和存储引擎也有深入研究。

李涵淼,大数据研发专家,曾任滴滴大数据开发工程师。从事大数据领域工作多年,参与过多家公司流计算平台的设计与研发,目前专注于批流一体、OLAP技术方向的研究与应用。

闵文俊,蚂蚁集团技术专家、开源大数据社区爱好者、Flink Contributor,在实时计算领域工作多年,深度参与了滴滴、蚂蚁集团的实时计算平台建设。

本文摘编自《Flink技术内幕:架构设计与实现原理》,经出版方授权发布。(ISBN:9787111696292)

《Flink技术内幕:架构设计与实现原理》

点击上图了解及购买

转载请联系微信:DoctorData

推荐语:Flink源码维护者阿里、蚂蚁、滴滴经验总结,剖析Flink机制,指导性能调优、可用性保障、效能优化、二次开发。

划重点

手把手教你获取、编译和调试Flink的源代码相关推荐

  1. 手把手教你用Vscode Debugger调试代码

    http://shooterblog.site/2018/05/19/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E7%94%A8Vscode%20De ...

  2. 手把手教你写一个串口调试助手

    硬件攻城狮 2022-05-20 14:05 发表于广东 果果小师弟. 电子信息工程硕士在读,分享单片机.嵌入式linux.物联网等知识,致力于打造最硬核的嵌入式技术公众号. 摘要:前段时间发布了一个 ...

  3. 程序员宅男干货福利!手把手教你获取上千张cosplay小姐姐的美照

    最近的一段时间里,小编喜欢上了CosPlay的展出,小姐姐们的CosPlay展真的是让我很是欣赏,于是,我回到家里就从网上来看展出,但是一个个网页查看太过繁琐-- 既然是玩Python,不如写个代码搞 ...

  4. 价值十万的代码之二——手把手教你获取数据篇

    我们要利用个股研报数据,肯定是会结合个股行情数据的,所以首先要获取股票数据,本篇我跟大家分享一下我是如何获取个股行情数据的. 选定目标 现在获取股票行情数据的渠道有好多,比较正规的途径就是各种量化平台 ...

  5. 干货福利!手把手教你获取上千张cosplay小姐姐的美照

    公众号关注 "菜鸟学Python" 设为 "星标",带你一起学Python! 最近的一段时间里,小编喜欢上了CosPlay的展出,小姐姐们的CosPlay展真的 ...

  6. 手把手教你反编译小程序

    本次实验环境 操作系统: win10 10.0.19042 node: v14.17.0 微信开发者工具: Stable 1.05.2110290 前期准备 在电脑端安装模拟器工具,这里以夜神模拟器为 ...

  7. 手把手教你学会用Delve调试Go程序

    在Go语言中,除了go tool工具链中的 pprof.trace 等剖析工具的大利器外.常常还会有小伙伴问,有没有更好用,更精细的, 大家总嫌弃pprof.trace等工具,不够细,没法一口气看到根 ...

  8. 手把手教你获取x信本地数据库(利用Sqlcipher查看)

    最近一直在研究Xposed等一些hook框架,进行学习做一些demo,这次就正好拿x信练练手,学习学习,也可以学习x信手机本地数据库的表结构设计等. 好,废话不多说,直接开干. 前提是你的电脑已经安装 ...

  9. ipa文件反编译_手把手教你反编译别人的app

    虽然iOS系统相比于其他手机操作系统相对安全,但是这个安全并不是绝对的,我一直相信,道高一尺魔高一丈.此文想以实际例子出发,告诉大家,如何去反编译一个app,并且从某个角度来说,iOS没有传说中的&q ...

最新文章

  1. Spring cloud技术栈
  2. 1035:等差数列末项计算
  3. 人工智能超强面经:文本检测与GAN篇(含答案)
  4. UIActionSheet的使用
  5. Wannafly挑战赛19:C. 多彩的树(状压+容斥)
  6. iphone小圆点在哪儿设置_iPhone终于自带长截屏了?苹果手机这些截图方式,你用过几种?...
  7. 《计算机组成原理》作业,《计算机组成原理》作业一解答.doc
  8. 理论小知识:字符串mset命令
  9. Python获取高德POI(关键词搜索法)
  10. 苹果计算机 win10,苹果怎么装win10苹果装win10详细教程【图文】
  11. 【Python】办公篇-《极客Python之效率革命》(小甲鱼) 笔记一
  12. Vue项目webpack打包部署到服务器
  13. 【GAN:Dense block:VIIF】
  14. 生活中正确购买物品你可能真的不会!
  15. javaWeb(七)ajax远程调用
  16. 简单几步,实现 Redis 查询 “附近的人”!
  17. 动态规划 堆沙子问题
  18. c语言中文内码,C语言辅导:三种常见的中文内码的转换方法
  19. AnyTrans for Mac(ios设备一站式管理工具)完美版
  20. 【AudioProfile】情景模式下音效的默认设置

热门文章

  1. Qt界面制作(QSS、获取屏幕分辨率、自定义控件、版权)
  2. Linux进程列表巧用,Linux下的进程分析–PS
  3. python3.8.3好用吗_python使用3.8.3版本,存在报错
  4. Oracle常用命令大全
  5. python中if for 作用域问题
  6. 计算机网络之数据链路层:5、停止等待协议
  7. 字符串经典题之正则匹配字符串
  8. C/C++函数指针与回调函数总结(函数指针数组)
  9. linux下的各个语言中stdin,stdout和stderr理解
  10. C#不支持XPATH2.0