來源:大數(shù)據(jù)DT(ID:hzdashuju)

獲取Flink源代碼的方式有兩種:一種是通過官網(wǎng)的源代碼下載地址直接下載,另一種是通過git clone的方式。https://flink.apache.org/downloads.html選擇Flink 1.9.0的Source版本下載。導(dǎo)入Flink 源代碼分成兩步,分別是將Flink源代碼導(dǎo)入IDEA和配置Flink源代碼的CheckStyle。其中,配置好Flink 源代碼的CheckStyle是為了保證Flink 源代碼修改符合CheckStyle里的規(guī)范要求。將下載好的Flink源代碼導(dǎo)入IDEA,流程如下。- 啟動IntelliJ IDEA 并單擊歡迎窗口右上角的Open按鈕。
- 選擇Import project from external model和maven項,并單擊Next按鈕。
- 選擇SDK。如果之前沒有配置過SDK,單擊“+”圖標, 并點擊JDK,選擇你的JDK的目錄,然后單擊OK按鈕。
- 單擊Next 按鈕完成Flink源代碼的導(dǎo)入。
- 在導(dǎo)入的項目右側(cè)單擊Maven→Generate Sources and Update Folders的圖標,將Flink Library 構(gòu)建到Maven 本地倉庫。
- 構(gòu)建項目(單擊Build→Make Project圖標)。
想對Flink進行二次開發(fā)或者為開源社區(qū)貢獻代碼的讀者可以選擇配置CheckStyle。IntelliJ IDEA 通過CheckStyle-IDEA 插件來支持CheckStyle。- 在IntelliJ IDEA 的Plugins Marketplace中查找并安裝 CheckStyle-IDEA 插件。
- 依次選擇Settings→Tools→Checkstyle并設(shè)置checkstyle。
- 將 Scan Scope設(shè)置為Only Java sources(including tests)。
- 在Checkstyle version下拉列表中選擇checkstyle版本,并單擊Apply按鈕。(注:官方推薦版本為8.12。)
- 在Configuration File面板中單擊“+”圖標添加新配置:在彈窗中將Description設(shè)置為Flink;選中 Use a local Checkstyle file,并選擇Flink源代碼目錄下的 tools/maven/checkstyle.xml文件;勾選Store relative to project location 選項,單擊Next按鈕;將checkstyle.suppressions.file的屬性設(shè)置值為 suppressions.xml,單擊Next按鈕即完成配置。
- 勾選剛剛添加的新配置Flink,以將其設(shè)置為活躍的配置,依次單擊Apply 和OK按鈕,即完成Java 部分CheckStyle的配置。若源代碼違反CheckStyle規(guī)范,CheckStyle會給出警告。
在CheckStyle 構(gòu)建完成后,依次選擇Settings→Editor→Code Style→Java,并單擊齒輪圖標,選擇導(dǎo)入Flink源代碼目錄下的tools/maven/checkstyle.xml文件,這樣就可以自動調(diào)整import的布局了。可以在CheckStyle的窗口中單擊Check Module按鈕掃描整個模塊,以檢測代碼的CheckStyle。注意:目前Flink源代碼的flink-core、flink-optimizer和 flink-runtime模塊還沒有完全符合設(shè)置的CheckStyle的要求,因此在這三個模塊中出現(xiàn)違反CheckStyle的警告是正常的。開啟Scala 的CheckStyle,依次選擇Settings→Editor→Inspections,再搜索Scala style inspections并勾選。將Flink源代碼目錄下的tools/maven/scalastyle_config.xml放置到Flink 源代碼的.idea目錄下,即完成Scala部分CheckStyle的配置。源代碼已經(jīng)導(dǎo)入,CheckStyle也已配置好,接下來開始編譯與構(gòu)建Flink。在構(gòu)建源代碼之前,假如有修改Flink 版本的需求,可以通過修改Flink源代碼的tools/change-version.sh來實現(xiàn)。Flink源代碼的編譯與構(gòu)建會因Maven版本的不同而有所差異。對于Maven 3.0.x 版本、3.1.x版本、3.2.x版本,可以采用簡單構(gòu)建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版本,下面就依據(jù)這個版本來介紹更多的構(gòu)建內(nèi)容。使用如下方式快速構(gòu)建Flink源代碼,會跳過測試、QA插件、Java docs。$ mvn clean install -DskipTests -Dfast
在構(gòu)建Flink時,會默認構(gòu)建一個Flink特定的Hadoop 2的jar,以供Flink 使用HDFS 和YARN。大多數(shù)開發(fā)者有指定Hadoop版本的需求(建議選擇Hadoop 2.4及以上版本)。$ mvn clean install -DskipTests -Dhadoop.version=3.2.2 -Dinclude-hadoop
其中加上了-Dinclude-hadoop參數(shù),這會將Hadoop的類打包到lib目錄下的flink-dist*.jar,否則Hadoop 會作為一個jar包放在opt目錄下。選擇合適的方式構(gòu)建Flink項目,會將Flink的構(gòu)建放到本地Maven倉庫中,并將Flink源代碼構(gòu)建結(jié)果放在build-target目錄(Flink源代碼構(gòu)建目錄)下。可以將build-target目錄壓縮到一個tar包,即與官網(wǎng)一樣的Flink 二進制包。調(diào)試Flink 源代碼有助于我們了解源代碼的執(zhí)行流程和排查問題。Flink 源代碼調(diào)試分為本地調(diào)試和遠程調(diào)試,下面來分別介紹。以Flink源代碼自帶Streaming 的WordCount為例介紹如何進行本地調(diào)試。找到Flink 源代碼目錄flink-examples/flink-examples-streaming的多級子目錄下的WordCount.java,再選擇Debug。讀者可以在Flink源代碼中設(shè)置斷點進行跟蹤調(diào)試。本地調(diào)試僅限于部署模式中的Local模式,對于基于Standalone、on YARN、on Kubernetes的部署模式,需要使用遠程調(diào)試。遠程調(diào)試方式有兩種:一是修改日志等級,二是修改配置來開啟Java遠程調(diào)試。打開Flink源代碼的構(gòu)建目錄(build-target)下的conf/log4j.properties,根據(jù)需要將內(nèi)容中的INFO改成DEBUG,如下所示,只是將rootLogger的賦值從INFO 修改為DEBUG。修改log4j.properties后構(gòu)建和運行Flink,即可通過DEBUG日志進行遠程調(diào)試。# 設(shè)置全局的日志等級
log4j.rootLogger=DEBUG, file
# 也可以按需改變Flink、Akka、Hadoop、Kafka和ZooKeeper包以及其他包的日志等級
log4j.logger.org.apache.flink=INFO
log4j.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
首先打開IDEA,創(chuàng)建Remote項(見圖1-6)并復(fù)制Remote項的Java運行參數(shù)內(nèi)容,然后修改Flink 構(gòu)建目錄下的conf/flink-conf.yaml,添加env.java.opts屬性與值,添加的內(nèi)容如下:env.java.opts: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n, address=5005
▲圖1-6 配置遠程調(diào)試中的Remote項還可以通過env.java.opts.jobmanager 與env.java.opts.taskmanager來設(shè)置JobManager 和TaskManager運行的參數(shù),從而設(shè)置開啟遠程調(diào)試。設(shè)置配置后,基于這個構(gòu)建目錄運行Flink應(yīng)用,根據(jù)運行的JobManager 與TaskManager 的IP修改原先配置的Remote項的host,在Flink源代碼中設(shè)置斷點,通過Debug 配置Remote項來進行遠程調(diào)試。設(shè)置env.java.opts、env.java.opts.jobmanager和env.java.opts.taskmanager的方法在on Kubernetes模式下很適用,因為Flink 運行的各個組件的IP不同。其他模式存在運行組件與IP、調(diào)試端口相同的問題,對于這種情況可以考慮采用修改日志等級的方式。通過學(xué)習(xí)Flink源代碼的編譯與構(gòu)建,我們知道如何根據(jù)需要構(gòu)建一個Flink發(fā)布包。通過學(xué)習(xí)Flink源代碼的調(diào)試,我們對源代碼的調(diào)試有了更深的了解,為后續(xù)理解源代碼和排查源代碼問題打下了基礎(chǔ)。關(guān)于作者:羅江宇,F(xiàn)link技術(shù)專家,先后就職于新浪微博、滴滴和某大型電商公司。先后主導(dǎo)或參與了多家公司的Flink實時計算服務(wù)的構(gòu)建、對超大規(guī)模集群的維護以及Flink引擎的改造。擁有豐富的實時計算實戰(zhàn)經(jīng)驗,目前專注于Kubernetes調(diào)度、Flink SQL及Flink流批一體化方向。趙士杰,資深大數(shù)據(jù)技術(shù)專家,曾就職于滴滴、阿里巴巴等一線互聯(lián)網(wǎng)公司。從0到1深度參與了滴滴的大數(shù)據(jù)建設(shè),擁有非常豐富的大數(shù)據(jù)平臺一線建設(shè)經(jīng)驗,對于大數(shù)據(jù)領(lǐng)域的計算和存儲引擎也有深入研究。李涵淼,大數(shù)據(jù)研發(fā)專家,曾任滴滴大數(shù)據(jù)開發(fā)工程師。從事大數(shù)據(jù)領(lǐng)域工作多年,參與過多家公司流計算平臺的設(shè)計與研發(fā),目前專注于批流一體、OLAP技術(shù)方向的研究與應(yīng)用。閔文俊,螞蟻集團技術(shù)專家、開源大數(shù)據(jù)社區(qū)愛好者、Flink Contributor,在實時計算領(lǐng)域工作多年,深度參與了滴滴、螞蟻集團的實時計算平臺建設(shè)。本文摘編自《Flink技術(shù)內(nèi)幕:架構(gòu)設(shè)計與實現(xiàn)原理》,經(jīng)出版方授權(quán)發(fā)布。(ISBN:9787111696292)《Flink技術(shù)內(nèi)幕:架構(gòu)設(shè)計與實現(xiàn)原理》轉(zhuǎn)載請聯(lián)系微信:DoctorData推薦語:Flink源碼維護者阿里、螞蟻、滴滴經(jīng)驗總結(jié),剖析Flink機制,指導(dǎo)性能調(diào)優(yōu)、可用性保障、效能優(yōu)化、二次開發(fā)。
讀書 | 書單 | 干貨 | 講明白 | 神操作 | 手把手大數(shù)據(jù) | 云計算 | 數(shù)據(jù)庫 | Python | 爬蟲 | 可視化AI | 人工智能 | 機器學(xué)習(xí) | 深度學(xué)習(xí) | NLP5G | 中臺 | 用戶畫像 | 數(shù)學(xué) | 算法 | 數(shù)字孿生據(jù)統(tǒng)計,99%的大咖都關(guān)注了這個公眾號