为什么 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的稳定性、可移植性、生态系统、社区活跃度等方面的综合考量
相关文章:
为什么 Flink 抛弃了 Scala
曾经红遍一时的Scala 想当初Spark横空出世之后,Scala简直就是语言界的一颗璀璨新星,惹得大家纷纷侧目,连Kafka这类技术框架也选择用Scala语言进行开发重构。 可如今,Flink竟然公开宣布弃用Scala 在Flink1.18的官方文档里&#x…...
scala 实现表达式解析
表达式解析 import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource "source_1"private val saleChannel "saleChannel"val datas new mutable.HashMap[String, String]();// p1, source1, sale1, source…...
分布式事务seata的AT模式介绍
分布式事务seata的AT模式介绍 seata是阿里开源的一款分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,本文主要介绍AT模式的使用。 seata安装 下载seata服务,官方地址…...
初识Linux(1),看了这篇文章,妈妈再也不用担心我Linux找不到门了。
文章目录 前言1. ls 指令例如:只显示文件名属性ls显示文件详细属性 ls - l 该操作可以简写成ll查看隐藏文件ls -l -a 2.pwd例如:显示当前目录所处的路径类似于windows如下操作: 3.cd 指令例如:改变工作目录相当于windows如下操作 4.whoami 指…...
甲烷产生及氧化
温室气体排放被认为是加速气候变化的重要因素,甲烷(CH4)是仅次于二氧化碳(CO2)的重要温室气体,其百年温室效应潜势是CO2的28倍[1-2]。湿地中的CH4由产甲烷古菌在水体底部或沉积层严格厌氧环境下产生并释放进入水体,产生的CH4向上覆水运输过程…...
Javascript的form表单校验输入框
以下是HTML代码: <form name"myForm" onsubmit"return validateForm()"><label for"name">姓名:</label><input type"text" id"name" name"name"><br><l…...
大数据-之LibrA数据库系统告警处理(ALM-37003 GTM主备不同步或者GTM主备断连)
告警解释 当GTM主实例与GTM备实例连接异常或者GTM主实例未处于同步状态时,产生该告警。 告警属性 告警ID 告警级别 可自动清除 37003 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产…...
python每日一题——4移动0
题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0]…...
CAN实验
CAN 寄存器 HAL库函数 代码 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率:36000 / [(9 8 1) * 4] 500Kbps …...
(一)pytest自动化测试框架之生成测试报告(mac系统)
前言 我们可以通过pytest-html插件来生成测试报告,但是pytest-html插件生成的测试报告不够美观,逼格也不够高,通过allure生成的测试报告是比较美观的,花里胡哨的,能够提升一个level。 allure官网: Allure…...
微服务实战系列之Nginx
前言 Nginx?写了那么多文章,为什么今天才轮到它的表演?那是因为它实在太重要了,值得大书特书,特别对待。 当我们遇到单点瓶颈,第一个idea是?Nginx; 当我们需要反向代理,…...
使用rsync从OpenShift的pod复制文件
环境 Red Hat Enterprise Linux release 8.6 (Ootpa)OCP 4.12.22 准备 安装rsync: yum install rsync 查看pod: [rootapi.kai1123.cp.fyre.ibm.com ~]# oc get pod -n cpd-instance | grep dmc ...... ibm-dmc-1700727413211000-monitor-0 …...
解决Activiti5.22流程图部署在Windows上正常,但在linux上部署后出现中文变方块的问题
总结/朱季谦 楼主最近在做公司的工作流平台,发现一个很无语的事情,Activiti5.22的流程图在Windows环境上部署,是可以正常查看的,但发布到公司的Linux服务器上后,在上面进行流程图在线部署时,发现中文都变成…...
EMG肌肉电信号处理合集(三)
本文主要展示常见的肌电信号预处理的实现,开发环境为matlab。 目录 1 肌电信号低通,高通,带通滤波 2 去除DC 0阶偏置,1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通…...
GitHub桌面版
GitHub桌面版 一、GitHub 桌面版二、clone 仓库三、更新仓库 一、GitHub 桌面版 二、clone 仓库 三、更新仓库...
【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界
在这个充满科技魅力的时代,我们可以通过各种方式去了解和探索自然界的奥秘。而昆虫作为地球上最为丰富多样的生物群体之一,其独特的生活习性和形态特征一直吸引着人们的目光。 由广州华锐互动开发的昆虫3D虚拟动态展示系统,成为了一种全新的科…...
《QT从基础到进阶·三十六》QWidget实现收缩栏的效果
功能: 1、可以在收缩栏插件中添加界面 2、可以把界面展开或收缩 3、可以用鼠标拖动界面改变界面的排放顺序 源码放在最下方 1、可以在收缩栏插件中添加界面 virtual void addWidget(QWidget* widget, const QString& label, const QIcon& icon QIcon())…...
运行软件报错找不到vcruntime140.dll无法继续执行代码怎么办-6个解决方法
vcruntime140.dll是一个由Microsoft Visual C提供的运行时库文件,它为许多Microsoft Visual Studio开发的应用程序提供了必要的支持。这个文件对于许多Windows应用程序的正常运行至关重要。然而,有时会出现vcruntime140.dll缺失的问题,导致应…...
从Discord的做法中学习 — 使用Golang进行请求合并
正如你可能之前看到的,Discord去年发布了一篇有价值的文章,讨论了他们成功存储了数万亿条消息。虽然有很多关于这篇文章的YouTube视频和文章,但我认为这篇文章中一个名为“数据服务为数据服务”的部分没有得到足够的关注。在这篇文章中&#…...
【教3妹学编程-算法题】统计和小于目标的下标对数目
2哥 : 3妹,OpenAI的宫斗剧迎来了大结局!OpenAI宣布阿尔特曼复职CEO,董事会重组 3妹:啊?到底谁才是幕后操纵者啊,有咩有揪出来 2哥 : 也不是很清楚,据说在被开除的几周前,前CEO曾谴责…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
