当前位置: 首页 > news >正文

为什么 Flink 抛弃了 Scala

曾经红遍一时的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的稳定性、可移植性、生态系统、社区活跃度等方面的综合考量

相关文章:

  • 2023年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题
  • C++:一文读懂智能指针
  • js修改浏览器地址栏里url的方法
  • python -opencv 中值滤波 ,均值滤波,高斯滤波实战
  • 汽车电子 -- 根据DBC解析CAN报文
  • 电力感知边缘计算网关产品设计方案-网关系统通信架构方案
  • 生产环境出现问题,测试人如何做工作复盘?
  • 最重要的BI测试-适用于任何BI和分析平台
  • 看完就会,从抓包到接口测试的全过程解析【1500字保姆级教程】
  • 2023亚太地区数学建模C题思路分析+模型+代码+论文
  • Excel换不了行怎么解决?
  • 蓝桥杯物联网竞赛_STM32L071_2_继电器控制
  • Django框架之中间件
  • 自动化测试中几种常见验证码的处理方式及如何实现?
  • 中国上市公司漂绿程度及其同构指数(多种测算方法,2012-2022年)
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Brief introduction of how to 'Call, Apply and Bind'
  • ERLANG 网工修炼笔记 ---- UDP
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • gitlab-ci配置详解(一)
  • Js基础知识(一) - 变量
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MYSQL 的 IF 函数
  • Rancher-k8s加速安装文档
  • vue学习系列(二)vue-cli
  • 对超线程几个不同角度的解释
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 容器镜像
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (九)信息融合方式简介
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)Linq学习笔记
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 服务 ServiceController
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET与 java通用的3DES加密解密方法
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .skip() 和 .only() 的使用
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • [ Linux ] Linux信号概述 信号的产生
  • [《百万宝贝》观后]To be or not to be?
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android] Implementation vs API dependency
  • [Android学习笔记]ScrollView的使用
  • [Asp.net mvc]国际化
  • [Bugku]密码???[writeup]