曾經紅遍一時的Scala
想當初Spark橫空出世之后,Scala簡直就是語言界的一顆璀璨新星,惹得大家紛紛側目,連Kafka這類技術框架也選擇用Scala語言進行開發重構。
可如今,Flink竟然公開宣布棄用Scala
在Flink1.18的官方文檔里,有一句非常嚴肅的話:所有的Flink Scala APIs已被標記為廢棄,且將在未來版本中予以移除。
All Flink Scala APIs are deprecated and will be removed in a future Flink version. You can still build your application in Scala, but you should move to the Java version of either the DataStream and/or Table API.See FLIP-265 Deprecate and remove Scala API support
究竟為何Flink舍棄Scala?
為了一探究竟,我特地研究了FLIP-265 Deprecate and remove Scala API support的文檔,其中內容如下。
Flink通過APIs方式來構建DataStream和TableAPI程序。這些是用Java和Scala寫的。PythonAPI在底層使用JavaAPI。隨著時間的推移,Flink社區的主要焦點已經轉向JavaAPI,而Flink中的Scala支持與JavaAPI并不同步。舉幾個例子:
Flink仍然僅支持Scala2.12.7,如果要升級的畫,只能通過破壞兼容性升級到更高版本
截止到目前為止,Flink還不支持Scala2.13
與Scala中的DataStreamAPI 相比,Java中的DataStreamAPI具有更多可用功能。例如Async I/O
Flink中Scala現狀可以總結為( 機翻 ):
大多數與Scala相關的貢獻都集中在阻止用戶在任何Scala版本中使用JavaAPI
Flink社區缺乏具有Scala知識的維護人員,可以幫助直接在Flink中轉發Scala支持
添加到Flink的新API接口首先是為Java創建的,在Scala中沒有或只有有限的支持
開源社區正在制定舉措來幫助Flink中的Scala支持,例如https://github.com/ariskk/flink4s(為Scala3用戶包裝JavaAPI)和https://github.com/findify/flink-adt(取代了flink-scala 中的TypeInformation派生機制)
至于Scala版本之間的兼容性為何總是那么差,其實很簡單:
當年Scala剛創出個頭角時,并未面臨著保持兼容性的壓力,因為那時的它并不吃香,也未受到大型企業的青睞。正是這種無人關注的狀態,使得維持兼容性變得無所謂。直至Scala 2.7.x版本前后,它開始呈現出崛起之勢,一些新興企業,比如Twitter,紛紛將其作為首選,由此一來,向后兼容性才成了頭等大事。
在Scala 2.8.0開始起航之時,該語言引入了一套特殊規則以最大程度上保持兼容性。對于Scala2來說,版本劃分更為明確:2.major.minor,只要主版本保持不變,次要版本之間就能做到完美兼容。主版本的跨越往往會破壞二進制兼容性,也就意味著編譯生成的目標代碼可能存在差異。
我曾與業界大佬咨詢過這個問題,他的回答是:主版本跨度導致二進制兼容性遭受破壞的根本原因在于,JVM字節碼并不是特別為Scala而生的,而是專為Java量身定做。當Scala引入新的特性時,JVM并不會主動調整以支持這些新功能,因此Scala必須在編譯器生成的字節碼中實現,
另外,當呼聲極高的Java8集錦登場之際,Java和JVM攜手新增了諸多新功能,這些新功能需要改變 Scala的執行機制,以便更好地與Java8代碼相互融合,這也破壞了二進制兼容性。
但Scala3將引入一個特定的Scala的中間“字節碼”,這將允許不同的版本保持彼此的兼容性。
破案
Flink拋棄Scala的主要原因是因為,社區缺少Scala相關的人員,并且新的Api都是Java的,另外因為兼容性問題,Scala和JavaApi的發展并不同步。綜上,Flink拋棄Scala
為什么選擇Java作為Apache Flink的首選API
選擇Java作為Apache Flink的首選API,是因為Java提供了一個穩定可靠的平臺,適合大規模的計算和流處理。Java擁有豐富的庫和工具,可以幫助開發者更高效地實現各種計算邏輯。此外,Java的生態系統也非常龐大,包含了很多優秀的工具和庫,使開發者能夠更輕松地開發和維護Flink應用。Java的可移植性和跨平臺性也是其受歡迎的原因之一。無論開發者身處何地,他們都可以使用Java開發Flink應用,并且在不同的平臺上進行部署和運行。另外,Java社區的活躍程度也是不容忽視的,Java的開發者群體龐大且經驗豐富,他們可以為Flink提供寶貴的支持和指導,從而幫助用戶更好地使用和優化Flink的功能。總的來說,Apache Flink選擇使用Java API,是基于Java的穩定性、可移植性、生態系統、社區活躍度等方面的綜合考量