wordpress 仿虎嗅沈陽百度推廣優(yōu)化
作者:郭偉杰(阿里云), 范瑞(Shopee)
Apache Flink PMC(項目管理委員)很高興地宣布發(fā)布 Apache Flink 1.20.0。與往常一樣,這是一個充實的版本,包含了廣泛的改進和新功能??偣灿?142 人為此版本做出了貢獻,完成了 13 個 FLIPs、解決了 300 多個問題。感謝各位貢獻者的支持!
站在 Flink 2.0 的前夜
Apache Flink 1.0 發(fā)布至今已經(jīng) 8 年了。因此,最近幾個月以來,社區(qū)一直在積極朝著下一個大版本(Flink 2.0)邁進。最新發(fā)布的 Flink 1.20 版本將會是 Flink 2.0 (預計 2024 年底發(fā)布) 之前的最后一個小版本。
從 Flink 1.19 開始,社區(qū)決定正式開始廢棄過時的公共 API。在 1.20 中,我們進一步整理了所有可能需要被替換或棄用的API,為 2.0 版本鋪平道路:
-
為了提升易用性和可維護性,我們重新審視了所有運行時、Table、SQL 以及狀態(tài)和檢查點相關的配置項,對它們進行了歸類,增強和廢棄。
-
廢棄過時的 SinkFunction 接口: Flink 1.12 引入了 Unified Sink V2,經(jīng)過了多個版本的開發(fā)和迭代后, 它已經(jīng)變得比較穩(wěn)定和完善。根據(jù)社區(qū)在 FLIP-197 中提出的關于 API 演進的要求,我們把 Unified Sink V2 提升為了公共接口,并且廢棄了 SinkFunction 接口。
歷經(jīng) 8 年的發(fā)展,我們對 Flink 2.0 寄予厚望,并且計劃在 2.x 中發(fā)布幾個重量級的新功能。其中一些已在 Flink 1.20 中完成了最小可行產(chǎn)品(MVP)的開發(fā):
-
提升數(shù)據(jù)加工鏈路開發(fā)體驗:FLIP-435引入了物化表功能,允許用戶在動態(tài)表中通過統(tǒng)一的 SQL 語句來定義數(shù)據(jù)的流式/批式轉(zhuǎn)換邏輯,從而加速 ETL 管道開發(fā),并自動管理任務調(diào)度。完整內(nèi)容和更多細節(jié)請參考FLIP-435。
-
統(tǒng)一的檢查點文件合并機制:Flink 1.20 中引入了統(tǒng)一的檢查點文件合并機制,允許將零散的小的檢查點文件合并到大文件中,減少文件創(chuàng)建和文件刪除的次數(shù),緩解大量小文件對文件系統(tǒng)元數(shù)據(jù)管理帶來的壓力。完整內(nèi)容和更多細節(jié)請參考FLIP-306。
Flink SQL 提升
引入物化表
Flink 1.20 版本 為 Flink SQL 引入了物化表(Materialized Table)抽象。這是一種新的表類型,旨在同時簡化流和批處理的數(shù)據(jù)加工鏈路,同時提供一致的開發(fā)體驗。
通過定義查詢語句和數(shù)據(jù)新鮮度,引擎會自動推導出表結(jié)構并創(chuàng)建對應的數(shù)據(jù)加工鏈路,以保證查詢結(jié)果滿足所要求的數(shù)據(jù)新鮮度。用戶無需理解流處理和批處理之間的概念和差異,也不必直接維護 Flink 流處理或批作業(yè),所有操作都在物化表上完成,這可以顯著加快 ETL 數(shù)據(jù)加工鏈路的開發(fā)速度。
下面是創(chuàng)建一個具備自動刷新能力的物化表的示例,數(shù)據(jù)新鮮度為 3 分鐘。
-- 1. 創(chuàng)建物化表并定義新鮮度
CREATE MATERIALIZED TABLE dwd_orders
(PRIMARY KEY(ds, id) NOT ENFORCED
)
PARTITIONED BY (ds)
FRESHNESS = INTERVAL '3' MINUTE
AS SELECT o.dso.id,o.order_number,o.user_id,
...
FROM orders as oLEFT JOIN products FOR SYSTEM_TIME AS OF proctime() AS prodON o.product_id = prod.idLEFT JOIN order_pay AS payON o.id = pay.order_id and o.ds = pay.ds;-- 2. 暫停數(shù)據(jù)刷新
ALTER MATERIALIZED TABLE dwd_orders SUSPEND;-- 3. 恢復數(shù)據(jù)刷新
ALTER MATERIALIZED TABLE dwd_orders RESUME
-- Set table option via WITH clause
WITH('sink.parallesim' = '10'
);-- 手動刷寫歷史數(shù)據(jù)
ALTER MATERIALIZED TABLE dwd_orders REFRESH PARTITION(ds='20231023');
更多信息
-
物化表文檔
-
FLIP-435: Introduce a New Materialized Table for Simplifying Data Pipelines
完善 Catalog 相關語法
隨著 Flink SQL 的廣泛采用,Flink Catalog 發(fā)揮著越來越重要的作用。Flink 內(nèi)置了 JDBC
和 Hive
Catalog 實現(xiàn),而其他開源項目(如 Apache Paimon)也實現(xiàn)了自己的 Catalog
。
在 Flink 1.20 中,您可以使用 DQL
語法從現(xiàn)有 Catalog 中獲取詳細的元數(shù)據(jù)信息,并使用 DDL
語法修改指定Catalog 的屬性或注釋等元數(shù)據(jù)。
Flink SQL> CREATE CATALOG `cat` WITH ('type'='generic_in_memory', 'default-database'='db');
[INFO] Execute statement succeeded.Flink SQL> SHOW CREATE CATALOG `cat`;
+---------------------------------------------------------------------------------------------+
| result |
+---------------------------------------------------------------------------------------------+
| CREATE CATALOG `cat` WITH ('default-database' = 'db','type' = 'generic_in_memory'
)
|
+---------------------------------------------------------------------------------------------+
1 row in setFlink SQL> DESCRIBE CATALOG `cat`;
+-----------+-------------------+
| info name | info value |
+-----------+-------------------+
| name | cat |
| type | generic_in_memory |
| comment | |
+-----------+-------------------+
3 rows in setFlink SQL> ALTER CATALOG `cat` SET ('default-database'='new-db');
[INFO] Execute statement succeeded.Flink SQL> SHOW CREATE CATALOG `cat`;
+-------------------------------------------------------------------------------------------------+
| result |
+-------------------------------------------------------------------------------------------------+
| CREATE CATALOG `cat` WITH ('default-database' = 'new-db','type' = 'generic_in_memory'
)
|
+-------------------------------------------------------------------------------------------------+
1 row in set
更多信息
- FLIP-436: Introduce Catalog-related Syntax
DDL 支持 DISTRIBUTED BY 語句
鑒于越來越多的 SQL 引擎對外暴露了 “分區(qū)”、“分桶”或“聚類”的概念,Flink 1.20 將“分桶”的概念引入了 Flink SQL。分桶操作通過將數(shù)據(jù)拆分為不相交的子集來實現(xiàn)數(shù)據(jù)在外部存儲系統(tǒng)中的負載均衡。雖然它在很大程度上取決于底層連接器的語義,但是用戶可以通過指定分桶數(shù)量、算法以及用于目標分桶計算的列(如果算法允許)來影響分桶的行為。所有分桶相關的關鍵字在 SQL 語法中都是可選的。
Apache Paimon 的分桶表和 Apache Kafka 的 topic 分區(qū)都將對接到該語法上,簡化用戶的建表操作,并讓 Flink SQL 感知了外部數(shù)據(jù)的物理分布,為未來支持 bucket join 等優(yōu)化打好了基礎。
以下面的 SQL 語句為例:
-- 指定桶的個數(shù)和數(shù)據(jù)分配邏輯(按照 uid 列的哈希值進行分配)
CREATE TABLE MyTable (uid BIGINT, name STRING) DISTRIBUTED BY HASH(uid) INTO 4 BUCKETS;-- 不顯示指定分桶算法,數(shù)據(jù)分配邏輯由 Connector 自己決定。
CREATE TABLE MyTable (uid BIGINT, name STRING) DISTRIBUTED BY (uid) INTO 4 BUCKETS;-- 不顯式指定桶的數(shù)量,桶數(shù)量和數(shù)據(jù)分配邏輯均由 Connector 自己決定。
CREATE TABLE MyTable (uid BIGINT, name STRING) DISTRIBUTED BY (uid);-- 僅指定桶的數(shù)量
CREATE TABLE MyTable (uid BIGINT, name STRING) DISTRIBUTED INTO 4 BUCKETS;
更多信息
-
FLIP-376: Add DISTRIBUTED BY clause
-
文檔
狀態(tài) & 檢查點提升
統(tǒng)一的檢查點文件合并機制
Flink 1.20 引入了統(tǒng)一的檢查點文件合并機制,它將多個小的檢查點文件合并為數(shù)量較少的大文件,從而減少了文件創(chuàng)建和文件刪除操作的次數(shù),并減輕了檢查點期間文件系統(tǒng)元數(shù)據(jù)管理的壓力。
可以通過將 execution.checkpointing.file-merging.enabled
設置為 true
來啟用該功能。有關更多高級選項以及此功能背后的原理,請參閱文檔。
更多信息
-
FLIP-306: Unified File Merging Mechanism for Checkpoints
-
文檔
壓縮小的 SST 文件
在某些情況下,RocksDB 狀態(tài)后端生成的文件數(shù)量會無限制地增長。除了許多小文件造成的開銷之外,此行為還可能導致任務狀態(tài)信息超出 RPC 消息大小限制,從而導致檢查點失敗。從 1.20 版開始,Flink 可以使用 RocksDB API 在后臺合并此類文件。
更多信息
- FLINK-2605
批處理能力提升
JobMaster 發(fā)生故障時更好的錯誤恢復機制
在 Flink 1.20 中,我們支持了一種新的批處理作業(yè)恢復機制,使批處理作業(yè)能夠在 JobMaster
故障轉(zhuǎn)移后盡可能多地恢復進度,避免重新運行已經(jīng)完成的任務。
更多信息
-
FLIP-383: Support Job Recovery from JobMaster Failures for Batch Jobs
-
文檔
HiveSource 支持動態(tài)并發(fā)推斷
在 Flink 1.20 中,我們?yōu)?Hive 數(shù)據(jù)源連接器增加了對動態(tài)并發(fā)推斷的支持,這允許它基于動態(tài)分區(qū)修剪(DPP)的結(jié)果動態(tài)決定并行度。
此外,我們引入了一個新的配置選項 table.exec.hive.infer-source-parallelism.mode
,使用戶能夠在數(shù)據(jù)源并行度的靜態(tài)和動態(tài)推斷模式之間進行切換。需要注意的是,在 Flink 1.20 中,以前的配置選項 table.exec.hive.infer-source-parallelism
已被標記為棄用。
更多信息
- FLIP-445: Support dynamic parallelism inference for HiveSource
DataStream API 提升
DataSet
API 已正式棄用,并將在 Flink 2.0 版本中被刪除。我們建議 Flink 用戶根據(jù)數(shù)據(jù)處理需求將作業(yè)從 DataSet
API 逐步遷移到 DataStream
API、Table
API 和 SQL
。
支持 DataStream API 上的全量分區(qū)數(shù)據(jù)處理
在 Flink 1.20 之前,DataStream
API 不支持對非分區(qū)流上的數(shù)據(jù)做全量的數(shù)據(jù)聚合操作,這阻礙了用戶從 DataSet
API 的遷移。作為一種替代方案,用戶可以將子任務的編號關聯(lián)到數(shù)據(jù)上,并以此為數(shù)據(jù)鍵來構建分區(qū)流,但這會產(chǎn)生很大的額外開銷。為此,Flink 1.20 引入了 FullPartitionWindow
API,從而補齊了對全量分區(qū)數(shù)據(jù)處理的內(nèi)置支持。
假設我們想要計算每個分區(qū)中的總記錄數(shù)并輸出到下游,可以按如下方式完成:
inputStream.fullWindowPartition().mapPartition(new MapPartitionFunction<Record, Long>() {@Overridepublic void mapPartition(Iterable<Record> values, Collector<Long> out)throws Exception {long counter = 0;for (Record value : values) {counter++;}out.collect(counter));}})
更多信息
- FLIP-380: Support Full Partition Processing On Non-keyed DataStream
重要配置項變更
隨著 Apache Flink 即將來到 2.0 版本,一大批配置項在 Flink 1.20 版本被更改或棄用,以提高易用性和可維護性。
更新配置項為合適的類型
-
一系列與時間相關的配置項(例如
client.heartbeat.interval
)的類型被更新為了Duration
。完整列表可在FLINK-35359 中找到。 -
配置項
taskmanager.network.compression.codec
和table.optimizer.agg-phase-strategy
的類型被更新為了Enum
。 -
配置項
yarn.application-attempts
的類型被更新為了Int
。
更多信息
- FLINK-35359
棄用多個配置項
在 Flink 1.20 中社區(qū)決定正式棄用多個即將在 Flink 2.0 停用的配置項:
-
由于我們正在逐步淘汰基于哈希的 Blocking Shuffle,以下配置項已被棄用并將在 Flink 2.0 中被刪除:
-
taskmanager.network.sort-shuffle.min-parallelism
-
taskmanager.network.blocking-shuffle.type
-
-
由于我們正在逐步淘汰舊的Hybrid Shuffle 模式,以下配置項已被棄用并將在 Flink 2.0 中被刪除:
-
taskmanager.network.hybrid-shuffle.spill-index-region-group-size
-
taskmanager.network.hybrid-shuffle.num-retained-in-memory-regions-max
-
taskmanager.network.hybrid-shuffle.enable-new-mode
-
-
為了簡化網(wǎng)絡緩沖區(qū)相關配置,以下配置選項已被棄用并將在 Flink 2.0 中被刪除:
-
taskmanager.network.memory.buffers-per-channel
-
taskmanager.network.memory.floating-buffers-per-gate
-
taskmanager.network.memory.max-buffers-per-channel
-
taskmanager.network.memory.max-overdraft-buffers-per-gate
-
taskmanager.network.memory.exclusive-buffers-request-timeout-ms
(請使用taskmanager.network.memory.buffers-request-timeout
代替)
-
-
由于絕大多數(shù)批作業(yè)都會開啟壓縮,配置項
taskmanager.network.batch-shuffle.compression.enabled
已被棄用并將在 Flink 2.0 中被刪除。如確有需要,請將taskmanager.network.compression.codec
設置為NONE
以禁用壓縮。 -
以下與 Netty 相關的配置項過于底層,已在 Flink 1.20 被棄用,我們將在 Flink 2.0 中將其移除:
-
taskmanager.network.netty.num-arenas
-
taskmanager.network.netty.server.numThreads
-
taskmanager.network.netty.client.numThreads
-
taskmanager.network.netty.server.backlog
-
taskmanager.network.netty.sendReceiveBufferSize
-
taskmanager.network.netty.transport
-
-
以下配置項是不必要的,已在 Flink 1.20 被棄用并且將在 Flink 2.0 中被刪除:
-
taskmanager.network.max-num-tcp-connections
(將在 Flink 2.0 中被硬編碼為1
) -
fine-grained.shuffle-mode.all-blocking
-
-
以下配置項用于微調(diào) TPC 測試但當前 Flink 已不再需要,已被棄用并且將在 Flink 2.0 中被刪除:
-
table.exec.range-sort.enabled
-
table.optimizer.rows-per-local-agg
-
table.optimizer.join.null-filter-threshold
-
table.optimizer.semi-anti-join.build-distinct.ndv-ratio
-
table.optimizer.shuffle-by-partial-key-enabled
-
table.optimizer.smj.remove-sort-enabled
-
table.optimizer.cnf-nodes-limit
-
-
以下配置項是為現(xiàn)已過時的
FilterableTableSource
接口引入的,已被棄用并且將在 Flink 2.0 中被刪除:-
table.optimizer.source.aggregate-pushdown-enabled
-
table.optimizer.source.predicate-pushdown-enabled
-
-
配置選項
sql-client.display.max-column-width
已被棄用并且將在 Flink 2.0 中被刪除。請改用table.display.max-column-width
替代。
更多信息
-
Runtime 相關配置項變更
-
Table/SQL 相關配置項變更
配置項的其他變更
重新組織配置項
在 Flink 1.20 中,所有關于狀態(tài)和檢查點的配置項都被重新組織并按前綴分類:
-
execution.checkpointing.*
:所有與檢查點和保存點相關的配置選項。 -
execution.state-recovery.*
:所有與狀態(tài)恢復相關的配置選項。 -
state.*
:所有與狀態(tài)訪問相關的配置選項。 -
state.backend.*
: 各個狀態(tài)后端的配置選項,例如 RocksDB 狀態(tài)后端。 -
state.changelog.*
:與狀態(tài)變更日志相關的配置選項。 -
state.latency-track.*
:與狀態(tài)訪問的延遲追蹤相關的配置選項。
新的公開配置項
-
以下與動態(tài)哈希聚合相關配置項已從
org.apache.flink.table.planner.codegen.agg.batch.HashAggCodeGenerator
移動至org.apache.flink.table.api.config
并提升為@PublicEvolving
API: -
table.exec.local-hash-agg.adaptive.enabled
-
table.exec.local-hash-agg.adaptive.sampling-threshold
-
table.exec.local-hash-agg.adaptive.distinct-value-rate-threshold
-
以下與 LookupJoin 相關的配置項已從
org.apache.flink.table.planner.hint.LookupJoinHintOptions
移動至org.apache.flink.table.api.config.LookupJoinHintOptions
并提升為@PublicEvolving
API: -
table
-
async
-
output-mode
-
capacity
-
timeout
-
retry-predicate
-
retry-strategy
-
fixed-delay
-
max-attempts
-
以下與優(yōu)化器有關的配置項已從
org.apache.flink.table.planner.plan.optimize.RelNodeBlock
移動至org.apache.flink.table.api.config.OptimizerConfigOptions
并升級為@PublicEvolving
API: -
table.optimizer.union-all-as-breakpoint-enabled
-
table.optimizer.reuse-optimize-block-with-digest-enabled
-
table.optimizer.incremental-agg-enabled
已從org.apache.flink.table.planner.plan.rules.physical.stream.IncrementalAggregateRule
移動至org.apache.flink.table.api.config.OptimizerConfigOptions
并升級為@PublicEvolving
API.
更多信息
-
Runtime 相關配置項變更
-
Table/SQL 相關配置項變更
-
Checkpointing Options
-
Recovery Options
-
State Backend Options
-
State Changelog Options
-
Latency-track Options
升級說明
Apache Flink 社區(qū)努力確保升級過程盡可能平穩(wěn), 但是升級到 1.20 版本可能需要用戶對現(xiàn)有應用程序做出一些調(diào)整。請參考Release Notes獲取更多的升級時需要的改動與可能的問題列表細節(jié)。
貢獻者列表
在 1.20 版本中,我們一如既往地看到了許多來自中國的開發(fā)者身影。他們積極參與并貢獻社區(qū),協(xié)助新版本的發(fā)布,四個版本發(fā)布管理者(Release Manager)中有兩位均來自國內(nèi),分別是來自阿里云智能的郭偉杰和來自 Shopee 的范瑞。中國開發(fā)者在 1.20 備受期待的新功能上也作出了巨大貢獻,例如來自阿里云的開發(fā)者們主導并貢獻了物化表、檢查點文件合并、JobMaster 發(fā)生故障時更好的錯誤恢復機制等特性。來自字節(jié)跳動,網(wǎng)易,小米等公司的開發(fā)者們也都為社區(qū)帶來了非常多的重要功能貢獻和 bug 修復。
Apache Flink 社區(qū)感謝對此版本做出貢獻的每一位貢獻者:
Ahmed Hamdy, Alan Sheinberg, Aleksandr Pilipenko, Alexander Fedulov, Andrey Gaskov, Antonio Vespoli, Anupam Aggarwal, Barak Ben-Nathan, Benchao Li, Brad, Cheng Pan, Chesnay Schepler, DamonXue, Danny Cranmer, David Christle, David Moravek, David Schlosnagle, Dawid Wysakowicz, Dian Fu, Dmitriy Linevich, Elphas Toringepi, Emre Kartoglu, Fang Yong, Feng Jin, Ferenc Csaky, Frank Yin, Gabor Somogyi, Gyula Fora, HCTommy, Hangxiang Yu, Hanyu Zheng, Hao Li, Hong Liang Teoh, Hong Teoh, HuangXingBo, Jacky Lau, James Hughes, Jane Chan, Jeyhun Karimov, Jiabao Sun, Jim Hughes, Jing Ge, Jinzhong Li, JunRuiLee, Juntao Hu, JustinLee, Kartikey Pant, Kumar Mallikarjuna, Leonard Xu, Lorenzo Affetti, Luke Chen, Martijn Visser, Mason Chen, Matthias Pohl, Mingliang Liu, Panagiotis Garefalakis, Peter Huang, Peter Vary, Piotr Nowojski, Puneet Duggal, Qinghui Xu, Qingsheng Ren, Ravi Dutt Singh, Robert Metzger, Robert Young, Roc Marshal, Roman, Roman Boyko, Roman Khachatryan, Ron, Rui Fan, Ryan Skraba, Samrat, Sergey Nuyanzin, Shilun Fan, Stefan Richter, SuDewei, Timo Walther, Ufuk Celebi, Vincent Woo, Wang FeiFan, Weijie Guo, Wencong Liu, Wouter Zorgdrager, Xiangyu Feng, Xintong Song, Xuyang, Yanfei Lei, Yangze Guo, Yu Chen, Yubin Li, Yuepeng Pan, Yun Tang, Yuxin Tan, Zakelly, Zhanghao Chen, Zhen Wang, Zhenqiu Huang, Zhu Zhu, Zmm, ammar-master, anupamaggarwal, bvarghese1, caicancai, caodizhou, chenzihao, drymatini, dsaisharath, eason.qin, elon-X, fengli, gongzhongqiang, hejufang, jectpro7, jiangxin, liming.1018, lincoln lee, liuyongvs, lxliyou001, oleksandr.nitavskyi, plugatarev, rmoff, slfan1989, spoon-lz, sunxia, sxnan, sychen, wforget, xiaogang, xingbo, yebukong, yunfengzhou-hub, yunhong, zhouyisha, 馬越