Flink 1.11 Release 文檔解讀

點擊上方“zhisheng”,選擇“設爲星標”

後臺回覆"666",獲取新資料

集羣和部署

  • 支持 Hadoop 3.0 及更高的版本:Flink 不再提供任何 flink-shaded-hadoop- 依賴。用戶可以通過配置 HADOOP_CLASSPATH 環境變量(推薦)或在 lib 文件夾下放入 Hadoop 依賴項。另外 include-hadoop Maven profile 也已經被移除了。

  • 移除了 LegacyScheduler:Flink 不再支持 legacy scheduler,如果你設置了 jobmanager.scheduler: legacy 將不再起作用並且會拋出 IllegalArgumentException 異常,該參數的默認值並且是唯一選項爲 ng。

  • 將用戶代碼的類加載器和 slot 的生命週期進行綁定:只要爲單個作業分配了至少一個 slot,TaskManager 就會重新使用用戶代碼的類加載器。這會稍微改變 Flink 的恢復行爲,從而不會重新加載靜態字段。這樣做的好處是,可以大大減輕對 JVM metaspace 的壓力。

  • slave 文件重命名爲 workers:對於 Standalone 模式安裝,worker 節點文件不再是 slaves 而是 workers,以前使用 start-cluster.sh  和 stop-cluster.sh  腳本的設置需要重命名該文件。

  • 完善 Flink 和 Docker 的集成Dockerfiles 文件樣例和 build.sh Docker 鏡像文件都從 Flink GitHub 倉庫中移除了,這些示例社區不再提供,因此 flink-contrib/docker-flinkflink-container/dockerflink-container/kubernetes 模塊都已刪除了。目前你可以通過查看 Flink Docker integration 官方文檔學會如何使用和自定義 Flink Docker 鏡像,文檔中包含了 docker run、docker compose、docker swarm 和 standalone Kubernetes。

內存管理

  • JobManager 使用新的內存模型:可以參考 FLIP-116,介紹了 JobManager 新的內存模型,提供了新的配置選項來控制 JobManager 的進程內存消耗,這種改變會影響 Standalone、YARN、Mesos 和 Active Kubernetes。如果你嘗試在不做任何調整的情況下重用以前的Flink 配置,則新的內存模型可能會導致 JVM 的計算內存參數不同,從而導致性能發生變化甚至失敗,可以參考 Migrate Job Manager Memory Configuration 文檔進行遷移變更。jobmanager.heap.sizejobmanager.heap.mb 配置參數已經過期了,如果這些過期的選項還繼續使用的話,爲了維持向後兼容性,它們將被解釋爲以下新選項之一:

    下面兩個選項已經刪除了並且不再起作用了:

    JVM 參數,JobManager JVM 進程的 direct 和 metaspace 內存現在通過下面兩個參數進行配置:

    如果沒有正確配置或存在相應的內存泄漏,這些新的限制可能會產生相應的 OutOfMemoryError 異常,可以參考 OutOfMemoryError 文檔進行解決。

    • jobmanager.memory.off-heap.size

    • jobmanager.memory.jvm-metaspace.size

    • containerized.heap-cutoff-ratio

    • containerized.heap-cutoff-min

    • jobmanager.memory.heap.size:JVM Heap,爲了 Standalone 和 Mesos 部署

    • jobmanager.memory.process.size:進程總內存,爲了容器部署(Kubernetes 和 YARN)

  • 移除過期的 mesos.resourcemanager.tasks.mem參數

Table API/SQL

  • Blink planner 成爲默認的 planner

  • 改變了 Table API 的包結構:由於包 org.apache.flink.table.api.scala/java 中的各種問題,這些包下的所有類都已遷移。此外,如 Flink 1.9 中所述,scala 表達式已移至 org.apache.flink.table.api

    如果你之前使用了下面的類:

    如果你不需要轉換成 DataStream 或者從 DataStream 轉換,那麼你可以使用:

    如果你需要轉換成 DataStream/DataSet,或者從 DataStream/DataSet 轉換,那麼你需要將依賴 imports 改成:

    對於 Scala 表達式,使用下面的 import:

    如果你使用 Scala 隱式轉換成 DataStream/DataSet,或者從 DataStream/DataSet 轉換,那麼該導入

    • org.apache.flink.table.api.bridge.scala._

    • org.apache.flink.table.api._ instead of org.apache.flink.table.api.bridge.scala._

    • org.apache.flink.table.api.bridge.java.StreamTableEnvironment

    • org.apache.flink.table.api.bridge.scala.StreamTableEnvironment

    • org.apache.flink.table.api.bridge.java.BatchTableEnvironment

    • org.apache.flink.table.api.bridge.scala.BatchTableEnvironment

    • org.apache.flink.table.api.TableEnvironment

    • org.apache.flink.table.api.java.StreamTableEnvironment

    • org.apache.flink.table.api.scala.StreamTableEnvironment

    • org.apache.flink.table.api.java.BatchTableEnvironment

    • org.apache.flink.table.api.scala.BatchTableEnvironment

  • 移除 StreamTableSink 接口中的 emitDataStream 方法:該接口的 emitDataStream 方法將移除

  • 移除 BatchTableSink 中的 emitDataSet 方法:將該接口的 emitDataSet 方法重命名爲 consumeDataSet 並且返回 DataSink

  • 糾正 TableEnvironment.execute()** 和** StreamTableEnvironment.execute() 的執行行爲:在早期的版本, TableEnvironment.execute()StreamExecutionEnvironment.execute() 都可以觸發 Table 程序和 DataStream 程序。從 Flink 1.11.0 開始,Table 程序只能由 TableEnvironment.execute() 觸發。將 Table 程序轉換爲 DataStream 程序(通過 toAppendStream()toRetractStream() 方法)後,只能由 StreamExecutionEnvironment.execute() 觸發它。

  • 糾正 ExecutionEnvironment.execute()   BatchTableEnvironment.execute() 的執行行爲:在早期的版本中, BatchTableEnvironment.execute()ExecutionEnvironment.execute() 都可以觸發 Table 和 DataSet 應用程序(針對老的 planner)。從 Flink 1.11.0 開始,批處理 Table 程序只能由 BatchEnvironment.execute() 觸發。將 Table 程序轉換爲DataSet 程序(通過 toDataSet() 方法)後,只能由 ExecutionEnvironment.execute() 觸發它。

  • 在 Row 類型中添加了更改標誌:在 Row 類型中添加了一個更改標誌 RowKind

配置

  • 重命名 log4j-yarn-session.properties logback-yarn.xml 配置文件:日誌配置文件 log4j-yarn-session.propertieslogback-yarn.xml 被重命名爲 log4j-session.propertieslogback-session.xml 而且, yarn-session.shkubernet -session.sh 使用這些日誌配置文件。

狀態

  • 刪除已棄用的後臺清理開關StateTtlConfig#cleanupInBackground 已經被刪除,因爲在 1.10 中該方法已被棄用,並且默認啓用了後臺 TTL。

  • 刪除禁用 TTL 壓縮過濾器的的選項:默認情況下,RocksDB 中的 TTL 壓縮過濾器在 1.10 中是啓用的,在 1.11+ 中總是啓用的。因此,在 1.11 中刪除了以下選項和方法:

    • state.backend.rocksdb.ttl.compaction.filter.enabled

    • StateTtlConfig#cleanupInRocksdbCompactFilter()

    • RocksDBStateBackend#isTtlCompactionFilterEnabled

    • RocksDBStateBackend#enableTtlCompactionFilter

    • RocksDBStateBackend#disableTtlCompactionFilter

    • (state_backend.py) is_ttl_compaction_filter_enabled

    • (state_backend.py) enable_ttl_compaction_filter

    • (state_backend.py) disable_ttl_compaction_filter

  • 改變 StateBackendFactory#createFromConfig 的參數類型:從 Flink 1.11 開始, StateBackendFactory 接口中的 createFromConfig方法中的參數變爲 ReadableConfig 而不是 Configuration。Configuration 類是 ReadableConfig 接口的實現類,因爲它實現了 ReadableConfig 接口,所以自定義 StateBackend 也應該做相應的調整。

  • 刪除過期的 OptionsFactory ConfigurableOptionsFactory :過期的 OptionsFactory 和 ConfigurableOptionsFactory 類已被刪除。請改用 RocksDBOptionsFactory 和 ConfigurableRocksDBOptionsFactory。如果任何類擴展了DefaultConfigurableOptionsFactory,也請重新編譯你的應用程序代碼。

  • 默認情況下啓用 setTotalOrderSeek:從 Flink 1.11 開始,默認情況下,RocksDB 的 ReadOptions 將啓用 setTotalOrderSeek 選項。這是爲了防止用戶忘記使用 optimizeForPointLookup。爲了向後兼容,我們支持通過 RocksDBOptionsFactory 自定義 ReadOptions。如果觀察到性能下降,請將 setTotalOrderSeek 設置爲 false(根據我們的測試,這種情況不應該發生)。

  • 增加 state.backend.fs.memory-threshold 的默認值state.backend.fs.memory-threshold 的默認值已從 1K 增加到20K,以防止在遠程 FS 上爲小狀態創建太多小文件。對於那些 source 處配置很多並行度或者有狀態的算子的作業可能會因此變更而出現 JM OOMRPC message exceeding maximum frame size 的問題。如果遇到此類問題,請手動將配置設置回 1K。

PyFlink

  • 對於不支持的數據類型將拋出異常:可以使用一些參數(例如,精度)來配置數據類型。但是,在以前的版本中,用戶提供的精度沒有任何效果,會使用該精度的默認值。爲了避免混淆,從 Flink 1.11 開始,如果不支持該數據類型,則將引發異常。更改包括:

    • TimeType 精度只能爲 0

    • VarBinaryType/VarCharType 的長度是 0x7fffffff

    • DecimalType 可選值是 38/18

    • TimestampType/LocalZonedTimestampType 的精度只能是 3

    • DayTimeIntervalType 的單位是 SECONDfractionalPrecision 精度只能爲 3

    • YearMonthIntervalType 的單位是 MONTHyearPrecision 精度只能爲 2

    • CharType/BinaryType/ZonedTimestampType 不支持

監控

  • 將所有的 MetricReporters 轉換爲 plugins:Flink 的所有 MetricReporters 都已經轉換爲 plugins,它們不再存放在 lib 目錄下(這樣做可能會導致依賴衝突),而應該放到 /plugins/<some_directory> 目錄下。

  • 改變 DataDog 的 metrics reporter Counter Metrics:現在 DataDog metrics reporter 程序將 Counter 指標上報爲報告時間間隔內的事件數,而不是總數,將 Counter 語義與 DataDog 文檔保持一致。

  • 切換 Log4j2 爲默認的:Flink 現在默認使用 Log4j2,希望恢復到 Log4j1 的用戶可以在日誌文檔中找到操作說明

  • 更改 JobManager API 的日誌請求行爲:從 JobManager 服務端請求一個不可用的 log 或者 stdout 文件現在會返回 404 狀態碼,在之前的版本中,會返回 file unavailable

  • 移除 lastCheckpointAlignmentBuffered metric:現在 lastCheckpointAlignmentBuffered metric 已經被移除了,因爲在發出 Checkpoint barrier 之後,上游的任務不會發送任何數據,直到下游側完成對齊爲止,WebUI 仍然會顯示該值,但現在始終爲 0。

Connectors

  • 移除 Kafka 0.8/0.9 Connector

  • 移除 ElasticSearch 2.x Connector

  • 移除 KafkaPartitioner

  • 改進的 fallback 文件系統,以只處理特定的文件系統

  • FileSystem#getKind 方法設置過期的

Runtime

  • 流作業在 Checkpoint 同步部分失敗時會立即失敗:無論配置什麼參數,Checkpoint 同步部分中的失敗(如算子拋出異常)都將立即使其任務(和作業)失敗,從 Flink 1.5 版本開始,可以通過設置 setTolerableCheckpointFailureNumber(...)setFailTaskOnCheckpointError(...) 參數來忽略此類的失敗,現在這兩個參數隻影響異步的失敗。

  • Checkpoint 超時不再被 CheckpointConfig#setTolerableCheckpointFailureNumber 忽略:現在將 Checkpoint 超時視爲正常的 Checkpoint 故障,並根據 CheckpointConfig#setTolerableCheckpointFailureNumber 配置的值進行檢查。

各種接口變更

  • 移除過期的 StreamTask#getCheckpointLock() :在方法在 Flink 1.10 中已經設置過期了,目前不再提供該方法。用戶可以使用 MailboxExecutor 來執行需要與任務線程安全的操作。

  • flink-streaming-java 模塊不再依賴 flink-client 模塊:從 Flink 1.11.0 開始,flink-streaming-java 模塊不再依賴 flink-client 模塊,如果你項目依賴於 flink-client 模塊,需要顯示的添加其爲依賴項。

  • AsyncWaitOperator 是可鏈接的:默認情況下,將允許 AsyncWaitOperator 與所有算子鏈接在一起,但帶有 SourceFunction 的任務除外。

  • 更改了 ShuffleEnvironment 接口的 createInputGatescreateResultPartitionWriters 方法的參數類型。

  • CompositeTypeSerializerSnapshot#isOuterSnapshotCompatible 方法標示過期了。

  • 移除了過期的 TimestampExtractor:可以使用 TimestampAssigner 和 WatermarkStrategies。

  • ListCheckpointed 標示爲過期的:可以使用 CheckpointedFunction 作爲代替

  • 移除了過期的 state 連接方法:移除了 RuntimeContext#getFoldingState()OperatorStateStore#getSerializableListState()OperatorStateStore#getOperatorState() 連接狀態的方法,這意味着在 1.10 運行成功的代碼在 1.11 上是運行不了的。

詳情參考 https://ci.apache.org/projects/flink/flink-docs-master/release-notes/flink-1.11.html




基於 Apache Flink 的實時監控告警系統關於數據中臺的深度思考與總結(乾乾貨)日誌收集Agent,陰暗潮溼的地底世界
2020 繼續踏踏實實的做好自己

公衆號(zhisheng)裏回覆 面經、ES、Flink、 Spring、Java、Kafka、監控 等關鍵字可以查看更多關鍵字對應的文章。

你點的每個贊,我都當成了喜歡
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章