溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何生成Flink作業(yè)的交互式火焰圖

發(fā)布時(shí)間:2021-12-22 15:14:27 來(lái)源:億速云 閱讀:163 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何生成Flink作業(yè)的交互式火焰圖,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

前言

Flink 是目前最流行的大數(shù)據(jù)及流式計(jì)算框架之一,用戶可以使用 Java/Scala/Python 的 DataStream 接口或者標(biāo)準(zhǔn) SQL 語(yǔ)言來(lái)快速實(shí)現(xiàn)一個(gè)分布式高可用的流式應(yīng)用,通過(guò)內(nèi)部的 Java JIT、off-heap 內(nèi)存管理等技術(shù)優(yōu)化性能,并且有完整的 Source、Sink、WebUI、Metrics 等功能集成,讓 Flink 幾乎成為了流式計(jì)算的事實(shí)標(biāo)準(zhǔn)。

但是當(dāng)處理海量數(shù)據(jù)的時(shí)候,很容易出現(xiàn)各種異常和性能瓶頸,這時(shí)我們需要優(yōu)化系統(tǒng)性能時(shí),常常需要分析程序運(yùn)行行為和性能瓶頸。Profiling 技術(shù)是一種在應(yīng)用運(yùn)行時(shí)收集程序相關(guān)信息的動(dòng)態(tài)分析手段,常用的 JVM Profiler 可以從多個(gè)方面對(duì)程序進(jìn)行動(dòng)態(tài)分析,如 CPU、Memory、Thread、Classes、GC 等,其中 CPU Profiling 的應(yīng)用最為廣泛。CPU Profiling 經(jīng)常被用于分析代碼的執(zhí)行熱點(diǎn),如“哪個(gè)方法占用 CPU 的執(zhí)行時(shí)間最長(zhǎng)”、“每個(gè)方法占用 CPU 的比例是多少”等等,通過(guò) CPU Profiling 得到上述相關(guān)信息后,研發(fā)人員就可以輕松針對(duì)熱點(diǎn)瓶頸進(jìn)行分析和性能優(yōu)化,進(jìn)而突破性能瓶頸,大幅提升系統(tǒng)的吞吐量。

下面介紹我們?cè)谧鲂阅軆?yōu)化常用的火焰圖以及為如何集成火焰圖到通用的 Flink 作業(yè)中。

火焰圖介紹

火焰圖是《性能之巔》作者以及 DTrace 等一系列 Linux 系統(tǒng)優(yōu)化工具作者 Brendan Gregg 大神的作品之一,可以非常清晰地展示應(yīng)用程序的函數(shù)調(diào)用棧以及函數(shù)調(diào)用時(shí)間占比,基本原理是通過(guò)各種 agent 在程序運(yùn)行時(shí)采樣并輸出日志,使用 FlameGraph 工具把日志提取出來(lái)輸出可在瀏覽器交互式查看的 SVG圖片。

Uber 開(kāi)源了 jvm-profiler 項(xiàng)目,介紹如何為 Spark 應(yīng)用和 Java 應(yīng)用添加火焰圖支持,但是目前 Flink 社區(qū)和 jvm-profiler 官網(wǎng)都還沒(méi)有相關(guān)的使用教程。

如何生成Flink作業(yè)的交互式火焰圖

實(shí)際上基于 JVM 的程序都可以使用這個(gè)工具,本文將基于 jvm-profiler 來(lái)介紹如何生成 Flink 作業(yè)的火焰圖。

下載和編譯 jvm-profiler

git clone git clone https://github.com/uber-common/jvm-profiler.git

mvn clean install -DskipTests=true -Dcheckstyle.skip -Dfast -T 8C

編譯好了之后,將項(xiàng)目 target 目錄下的 jvm-profiler-1.0.0.jar 復(fù)制一份到 flink 的 lib 目錄下面。

cp target/jvm-profiler-1.0.0.jar /usr/local/flink-1.11.1/lib

下載 FlameGraph

由于 jvm-profiler 支持生成火焰圖需要的日志文件,將日志轉(zhuǎn)化成交互式 SVG 圖片還是使用 Brendan Gregg 的FlameGraph 工具。

git clone https://github.com/brendangregg/FlameGraph.git

下載項(xiàng)目源碼即可,后面會(huì)使用 flamegraph.pl 工具來(lái)生成圖片文件。

配置 Flink

對(duì)于 Flink 應(yīng)用,我們只需要在 TaskManager 中注入打點(diǎn)的 Java agent 即可,這里測(cè)試,我就使用本地 standalone 模式,修改 Flink conf 目錄下的 flink-conf.yaml 文件,添加一下如下配置:

env.java.opts.taskmanager: "-javaagent:/usr/local/flink-1.11.1/lib/jvm-profiler-1.0.0.jar=sampleInterval=50"

目前最小的采樣間隔就是 50 毫秒,然后啟動(dòng)集群和運(yùn)行一個(gè) Flink 作業(yè):

./bin/start-cluster.sh


//運(yùn)行一個(gè)作業(yè)
./bin/flink run ./examples/streaming/StateMachineExample.jar

運(yùn)行之后可以看到 TaskManager 的 stdout 里面打印如下:

如何生成Flink作業(yè)的交互式火焰圖

因?yàn)橐呀?jīng)注入 Java agent,因此在標(biāo)準(zhǔn)輸出中會(huì)定期添加火焰圖所需要的打點(diǎn)數(shù)據(jù),然后使用下面的命令提取相關(guān)日志,并且使用 jvm-profiler 和 FlameGraph 提供的工具來(lái)生成 SVG 圖片文件。

//1、提取 stdout 文件中的相關(guān)日志

cat log/flink-zhisheng-taskexecutor-0-zhisheng.out | grep "ConsoleOutputReporter - Stacktrace:" | awk '{print substr($0,37)}' > stacktrace.json


//2、在 jvm-profiler 目錄下執(zhí)行下面命令

python ./stackcollapse.py -i /usr/local/flink-1.11.1/stacktrace.json > stacktrace.folded


//3、在 FlameGraph 目錄下執(zhí)行下面命令生成 SVG 圖片

./flamegraph.pl /Users/zhisheng/Documents/github/jvm-profiler/stacktrace.folded > stacktrace.svg

然后用瀏覽器打開(kāi)剛才生成的 SVG 圖片就可以看到火焰圖信息。

如何生成Flink作業(yè)的交互式火焰圖

上述內(nèi)容就是如何生成Flink作業(yè)的交互式火焰圖,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI