Flink 流批一体在 Shopee 的大规模实践

news2024/11/24 15:47:08

摘要:本文整理自 Shopee 研发专家李明昆,在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为四个部分:

    1. 流批一体在 Shopee 的应用场景

    2. 批处理能力的生产优化

    3. 与离线生态的完全集成

    4. 平台在流批一体上的建设和演进

Tips:点击「阅读原文」免费领取 5000CU*小时 Flink 云资源

01

流批一体在 Shopee 的应用场景

a9a1aeee3446b3ab3a1f489563d42084.jpeg

首先,先来了解一下 Flink 在 Shopee 的使用情况。

除了流任务,仅从支持的批任务来看,Flink 平台上的作业已经到达了一个比较大的规模。

目前 Flink 批任务已经在 Shopee 内部超过 60 个 Project 上使用,作业数量也超过了 1000,这些作业在调度系统的支持下,每天会生成超过 5000 个实例来支持各个业务线。

917f85efbf364c937f40c1ca89c923c4.jpeg

从应用场景划分,这些作业在 Shopee 主要分为以下四个部分:

  • 第一个应用场景是数据集成领域。

  • 第二个应用场景是数仓领域。

  • 第三个应用场景是特征工程,主要用于实时和离线特征的生成。

  • 第四个应用场景是风控反作弊领域,用做实时反作弊和离线反作弊。

e4a20656d1cfaf95cdf3964d9329c54a.jpeg

从 Shopee 内部的业务场景来看,数仓是一个流批一体发挥重要作用的领域。

目前,业内还没有这样一个端到端流式数仓的成熟解决方案,大部分都是通过一些纯流的方案 + 离线数仓方案 + 交互式查询方案叠加起来达到近似效果。

在这类 Lambda 架构中,Flink 流批一体主要带来的优势是实现计算统一。通过计算统一去降低用户的开发及维护成本,解决两套系统中计算逻辑和数据口径不一致的问题。

但这样的 Lambda 架构复杂性又太高了。所以针对时延要求不高的业务,Shopee 实时团队主推通过 Flink+ Hudi 的替代方案,构建近实时数仓,这种方案可以解决很多场景的问题。

这种方案的好处很明显,它实现了部分的流批一体:Flink 统一的引擎,Hudi 提供统一的存储。它的限制也很明显,Hudi 数据可见性与 Commit 的间隔相关,进而与 Flink 做 Checkpoint 的时间间隔相关,这延长了整个数据链路的时延。

目前这种 Flink+Hudi 的方案已经在 Shopee 内部很多业务线上进行使用。比如广告业务的 Deep ads.和 offline-platform ads.用于给广告主和产品运营产出广告数据。又比如 Shopee 核心业务 supply chain 的 WMS。WMS 的数据服务整体使用的是 lambda 架构。但对于核心业务使用该方案生成的近实时数据,用于与离线数据做 diff,监控实时链路提供的数据质量。

1688087c0e761eda11bece38b1d75b69.jpeg

上图 PPT 展示了 Datamart 的一个例子。Datamart 使用 Hudi partital update 完成 DIM 表的 Join 更新,降低资源使用量。

之前,他们每小时对最近 3 小时的数据进行计算和刷新,在保证数据及时更新的情况下,解决数据延迟、Join 时间不对齐等问题。但随着数据量的迅速增长,小时级数据 SLA 的保障难度和计算资源的消耗都在不断增加。

现在,用户一方面通过 Flink 加速计算,另一方面通过与批处理结合来确保数据的最终一致性。并通过提供分级的结果表来满足不同场景的及时性要求,实时计算产出的 Partial Update Hudi 表提供部分核心实时数据,批处理产出的 Multi-version Hudi 表提供完整且更准确的数据。

最终,在确保数据一致性的基础上,达到了分钟级延迟,并有效降低了计算资源的消耗。

5ac096e7897394a0b0092ef87622f4cf.jpeg

除了业务线使用之外,目前 Shopee 内部提供的一些平台服务也在使用 Flink。

第一个例子是 Data Infra 团队提供的 Data Hub, 它提供了一些离线集成和实时集成的常用模块。之前他们必须引入不同的引擎来支持不同的集成模块,导致项目依赖复杂,用户也需要了解多套引擎。

使用 Flink 后,在之后新的需求中,Data Hub 不再需要引入不同的引擎来解决批和流两套数据的集成。

69d89971842430f6e927445f6ecad759.jpeg

第二个例子是 Feature Station,Feature Station 是 Shopee 内部提供的一个 特征生成的平台。它提供了一些降低用户运维成本的功能,比如 Feature 生成 SQL 化,支持多业务线并行开发等等。

之前这个平台的任务依赖 Spark,后来从 Spark 全部迁移到了 Flink。Flink 带来的一个很大的优势是便于扩展。如果之后用户有实时特征需求,用户可以将离线特征的生成逻辑非常快速的复用到实时特征上。

上面介绍的都是 Shopee 内部流批一体应用场景的一些例子,我们内部还有很多团队也正在尝试 Flink 的流批一体,未来会使用的更广泛。

02

批处理能力的生产优化

Flink 在流处理方面一直有着天然的优势,相对而言,批的能力较弱一些。我们都能看到,社区最近几个版本中,一直在大力推进 Flink 批处理的能力。而对批支持的好坏也一直是用户选择 Flink 流批一体的一个重要影响因素。下面将基于内部的实践,我将介绍一下 Shopee 对 Flink 批在生产上的一些优化,主要分为稳定性和易用性两个方向。

2.1 稳定性

fe7dccd225469d55c945da906363b10c.jpeg

批作业一般都是通过调度系统周期性调度的。用户一般会管理大量的批作业,所以在生产实践中,他们非常关注作业的稳定性。

Flink Batch 在使用过程中,我们主要遇到了以下的问题:

  • 当大作业执行时间长时,任务越容易遇到各种问题,失败次数会显著增加。

  • Task 失败后 failover 的成本过高,作业的整体耗时会被严重拉长。

这样就形成了恶性循环,执行时间越长越容易失败,而失败又反向拉长了执行时间。这里的根本的问题是 Shuffle。

966e4464594b6c942086e4f4defa284c.jpeg

Flink 目前提供了两种 Shuffle,Hash Shuffle 和 Sort Shuffle,但这两种 Shuffle 的不同主要是表现在 Shuffle 数据的结构上,从 Shuffle 的整体架构上看,两者都是 Internal Shuffle。Internal Shuffle 就是 Shuffle 服务与 Task 共享进程,TaskManager 在 Task 执行完成之后还要继续保留去做 Shuffle 服务。

Internal Shuffle 的问题主要有两个:

第一个是:Shuffle 服务的稳定性会被有问题的 task 所影响。

  • 这个有问题 task 可能来自 job 本身,也可能是同机器的其他 job。在 Shopee 内部,Spark 与 Flink Batch 跑在相同的离线集群,所以也会受到其他类型离线任务的影响。同样,yarn 的稳定性也会影响 Flink batch 任务。

  • 按照现在的 failover 逻辑,TaskManager 无论是由于内部原因还是外部原因导致崩溃,Task 都会重跑,Shuffle 数据也都会丢失。尽管可能只是部分 Task 重跑,但因为我们目前使用的 1.15 没有推测执行,所以也会导致 Job 整体执行时间严重拉长。

76e04ce8736ded82134695df6c8fe706.jpeg

第二个是:当 Task 完成之后,由于 TaskManager 不能立刻被释放,还要提供 Shuffle 服务,这就导致 Yarn 必须维护 Task 执行完的 container,造成集群资源利用率不高。

08a3fc44e9d95d38664f2171303dd633.jpeg

针对 Internal Shuffle 的问题,其实业界也已经有了成熟的方案,那就是 Remote Shuffle。

上图中展示了两张架构图,一个是 Internal Shuffle,另一个是 Remote Shuffle,其实还有一个 external Shuffle,External Shuffle 就是把 Shuffle 服务拆分到另一个进程中。Spark 使用的 yarn auxilary external Shuffle,就是把 Shuffle 服务挪到了 Node Manager 里面,但是这还是存储跟计算混合在一起的架构。

所以我们选择一步到位,使用 Remote Shuffle。就是转门搭建一套 Shuffle 集群来提供 Shuffle 服务。

这种存储与计算分离的架构有以下几个好处:

  • 计算和存储再也不会相互影响。Shuffle 服务与用户的代码完全隔离。

  • 将 Shuffle 的工作转移到 Remote Shuffle 集群后,Task 执行完毕时,Task Manager 的资源可以立刻被释放。

  • 在这种架构下,计算跟资源解耦 了,我们可以自由的扩展或者收缩各自的资源量。

69aa5eec4ccfb760965f92812ed020cc.jpeg

业界有不少 Remote Shuffle 的方案,比如阿里云的 Celeborn,字节的 Cloud ShuffleService,另外还有 Uber Remote Shuffle Service,Splash 等等。但是这些 Remote Shuffle 大部分主要是为了支持 Spark,支持 Flink 的并不多,另外有一些只在内部版本中支持 Flink。

最后在选型的标准里面,我们主要考虑了项目本身的成熟度,社区对 Flink 的支持度,与 Flink 的匹配程度,最终还是采用了 Flink Remote Shuffle。

这个方案有几个好处:

  • Flink Remote Shuffle 是 Flink 的一个扩展项目,原生就是为了支持 Flink,社区的支持力度大,之后有了问题可以跟社区多交流。

  • 目前 Flink 的 Batch 正在快速发展,每个版本都有很大的变动和提高,比如 1.16 的 hybrid Shuffle 和推测执行,其他的 Remote Shuffle 不可能这么快速跟进。

虽然 Flink Remote Shuffle 也有缺点,但暂时可以忍受。另外 Remote Shuffle 其实是跟计算引擎分离的,等之后 Flink Batch 的特性稳定了,我们最终希望是离线能共用一套 Remote Shuffle service。

0089de0d2b2b1558ce50d01370b1ccf3.jpeg

在集群部署方案上,我们采取了跟 Presto 混部的方案。主要的考虑是为了充分的利用资源,Presto 和 Remote Shuffle 在资源使用上刚好互补。Remote Shuffle 本身是一个存储服务,它不怎么使用 CPU 和 memory,但会占用大量的磁盘。相反,Presto 会占用大量的 CPU 和 memory,磁盘使用量相对较少。

另外,从时间上看,Batch 任务更多的集中在晚上,交互式查询更多集中在白天,这也有利于资源复用。再就是为了避免相互影响,我们使用 Ggroup 来为两个服务提供资源限制和隔离。

5e50c7d7fce18a06493669dcf64bc94d.jpeg

最后,我们搭建了一个有 145 个节点的 Shuffle 集群,为线上的 Batch 任务提供 Shuffle 服务。其中每个节点使用一个 3TB 的 SSD 来保存数据,有效保证 Shuffle 数据的存取性能。

4eadcc377b57e4b0f09cb9a8c499df2b.jpeg

在集群搭建好之后,我们也在 Remote Shuffle Service 上做了一些测试和生产验证。从上图就可以看到效果。

从性能上看,相比 Hash Shuffle , Remote Shuffle 的性能提升了 19.3%, 相比 Sort Shuffle, 性能提升了 6.1%。

从稳定性上看,我们取了一个之前非常不稳定的 project。结果是 Task 失败率降低了超过 70%。

所以无论从性能还是稳定性,Remote Shuffle 都能带来很好的收益。

d450772aba10cace6787b2b13f652f7d.jpeg

当然,Remote Shuffle 这个项目也还有一些问题。

  • 网络环境的异常波动会导致 Shuffle 服务不稳定,表现出来主要是 ShuffleClient 与 ShuffleWorker 之间连接中断。这反映了一个问题,就是数据重传机制的缺失。

  • 另外就是没有多租户资源隔离机制,无论是带宽还是磁盘资源,目前都没有隔离机制,这会导致不同 Job 之间相互影响。

当然,这些问题也都在不断改进中,总的来看,Flink Remote Shuffle 对 Flink Batch 有很大的帮助。


2.2 易用性

73bf4ec0ac7a89ca54571e861d0b56ae.jpeg

除了上面针对 Shuffle 的优化之外,Shopee 也在易用性方面做了很多工作。大家都知道,对于流批一体,Flink SQL 为核心载体。在使用过程中,SQL 也存在一系列使用上的困难。

第一个问题是 SQL 任务有问题后,对于用户而言定位困难。之前我们的流任务主要依赖 web UI,没有 History Server。有了 History Server 之后,定位 Task 的问题得到了缓解。但是还有一个比较麻烦的事情,就是 SQL 任务经过 Planner 优化之后,执行计划与 SQL 结构上有了较大差异,用户使用过程中,经常很难根据 Task 信息定位到相关的 SQL 语句。

第二个问题是 SQL 配置困难。SQL 任务各 Task 之间资源使用经常不均衡,有的是 CPU 密集型,有的是内存密集型,很难通过统一的 TM 配置来解决。社区 SQL API 也并没有提供细粒度资源配置的接口。导致一些高级用户希望优化资源使用量时,SQL 任务的资源配置十分困难。

e3fb2fb651efc2f329ea01d9f610d174.jpeg


针对 SQL 问题分析定位的难点,我们做了两点优化:

  • 在用户提交 SQL 任务之前,展示作业的 streamgraph,让用户执行之前就能看到 SQL 的执行逻辑,以判断是否符合自己的预期。

  • 第二个优化就像上图中展示的一样,将执行节点转换成对应 SQL,让用户知道每个 Task 的对应的 SQL 段,帮助定位问题位置。

a2c895b5355259ddbb4d97c2dd281d3c.jpeg

另外,一些算子为了在不同的数据下有更好的性能,同一个算子会有多种实现方案,比如 join。一些用户在排查问题时,会关心优化器对 SQL operator 的具体实现逻辑。所以,除了展示每个 Task 的对应的 SQL 之外,我们还提供展示 SQL 算子对应生成的 Java code,以确定算子底层实现逻辑,辅助排查 SQL 故障。

294cdd7afc886ec1dfe9dfdf44cd1c41.jpeg

针对第二个 SQL 任务资源优化的问题,我们在展示 streamgraph 的基础上,允许为不同的 operator 配置不同的并发度,链接策略还有 slot group 等等。

ab1661eb9aadb70a0a657fed0d700214.jpeg

在资源配置上,我们并没有使用社区提供的 operator 级别的细粒度资源配置。主要有两个原因:

  • Slot 资源使用量用户很难监控,目前最多监控到 TM 粒度。这导致用户没有监控依据,无法准确预估每个 slot 的资源使用量。

  • 动态资源切割机制导致机器上出现大量碎片。

我们最后使用了自己开发的 SlotGroup 级别的资源配置,整体思路是不同的 SlotGroup 申请不同规格的 TM,Slot 依然是均分 TaskManager 的资源,但可以通过为不同的 Operator 设置不同的 SlotGroup,进而设置不同的资源量。

这种方案让用户可以很方便的依据 TaskManager 使用监控,定位到配置不合理的 SlotGroup 和 Operator, 进而调整 TM 资源配置,优化作业的整体资源利用率。

上图中的功能依赖于我们内部开发的“SlotGroup 粒度的资源调度”。

0760a477218a359de3e0d2c3a57a6573.jpeg

当然除了以上对 Batch 的优化之外,我们还进行很多其他的优化。比如复用 stream 模式下 compact 小文件的逻辑;调整容错机制, 支持 Batch SQL 的小文件 compact

还有就是 parquet 的 nested projection/filter pushdown;优化超过 64 位 GroupId 生成策略;优化 FileSourceCoodinator 创建逻辑等等。

这些优化都有效解决了生产过程中 Shopee 各个业务线遇的问题。

03

与离线生态的完全集成

在流批一体落地的过程中,用户最关心的就是技术架构的改动成本和潜在风险。作为 Flink 平台,面临的一个很重要的挑战就是如何兼容好用户已经广泛应用的离线批处理能力。所以第三部分主要介绍与离线生态的集成,主要涉及开发和执行两个层面的问题。

3.1 开发层面

12507d8da901061438ee3b270cbd5d66.jpeg

开发层面主要是复用的问题,复用的目的是为了降低用户的使用成本。由于很多用户已经在其他引擎上积累的大量的业务 UDF,所以我们提供的统一 UDF 来解决 UDF 复用的问题。

e748d367350469dae34e19f7f0483a6e.jpeg

统一 UDF 的目标是为了用户能在 Flink 平台上无缝访问各种 UDF。目前我们已经支持了很多类型的 UDF。

  • Flink 本身的 UDF,我们将很多 Flink build-in function 下放支持低版本。

  • 增加了一些 Shopee 内部常用的 UDF,用户也可以上传共享自定义的 UDF。

  • 针对其他引擎的 UDF,我们依赖 load module 支持了的 Hive UDF。对于 Spark build in 的 UDF,为了降低用户使用成本,我们也把大量常用的 Spark UDF 迁移到了 Flink。

  • 值得一提的是,我们团队目前已经支持了 SQL 语句中加入 Java 代码并解析成 UDF。上图中有个例子,之后我们还会支持 lambda 表达式等等,这将大大方便用户对 UDF 的使用。

4a334e66cde4d9a4bd272b9285604684.jpeg

除了复用 UDF 以外,我们还通过统一元数据来复用已经存在的离线数据模型。与其他各自已有的元数据管理一起,加上依赖 HDP scheme registry 构建的实时元数据,一起构建形成 Unity Catalog。

用户可以只通过 Unity Catalog 来访问底层不同的数据,在平台提供的 SQL IDE 中,可以十分方便的访问已有的 Catalog 和数据表。目前已经支持了 Kafka,Hive,Hudi, Redis, Hbase 这几个不同的数据类型。

3.2 执行层面

a7c3432eca64b2d6597491f3b973e821.jpeg

在执行层面,随着 Flink 能力的增强,用户希望 Flink SQL 批任务嵌入到当前的数据加工过程中,作为中间的一个环节。所以我们将 Flink Batch 接入了 Shopee 内部的统一调度平台 Data Scheduler。并且通过统一的数据 marker 服务来进行数据依赖。最终将 FlinkBatch 与已有的其他数据处理引擎打通,更好的服务用户。

85ec06a01b842e6ded0cbd22b42d9123.jpeg

另外,在离线领域,清晰的血缘是对数据进行追溯和影响分析的基础。当数据有了清晰的血缘和归属,系统中的数据就有了清晰的结构。

我们团队目前除了通过上一张 PPT 提到的数据 marker 来提供数据依赖关系之外,

还从 gragh 中抽取 Source,Sink,Lookup 的元数据信息,报告给 Datamap,以生成更完整的数据血缘。

当然除了离线数据的元数据之外, 我们也正在设计将实时数据的元数据整合到现有的数据血缘中,彻底将所有数据的归属打通。

04

平台在流批一体上的建设和演进

最后我想介绍一下我们 Flink 平台在流批一体上的建设和演进。其实在上面介绍中,已经展示了不少平台的功能。所以这一部分,我只会重点介绍一下平台对运维工具 History Server 的优化。

其实 Flink 流任务对 History Server 的需求并不大,因为流任务理论上一直在运行,我们可以用 web UI。但是对于批任务,History Server 却是一个非常有效的运维追溯工具。

4.1 HistoryServer 接入 Yarn 日志

2d0b693ed0ac797b4f5991ac75d931db.jpeg

首先我要宣传一下 1.16 的新特性:跳转外部 log。

虽然我们平台已经将用户的日志接入的 kibana,但是因为日志是混合的,所以查询的时候用户要先定位到 subTask,然后需要输入各种筛选条件查询,查询流程比较长,速度也比较慢。所以我们一直想优化这个流程,在最近发布的 1.16 中,支持了接入外部 log 的功能,我们针对日志较少的 Batch 任务,直接使用该特性跳转到 yarn 的 history log,十分方便查看问题 Task 的全量日志。

4.2 HistoryServer 小文件问题

7548c01367055affdf1ef9df7d8d4c01.jpeg

另外,History Server 还有一个小文件的问题。从上图左侧可以看到,History Server 将历史任务存储为大量 Json 小文件用于服务 Web UI。当只支持流任务的时候这个问题并不明显,但是随着我们平台支持批任务后,历史任务的数量剧增。

数量的上涨带来的几个问题:

  • 大拓扑,大并发的任务的解压对 History Server 服务产生压力。

  • 历史任务产生的大量文件对部署节点的文件系统产生大量存储开销。大量小文件导致单个 History Server 只能保存很短时间的历史任务。不然就会将单机的 inode 耗光。

  • History Server 目前重启后需要重新拉取历史 Job 信息并解压。

这些都给生产带来了问题。


4.3 HistoryServer 优化方案

8e373534b2be8a7b7bf1683b2fc7be2c.jpeg

所以我们对 History Server 整体架构做了优化,整体的思路是,只对需要的历史 Job 进行解压。

第一,是拆分拉取和解压两个功能,将原有的 Fetcher Executor 拆分成了 Fetcher Executor 和 Unzip Executor。Unzip Executor 专门处理 archivedJobFile 解压。

第二,增加 archivedJobs 目录存储压缩后的历史任务文件,从远端拉取的历史任务不立刻进行解压。而是当用户访问时增加一个解压任务进行解压。

这样就减少了 History Server 的工作量,降低了 History Server 的负载,也降低了部署节点的存储开销。这个方案在我们线上使用后,将存储开销降低了 90%以上,效果十分明显。

4.4 Flink 平台的演进

ed88b7f5b5a76e83de56f9d71ddeaa2e.jpeg

最后,简单介绍一下 Shopee Flink 平台支持批任务的发展过程。

我们内部支持 Flink 的批是从去年三季度开始的,到现在为止一年多。从改造平台支持 Batch,到并入离线生态,打通依赖和血缘,再到搭建 Remote Shuffle。有效的支撑起了 Shopee 各个业务线对 Flink 流批一体的需求。

整个落地过程中,最主要经验的是要站在用户的视角看待问题,合理地评估用户的改动成本以及收益,帮助用户找出业务迁移的潜在风险,降低用户使用的门槛。

未来规划主要还是在业务拓展方面。我们会加大 Flink 批任务的推广,探索更多流批一体的业务场景。同时跟社区一起,在合适的场景下,加速用户向 SQL 和流批一体的转型。

往期精选

462e5d4c7d70773ab51b5c2e3ceb07e9.png

a443164b2a0d07c819b80d6fa1b9d695.jpeg

a1650eaec8f17f1af27ddaa429766b1f.jpeg

2161aeb29a2089d5113ba3cfa515b17d.jpeg

e89b033d89dc55b3b667fefb99eaf5d5.jpeg


▼ 活动推荐▼

1f8311ac1025d4368d3a9ed4e52f504b.png

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

065342dc92596f6a56c1d4aa056db209.png

 d9b7a9f8389108c7653205776ad1654d.gif  点击「阅读原文」,免费领取 5000CU*小时 Flink 云资源

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

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

相关文章

华为OD机试 JavaScript 实现【扑克牌大小】【牛客练习题 HJ88】,附详细解题思路

一、题目描述 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王&#xff09…

JavaScript笔记——快速了解 ES6 新增数组方法,开箱即用(含案例)

文章目录 📋前言🎯Array.from()🎯Array.of()🎯Array.find()🎯Array.findIndex()🎯Array.includes()🎯Array.flat()🎯Array.flatMap()🎯Array.every()🎯Array.…

MQTT相关知识点

目录 一、简述 二、设计规范 三、MQTT协议原理 3.1 MQTT协议实现方式 3.2 网络传输与应用消息 3.3 MQTT客户端 3.4 MQTT服务器 3.5 MQTT协议中的订阅、主题、会话 3.6 MQTT协议中的方法 四.MQTT脑图 五.体验MQTT 搭建MQTT服务器(Broker) MQT…

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏

自己在学习工具栏的时候,做的笔记 1 实现基本工具栏 1.1 在Dlg.h文件中声明变量和定义资源ID #define ID_BUTTONS 501CToolBar m_toolbar; //工具栏 CImageList m_imageList; //工具栏图片 CImageList m_hotImageList; //工具栏热点图片 CReBar m_Rebar; //…

Jenkins安装以及部署

本文基于war包形式部署的 需要提前下载Jenkins的war包 Jenkins 的安装和设置下载内容 https://mirrors.jenkins.io/war 版本对应 目录 1.初始化环境 2.安装jdk 安装git Maven配置 安装Jenkins 使用DockerFile的方式进行部署 1.初始化环境 mkdir -p /home/soft 2.安装…

Python零基础入门(一)——Python简介与基础语法

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…

智慧食堂如何建造?手把手教你

智慧食堂是现代科技与餐饮行业相结合的创新应用。随着技术的不断发展,许多企业和机构正积极采用智慧收银系统来改进食堂管理和收银流程。 引入智慧收银系统不仅可以提高企业食堂的运营效率,降低错误率,还能为企业带来更多的商机和竞争优势。 …

开源客户沟通平台Chatwoot

什么是 Chatwoot ? Chatwoot 是一个开源客户沟通平台,可帮助公司在其网站、Facebook 页面、Twitter、Whatsapp、SMS、电子邮件等上吸引客户。 它是 Intercom、Zendesk、Salesforce Service Cloud 等的开源替代品。 很多网站的右侧或者右下角,…

中银国际在以太坊上发行代币化票据?三种可能,扑朔迷离!

* * * 原创:刘教链 * * * 号外:今天在“刘教链Pro”发表了一篇内参文章,《内参:对币本位高抛低吸策略的一点儿思考》(次条),以及一篇原创文章《他提案将SEC主席Gary Gensler撤职》(…

加速44%!RT-DETR量化无损压缩优秀实战

RT-DETR 模型是飞桨目标检测套件 PaddleDetection 最新发布的 SOTA 目标检测模型。其是一种基于 DETR 架构的端到端目标检测器,在速度和精度上均取得了 SOTA 性能。在实际部署中,为了追求“更准、更小、更快”的效率能力,本文使用飞桨模型压缩…

单元测试:构建可靠软件的关键步骤

点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 引言: 在当今快节奏的软件开发环境中,构建可靠的软件是至关重要的。单元测试作为软件开发过程中的关键步骤之一,能够帮助开发者发现…

006、体系结构之TiKV读取和Coprocessor

TiKV读取和Coprocessor 1、数据的读取1.1、ReadIndex Read1.2、Follower Read 协同处理器(Coprocessor) 1、数据的读取 1.1、ReadIndex Read 例如此时要读取 key 1 的内容,它不能直接去kv中读取,因为它是分布式的,它经过TiDB Server 收到读…

认识ASP.NET MVC的5种AuthorizationFilter

一、IAuthorizationFilter 所有的AuthorizationFilter实现了接口IAuthorizationFilter。如下面的代码片断所示,IAuthorizationFilter定义了一个OnAuthorization方法用于实现授权的操作。作为该方法的参数filterContext是一个表示授权上下文的AuthorizationContext对…

机器学习笔记 - 基于深度学习的多种目标跟踪检测框架简述

一、 目标跟踪 对象跟踪是执行一组初始对象检测的任务,为每个初始检测创建唯一的 ID,然后在每个对象在视频中的帧中移动时跟踪它们,从而维护 ID 分配。最先进的方法涉及融合来自RGB和基于事件的相机的数据,以产生更可靠的对象跟踪。仅使用RGB图像作为输入的基于CNN的模型也…

【JUC基础】17. 并发编程常见问题

目录 1、前言 2、上下文切换问题 2.1、什么是上下文切换 2.2、上下文切换过程 2.3、上下文切换的原因 2.4、上下文切换的开销和影响 2.5、注意事项和改进策略 3、死锁问题 3.1、什么是死锁 3.2、死锁示例 3.3、改进策略 4、竞态条件 5、内存可见性 6、小结 1、前言…

Hinton:我对“青蛙”创造出“人”这件事的后果很紧张丨全文整理+视频

假如青蛙创造了人,那现在是青蛙控制人类,还是人类控制青蛙?我不知道如何防止这种情况发生。我老了,希望像你们这样年轻而才华横溢的研究人员弄清楚如何拥有这些超级智能,并使我们的生活在不受超级智能控制的情况下变得…

Servlet+jsp+Layui图书管理系统

项目介绍 介绍 使用到了jsp,servlet,Mysql,Java,layui。 大致功能 关于用户: 登录,申请注册,查看搜索图书,查看有关用户的借阅记录,丢失记录,预借记录。对…

详解3DMAX室内建筑效果图的制作渲染过程

如果你并不了解室内、建筑效果图的制作渲染过程,本文将可能对你有一些帮助。 ​什么是 3DMax 渲染? 渲染是利用3dmax软件创建与原始建筑设计或模型精确的 3D 图片的技术。最终效果图在逼真度、精度、细节和真实性方面准确地反映了真实材料和光线。具有经验和专业知识的室内…

Elastic 8.8 版引入了全新的 Learned Sparse Encoder 模型,并宣布正式推出合成监测

作者:Brian Bergholm 2023年5月25日 今天,我们非常高兴地宣布 Elastic 8.8 版正式发布。 新增功能 Elastic 企业搜索可帮助开发人员利用 Elasticsearch 实现强大的现代搜索和发现体验。 请在 “Elastic 企业搜索亮点” 博文或 8.8 版发行说明中&#…

HarmonyOS学习路之开发篇—Java UI框架(TableLayout)

TableLayout TableLayout使用表格的方式划分子组件。 支持的XML属性 TableLayout的共有XML属性继承自:Component TableLayout的自有XML属性见下表: 属性名称 中文描述 取值 取值说明 使用案例 alignment_type 对齐方式 align_edges 表示TableL…