快手 Flink 的稳定性和功能性扩展

news2024/12/23 4:06:10

摘要:本文整理自快手技术专家刘建刚,在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分:

    1. 快手 Flink 平台

    2. 稳定性保障和智能运维

    3. 复杂场景下的功能扩展

    4. 批处理的定制优化

Tips:点击「阅读原文」查看原文视频&演讲 ppt

01

快手 Flink 平台

1.1 计算平台架构

d3bb12bec90c06aba807f1de6f5c1b8b.jpeg

如上图所示,Flink 主要运行在 Yarn 和 K8s 上,存储组件使用 HDFS 和快手自研的 kwaistore。在 Runtime 层,同时支持流处理和批处理。在用户结构层,主要包括 Data Stream 和 SQL。最上面一层是快手的作业管理平台,包括前端和后端。

ff0f3fa008b84271bf237494f22b7ac3.jpeg

基于 Flink 计算生态,周边组件囊括万千。既有 Kafka、RocketMQ等中间件,又有 Clickhouse、Druid 等 OLAP 分析,还有 Hudi、Hive 等存储层。最外层是应用场景,涵盖了音视频、商业化、数据工厂、湖仓一体等应用场景。

1.2 架构演进

b362e2be94d41c1922fd1a5d47a51e34.jpeg

架构演进

  • 在 2018 年~2019 年,我们搭建了实时计算平台,在 Data Stream、SQL 计算、大状态存储等方面,为用户提供生产可用的功能。

  • 在 2020 年~2021 年,我们对 SQL 进行了进一步的优化和推广,对 Flink Runtime 进行了深度改造。

  • 在 2021 年~2022 年,我们开始探索流批一体。与此同时,在稳定性和功能性方面,进行了深度改造。

  • 未来,我们会探索更加智能的流批融合,进一步丰富计算生态。

1.3 未来规划

15ead5181e11698f87319bab8a1087f2.jpeg

上图是未来规划的大一统架构。从用户的角度来看,不再需要关心流和批,以及复杂的流批配置。对用户暴露的将是简单的资源延迟和吞吐配置,底层计算引擎会根据这些配置智能执行。

Flink 将作为统一的计算层,为用户暴露统一的 SQL 和 Data Stream API。统一的调度器,会解决用户的资源调度和算子调度。增量和全量计算对应用户的延迟要求。如果用户希望尽快得到结果,可以使用更短的增量触发。

在批处理方面,我们希望能在 Streaming 内核的基础上,达到业界领先。除此之外,Shuffle 对用户的吞吐至关重要。我们希望能够在 Pipeline 和 Blocking 之间智能切换,实现最大的吞吐。

在流批的智能切换和无缝融合方面,需要在性能和平滑过渡上多做一些工作,为用户屏蔽具体的细节。在存储层通过统一的管理,为用户展现一致的 Table 表。

02

稳定性保障和智能运维

2.1 自动迁移

d5ad9e45acc5a5dffea94323c5a7a77c.jpeg

稳定性保障和智能运维。由于我们经常会遇到机器下线、队列下线、集群下线的情况。此时,如果让用户自己迁移作业会非常麻烦,主要有三个方面。

  • 机器下线是常态化的事情,会频繁干扰用户。

  • 当涉及的用户作业数较多,手动操作非常繁琐。

  • 沟通成本较大,会浪费大量的时间。

035120aff8d1006c20454265c8801739.jpeg

如上图所示,先来看一下单作业的自动迁移。对于用户来说,只需要配置 AutoMigrate 参数即可,该参数可以配置三个值。

  • Normal 值表示自动驱逐 Container 并恢复。

  • Exactly-Once 表示 stop-with-savepoint 并恢复。

  • Manual 表示通知用户 Dealine 前手动处理,否则自动处理。

当用户配置完参数,Flink 平台会在机器下线时,自动帮助用户操作。主要分成以下四步。

  • 第一步,将下线的机器标记为不再调度。

  • 第二步,找到对应的 Flink 作业。

  • 第三步,按照用户的配置,进行自动化迁移。

  • 第四步,当所有作业都迁移完后,机器就可以正式下线。

8f63ff2c4f756c667e76ed80d0daeaed.jpeg

除了单作业的自动迁移,我们还具备集群迁移的经验。集群迁移的复杂性主要体现在以下三点。

  • Flink 及其上下游的数据一致性很难得到保证。

  • 上千个作业,操作复杂,稳定性难以保障。

  • 用户众多,沟通运维成本极高。

为此我们开发了一套自动化迁移程序。如上图所示,单个作业会在新集群,自动拷贝一个新作业。然后,通过 stop-with-savepoint 停止老作业,在新集群启动新作业。在启动时,我们会跨集群读取老作业的 Savepoint。除此之外,我们会通过各项指标检查作业的健康度。一旦出现问题,立刻回滚。

涉及集群操作时,我们会进行批量的灰度操作。如右图所示,我们通过批量的灰度,操作这些作业。一旦出现问题,会立刻回滚,并且告知用户尽快介入。

148069da0693b214a7ab7c69ea717047.jpeg

为了保证上下游 Kafka 数据的一致性,Flink 针对 Kafka 进行了深度改造和适配。在消费端,Kafka 会 Mirror 最近一段数据到新集群,确保 Offset 和数据都一样,Flink 自动切换到新集群消费。

在产出端,Kafka 也会自动 Mirror 数据到新集群,当 Flink 自动切换后,新数据会写到新集群,确保 Offset 和数据一致。

2.2 故障归因

66f4cc87584ef4b345acbcfed3af521d.jpeg

故障归因主要讨论不确定性的硬件故障,主要有以下三点。

  • 磁盘故障,比如磁盘坏道、内核故障等引起的读写卡顿问题。

  • 内存故障,比如部分数据脏写、gc 频繁等。

  • 网络故障,比如网卡异常导致无法连接等问题。

这些问题的共性是,导致作业卡顿或者表现异常,但又不是彻底的失败,定位非常困难,甚至无法查出问题所在。当规模比较大时,这种问题会频繁出现。

7a41d3f34596b27580f75ea14a38ef6a.jpeg

接下来,介绍一下应对方案。我们的应对方案主要包括以下四点。

  • 自动拉黑。既包括在作业粒度,将机器拉黑。也包括在平台维度,将一个机器彻底拉黑。

  • 智能归因。我们会监控 Flink 算子的异常 Task,比如某个 Task 的延迟、吞吐、快照等有明显异常。我们会把它迅速拉黑。

  • 人工快速识别。当我们怀疑一批机器有问题时,会快速计算共同的机器,并进行指标分析。一旦确定异常,立刻拉黑。

  • 建立实施故障指标库。虽然离线计算能够容忍很多机器问题,但实时计算不能容忍。我们需要识别这些 Case,并且快速的处理,防止作业出现问题后处理。

918ad092e429626563e53a37c9f2133f.jpeg

故障归因。故障归因的目的是,将人工运维的经验,沉淀到自动化程序里,进一步解放开发人员、运维人员和使用人员。主要分为作业失败和作业性能两个诊断。

在作业失败方面,查询单个用户作业失败的原因时,首先去 ES 获取作业失败的原因。如果是用户的问题,直接返回给用户。如果是心跳超时,去 Yarn 查询 Host 和 Container 的存活性,然后再去 metric 系统查询是否 gc 等信息。

如果是其他问题,先看一下是否在系统诊断库里,如果是就可用直接返回。如果不是,直接给用户返回异常。与此同时,人工会排查原因,并把它加入诊断库。

bb8b5ab888945de212e45036c09edf0d.jpeg

作业性能问题的排查。首先,进行宽泛检查。比如资源是否打满,数据是否倾斜。然后,找到第一个有问题的 Task。如果这个作业有快照,我们就会找到第一个快照失败的 Task。

如果没有快照,我们会递归查询反压,并根据 Task 的 Input Queue 来判断它是不是第一个出现问题的 Task。

如果确定了第一个出现问题的 Task,会为用户返回资源、线程等相关信息,辅助用户确定根本原因。

2.3 分级保障

c3d0072d054844d3f6c631657378a440.jpeg

分级保障。分级保障是指给予不同优先级作业,不同的保障级别,其背景如下。

  • 在资源紧张的情况下,我们会优先保障高优的作业。

  • 我们会为高优的作业提供平台化的保障措施,比如热备、冷备等方案。

  • 我们会根据优先级统筹规划,提高整个集群的利用率。

如上图所示,我们为作业划分了四个等级,其中 P0 为双 AZ 容灾(热备)、P1 为双 AZ 容灾(冷备)、P2 表示单集群常规作业、P3 表示不重要的作业资源,随时可能被抢占。

344d9977a1db98f86f24014523fc8f89.jpeg

下面重点介绍一下冷备方案和抢占方案。Flink 的冷备方案既支持 Flink 冷备,也支持 Kafka AZ 容灾,主要指消费两个同名的 Topic 和写出两个同名的 Topic。同名 Topic 在不同的 AZ 下,两个同名的 Topic 共同组成一份完整的数据。

这时如果上游的一个 Kafka 集群挂掉,Flink 会自动容灾,并推动 watermark 的前进,整个作业不受影响。Flink 在常规情况下,通过轮转写的方式,将数据写到下游的两个 Topic。如果一个 Topic 挂掉,数据会全部导到另一个 Topic。

针对 Flink 作业,我们会定期将快照写到备集群。一旦作业管理平台监测到 Flink 所在的 AZ 挂掉,会自动在备集群拉起一个一样的 Flink 作业。

未来,我们将实现 HDFS、Kafka 的双 AZ 部署,到时它们会自动 AZ 容灾并为 Flink 呈现逻辑视图。

d0fcbe064c2781154031404f10b64849.jpeg

资源不足时的抢占方案。抢占策略主要有三点。

  • 高优作业抢占低优作业资源。

  • 优先抢占不健康的作业,比如 lag 严重的作业。

  • 实时作业会优先抢占同一个作业的资源。

右图展示了我们的抢占效果。作业通过改造,在资源不足时,也能启动。

cfb1ae41c5c14fe030af0dde78c4692d.jpeg

常见的保障措施,主要包括以下四点:

  • 资源隔离。高优作业可以单独划定队列,实现物理隔离,同时不与离线作业混部。

  • 资源抢占。在资源紧张情况下,高优作业可自动抢占低优作业的资源。

  • AZ 容灾。高优作业可实现 AZ 容灾,包括冷备和热备。

  • 智能监控报警。高优作业配套的报警更加完善,一旦出现预期之外的问题可快速人工介入。

03

复杂场景下的功能扩展

3.1 弹性伸缩

9590f75911ad61026d0e40ccecb78772.jpeg

在复杂场景下的功能性扩展。这里主要讲三个部分,即弹性伸缩、Remote Shuffle Service、云盘存储。接下来,来看下弹性伸缩的背景。

  • 第一,Flink 作业当前的静态资源分配一般都是按照最高峰申请的,导致了其他时间段的资源,大量浪费。

  • 第二,PerJob 模式调整并发度慢,需要停止作业、修改并发度、启动作业等繁琐流程。

  • 第三,用户不知道该配置多少资源,有的延迟严重、有的资源浪费严重,带来了各种运维问题。

基于以上背景,我们开发了更轻量级的弹性伸缩方案,用户或者平台决定好并发度后,直接发给 Flink 作业,Flink 作业在不停止作业的情况下快速完成调整。

a95245ef1699e18c726cecab57f64d75.jpeg

先来看一下整体的架构实现,用户可以直接触发扩缩容或者配置扩缩容的条件。比如当 CPU 或 IO 超过多少之后,进行调整。AutoController 作为自动控制的组件,会根据用户的配置,自动完成作业的弹性伸缩,比如根据 metric 自动触发调整。

在 Flink 内部,我们实现了快速 rescale 的接口。伸缩原理如下,如果是扩容,会提前申请资源,然后将并发度持久化到 ZK 里,来防止 Master Failover,然后重新生成执行图。在停止时,默认使用 stop-with-savepoint。

0f29942ef546c3b9c1087ea6363861f0.jpeg

弹性伸缩的效果。扩缩容时间,常规聚合作业从分钟级别降低到 10s 左右,常规 ETL 作业 3s 内可完成调整。通过平台调整,作业资源占有量显著下降,可以有效整顿集群的资源利用率。将用户从作业资源调整的繁琐运维中解放出来,极大地减少了人工运维工作。

3.2 Remote Shuffle Service

56e2786509583e8c0317cfb78782e420.jpeg

Remote Shuffle Service。Flink 由 TaskManager 来管理 Shuffle 数据,计算和存储耦合,存在以下问题:

  • 一旦 TaskManager 挂掉就会造成 Shuffle 数据丢失,存在重跑整个任务的风险。

  • 空闲 TaskManager 因为 Shuffle 数据的存在而无法退出,导致资源浪费。

  • Shuffle 代价大,无论是网络连接、还是磁盘读取,开销都比较大。

374c57c31adfd042789cb0b0c046914c.jpeg

快手内部自研的 Shuffle Service 主要采用 Master slave 架构。接下来,介绍一下 Flink 和 Shuffle Service。Flink 的 StreamShuffleMaster 负责跟 Shuffle Service 的 ShuffleManager 交互。

Task 的 Reader 和 Writer 通过心跳从 StreamShuffleMaster 处获取读写地址,将数据读写到 Shuffle Service。Shuffle 数据会持久化到 HDFS,防止数据丢失。

f838bf5ca94122f6df71c6f8c6bd4ad3.jpeg

数据交互流程。针对上下游的交互,中间数据以 ReducePartition 的形式存在。Shuffle Service 负责将上游 Task 的数据聚合到一块,下游 Task 到时候只需要一对一的顺序读取即可。Shuffle Service 在网络和磁盘方面做了很多的优化,确保了整个 Stage 的快速数据传递。

6f0f08db2978ddce310dafee6b82e292.jpeg

我们的 Shuffle Service 支持多种传输模式,包括 AII to all、Point-wise、Broadcast。

其中,All to all,指的是上游每个 Task 将数据轮询发送到下游。Point-wise,指的是上下游按照倍数关系来映射,这样会减少连接的个数。Broadcast 指的是上游的一个 Task,将全量数据分别发送到每个下游的 Task。

3.3 云盘存储

e86e776a475214fec9bb9c7c46ad2c6d.jpeg

云盘。快手自研的系统支持 Flink 的状态存储到远程的共享云盘。如上图所示,相关背景主要有三点。

  • 存储和计算资源的不对等或者不匹配,决定了存算分离这一大趋势,二者可以独立开发和维护。

  • Flink 作业经常受磁盘故障的影响,单盘故障不可避免。

  • 快手未来的机器会逐渐下掉本地盘,全部采用远程存储的方式。

1ba73e1445d52d858e8136b37d562745.jpeg

云盘存储的实现,对于用户来使用很简单,只需要配置是否使用云盘即可。如果用户使用云盘,我们将 Flink 作业调度到支持云盘的机器上,Flink 会像使用本地盘一样使用云盘,操作非常简单。由于云盘的数据是持久化的,所以我们可以直接使用云盘的数据,不需要将快照写到 HDFS 等地方。

04

批处理的定制优化

4.1 准确性

f3bcabd3343d834d9a976d5911030ade.jpeg

快手批处理的定制优化,从准确性、稳定性、应用性三个方面解开展开介绍。在准确性方面,主要通过双跑来验证。首先,选取一批无外部访问、无随机性的线上 SQL。

然后,针对单个线上 Hive 作业,自动调度一个 Flink 镜像作业并读取数据源并写到测试表。最后,基于 Hash 算法验证数据的一致性。这种方法还会被用来跑回归测试,确保新增功能不影响数据的正确性。

4.2 稳定性

3779d45b76023a8d703d4bdb5e519ab3.jpeg

在稳定性方面,快手首先提出并解决了所有批处理都会遇到的三个关键性问题。

  • Remote Shuffle Service。我们通过存算分离,避免 Container 挂掉后,从头恢复的问题。

  • 推测执行。主要通过通过镜像 Task 解决离线复杂环境下的长尾问题。

  • Adaptive scheduler。我们可以根据数据量自动决定算子的并发度,避免人工反复调整。

5c9b15a4f11193264a8682697ff3d32d.jpeg

针对离线作业,前面专门开发了自动 Failover 机制。相关背景如上图所示,我们的离线环境非常的复杂,主要体现在以下三点。

  • 高优作业抢占低优作业严重。

  • 磁盘压力大,文件出现问题的概率也大。

  • 网络吞吐大,网卡被打满的现象时有发生。

自动 Failover 机制会自动识别异常。如果是平台引起的,会帮助用户自动容灾。如果是用户的错误,会按照正常配置的 Failover 策略走。除此之外,我们的 Failover 机制是可插拔的,目前涵盖了抢占磁盘故障、网络故障等常见的平台问题,这些故障会自动帮助用户恢复作业。

0583f6934dec5edb540d87b45bcdde79.jpeg

Client 和 Job 的存活一致性。在应用场景里,客户端承载着更新作业进度、获取结果、检查作业存活等重要任务。所以我们必须确保客户端和 Flink 作业的存活一致性。

当 Job 挂掉时,Client 快速感知失败并退出。当 Client 挂掉时,Job 能快速退出,防止成为孤儿作业。

为此我们在 Client 和 job 之间建立了心跳机制,来确保二者的存活一致性,确保了任何极端情况下都能相互感知。这种机制可以应对各种极端 Case,比如 Kill -9。

4.3 易用性

de16d044b4c5d0a8f98590200a94f2db.jpeg

易用性的改造。首先,支持远程文件加载。比如通过-C 加载远程的 classpath。其次,通过 SQL 加载远程的 Udf,使用方法是通过 Add jar remoteUdf 加载远程文件,极大的扩展了 Flink 的使用范围,为大一统的 Flink 计算,打下了坚实的基础。

633b940f731d739ddb95ec3ddc9ce202.jpeg

接下来,介绍下 Web 智能路由和日志查看。虽然我们的离线环境非常多,但我们通过智能路由,帮助用户屏蔽了这些细节。用户可以直接由客户端,自动跳转到对应的集群和作业。

除此之外,日志查看对用户的 Debug 非常管用。用户通过平台,可以快速跳转查看各种各样的日志。最后,当日志结束作业,我们也支持一键跳转到 History Server。

往期精选

01aac7267da5104e2500ca6e2b28c46c.png

545f9ae0dd22cdf8a29c56806fbacad8.jpeg

f53894565de057570241e5ec9ff0ae4b.jpeg

53bfced34c73bc503c0e3f914f9325a8.jpeg

351bb3111334c299cc06382755a5dc4a.jpeg


▼ 活动推荐▼

73a88657e4650418c1c4d619e4fee423.png

▼ 关注「Apache Flink」,获取更多技术干货 ▼

1629e96f1a94dfa752e66d4c20e14bfd.png

 c47afd7729d079f27aafc17ab31eb548.gif  点击「阅读原文」,查看原文视频&演讲 PPT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven添加指定仓库和镜像

maven历史版本下载地址:https://archive.apache.org/dist/maven/maven-3/ maven版本和java版本的关系:https://maven.apache.org/docs/history.html 项目中添加仓库 有两种方式 1.在pom.xml中添加(优先级高) 2.在setting.xml中添…

【已解决】-Mac/Mac mini/Macbook上修改鼠标指针大小

问题: MacOS默认的鼠标指针太小了,平时很容易找不到在哪里。 解决办法: 在 Mac 上,点击苹果菜单 >“系统偏好设置”,然后点按“辅助功能” 。 点击“显示”,然后点击“指针”。 设定以下任一选项…

【SQL】Oracle实现远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle,是甲骨文公司的一款关系…

CDN和Web加速器之间的区别

在数字时代,网站、社交媒体、电子商务、内容流平台和超个性化网络体验激增。因此,需要实时可靠地为最终用户提供大量生成的内容,而不会出现延迟或崩溃,无论其位置、网络、设备或浏览器如何。为此,使用CDN和web加速器就…

【模电实验】运算放大器构成的温度闭环控制系统的研究

运算放大器构成的温度闭环控制系统的研究 —、实验目的 设计并连接运算放大器构成的温度闭环控制系统,测量并调试该闭环控制系统,初步形成闭环控制的概念。 二、温度闭环控制系统的工作原理 图1所示为温度闭环控制系统框图,各部分工作原理…

vue3中setup语法糖那些事儿

vue3中setup语法糖那些事儿 什么是语法糖&#xff1f;vue3相比于vue2有什么新的语法糖?refreactivewatch生命周期Teleport setup语法糖<script setup>与传统vue3有何不同传统vue3和setup语法糖&#xff0c;两者之间写法如何转换&#xff1f; 什么是语法糖&#xff1f; …

NodeJs性能分析工具

&#xff08;头等人&#xff0c;有本事&#xff0c;没脾气&#xff1b;二等人&#xff0c;有本事&#xff0c;有脾气&#xff1b;末等人&#xff0c;没本事&#xff0c;大脾气。——南怀瑾&#xff09; NodeJs内存分析的必要性 回顾过去&#xff0c;我们排查web应用问题的途径…

EasyRecovery16计算机电脑硬盘格式化数据恢复软件

EasyRecovery16是一款综合性的数据恢复工具&#xff0c;软件具备非常成熟的算法&#xff0c;适用于多种数据丢失情况&#xff0c;可以帮助用户快速恢复不同介质丢失的数据。easyrcovery软件共有三种版本&#xff0c;分别为个人版、专业版、企业版。这三种版本的软件都可以免费使…

市场类型与完全竞争市场

短期完全竞争市场 区分市场类型的几条标准&#xff1a; 生产者的数量商品的同质性&#xff08;差异化程度&#xff09;进出市场的障碍信息是否完全 市场类型&#xff1a; 完全垄断寡头垄断垄断性竞争完全竞争 完全竞争市场的特征&#xff1a; 企业&#xff1a;数目多&…

Python学习41:文本分析(1)——统计文件中的字符

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ open(name[, mode[, bufferi…

MySQL了解之复制(一)

1.1、复制解决的问题 数据复制技术有以下一些特点&#xff1a; (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错 1.2、复制如何工作 从高层来看&#xff0c;复制分成三步&#xff1a; (1) master将改变记录到二进制…

第二十六章 开发Productions - ObjectScript Productions - 定义业务流程

文章目录 第二十六章 开发Productions - ObjectScript Productions - 定义业务流程介绍业务逻辑工具的比较 第二十六章 开发Productions - ObjectScript Productions - 定义业务流程 业务流程负责生产中的更高级别处理。本页介绍它们并讨论如何设计和开发业务流程类。 介绍 …

三分钟快速了解什么是MES系统

近年来在制造业的推动下&#xff0c;大家是否会经常听到MES系统这一词&#xff0c;但是对于其具体能解决什么问题却不是很清晰。接下来&#xff0c;请允许我用一个简单的故事来让大家快速地了解一下到底什么是MES系统以及MES系统能够解决什么问题。本文仅限于科普&#xff0c;没…

STM32F103xx 的USART1 移植到STM32F105RBT6

1. STM32F103 和 STM32F105 的时钟配置区别&#xff0c;STM32F105 默认使用的外部晶振是25Mhz&#xff0c;需要改成8Mhz stm32f10x.h #if !defined HSE_VALUE#ifdef STM32F10X_CL#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz …

初学Mybatis

1、Mybatis概述 Mybatis基于java的持久层框架&#xff0c;内部封装了JDBC&#xff0c;开发者只需要关注SQL语句 特点 1、sql语句在xml里&#xff0c;便于统一管理和优化 2、解除sql与程序代码耦合&#xff1a;通过DAO层&#xff0c;将业务逻辑和数据访问逻辑分离 提供映射标签&…

Spark简介和三种部署方式

1.Spark简介 1.1 Spark介绍 开源集群计算系统&#xff0c;致力于更快的处理数据 Both fast to run and fast to wrtie Spark 是专为大规模数据处理而设计的快速通用的计算引擎 Spark 可以完成各种运算&#xff0c;包括 SQL 查询、文本处理、机器学习等 Spark由Scala语言开发&a…

【618期间】超过200小时的课程全都有优惠,全年最好的加入有三AI学习的时间来了~...

正值2023年618期间&#xff0c;既然是全民购物节&#xff0c;有三AI所有付费的视频课程开启优惠活动&#xff0c;即日起至节日结束&#xff08;6月18日晚23:59&#xff09;。 当前已有课程包括数据使用/模型分析/图像分类/图像分割/目标检测/图像生成/图像翻译/图像增强/视频分…

Promise.allSettled使用

1、const apiList await Promise.allSettled([systemApi]).then((result: any) > { if (result[0].status fulfilled) { console.log(result[0].value) return result[0].value.data } }) console.log(apiList, apiList) 2、 const systemApi new Promise((resolve, rej…

Selenium Webdriver原理、架构过往今生

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 简介 Selenium是一种流行的自动化测试工具…

[深度学习入门案例2]基于卷积神经网络与Keras构建人脸识别模型

文章目录 一、工具与环境 二、深度学习环境的搭建 三、基于卷积神经网络人脸识别模型的构建与测试 1.核心代码 第一步&#xff1a;采集自己和他人的人脸特征数据&#xff0c;分别对应数据标签0和1 第二步&#xff1a;训练识别人脸特征的模型&#xff0c;并将模型保存为.h5…