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

flink状态与容错-1.13

1. 版本说明

本文档内容基于 flink-1.13.x,其他版本的整理,请查看本人博客的 flink 专栏其他文章。

2. Checkpoint

2.1. 概述

Checkpoint 使 Flink 的状态具有良好的容错性,通过 checkpoint 机制,Flink 可以对作业的状态和计算位置进行恢复。

参考 Checkpointing 查看如何在 Flink 程序中开启和配置 checkpoint。

2.2. Checkpoint存储

当开启 checkpointing 时,管理的状态会被持久化以保证在任务失败时进行一致性恢复,checkpointing 期间的状态持久化位置取决于选择的 checkpoint 存储。

2.3. 可用的Checkpoint存储选项

flink 捆绑了这些开箱即用的 checkpoint 存储类型:

  • JobManagerCheckpointStorage
  • FileSystemCheckpointStorage

如果配置了 checkpoint 目录,则会使用 FileSystemCheckpointStorage,否则系统将会使用 JobManagerCheckpointStorage

2.3.1. JobManagerCheckpointStorage

JobManagerCheckpointStorage 会将 checkpoint 快照存储到 JobManager 的内存中。

可以配置在 checkpoint 使用的内存超过了指定大小时,使 checkpoint 失败,以避免 JobManager 抛出 OutOfMemoryError,为了设置该特性,用户可以实例化一个 JobManagerCheckpointStorage,并指定最大 size:

new JobManagerCheckpointStorage(MAX_MEM_STATE_SIZE);

JobManagerCheckpointStorage 的限制:

  • 每个状态的大小默认限制为 5MB,该值可以通过 JobManagerCheckpointStorage 的构造器来设置。
  • 和配置的最大状态大小无关,状态不能超过 Akka 框架的大小(查看 Configuration)
  • 聚合状态必须适合 JobManager 内存。

JobManagerCheckpointStorage 建议用于:

  • 本地开发和调试。
  • job 使用很小的状态,比如只包含实时处理数据的函数(Map、FlatMap、Filter、…), Kafka 消费者只需要很小的状态。

2.3.2. FileSystemCheckpointStorage

FileSystemCheckpointStorage 需要配置一个文件系统 URL(type、address、path),比如:“hdfs://namenode:40010/flink/checkpoints” 或 “file:///data/flink/checkpoints”。

在 checkpointing 时,他会将状态该快照写入到配置的文件系统和路径的文件中,少量元数据将会被存储到 JobManager 的内存中,如果是高可用模式,则存储到元数据 checkpoint 中。

如果指定了 checkpoint 目录,FileSystemCheckpointStorage 将会被用于持久化 checkpoint 快照。

FileSystemCheckpointStorage 建议用于:

  • 所有高可用设置

同时也建议设置 managed memory 为 0,该设置会确保在 JVM 上分配最大数量的内存给用户代码。

2.4. 保留Checkpoint

Checkpoint 在默认情况下仅用于恢复失败的作业,并不会保留,当程序取消时 checkpoint 就会被删除。当然,你可以通过配置来保留 checkpoint,这些被保留的 checkpoint 在作业失败或取消时不会被清除。如此一来,你就可以使用该 checkpoint 来恢复失败的作业了。

CheckpointConfig config = env.getCheckpointConfig();
config.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

ExternalizedCheckpointCleanup 配置项定义了当作业取消时,对作业 checkpoint 的操作:

  • ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION:当作业取消时,保留作业的 checkpoint。注意,在这种情况下,需要手动清除该作业保留的 checkpoint。
  • ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION:当作业取消时,删除作业的 checkpoint。仅当作业失败时,作业的 checkpoint 才会被保留。

2.4.1. 目录结构

与 savepoints 相似,checkpoint 由元数据文件和数据文件(与状态后端相关)组成。可通过配置文件中的 “state.checkpoints.dir” 配置项来指定元数据文件和数据文件的存储路径,另外也可以在代码中针对单个作业指定该配置项。

当前的 checkpoint 目录结构如下所示:

/user-defined-checkpoint-dir/{job-id}|+ --shared/+ --taskowned/+ --chk-1/+ --chk-2/+ --chk-3/...        

其中 SHARED 目录保存了会被多个 checkpoint 引用的文件,TASKOWNED 保存了不会被 JobManager 删除的文件,EXCLUSIVE 则保存那些仅被单个 checkpoint 引用的文件。

注意: Checkpoint 目录不是公共 API 的一部分,因此可能会在未来的发版中进行改变。

2.4.1.1. 通过配置文件设置全局配置

state.checkpoints.dir: hdfs:///checkpoints/

2.4.1.2. 对单个job配置checkpoint

env.setStateBackend(new RocksDBStateBackend("hdfs:///checkpoints-data/"));

2.4.1.3. 配置checkpoint存储实例

另外,可以通过指定预期的 checkpoint 存储实例来设置 checkpoint 存储,该实例允许设置底层配置,比如写入缓存大小。

env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("hdfs:///checkpoints-data/", FILE_SIZE_THESHOLD));

2.4.2. Checkpoint与 Savepoint区别

Checkpoint 与 savepoints 有一些区别,体现在 checkpoint :

  • 使用状态后端特定的数据格式,可能以增量方式存储。
  • 不支持 Flink 的特定功能,比如扩缩容。

2.4.3. 从保留的checkpoint中恢复状态

与 savepoint 一样,作业可以从 checkpoint 的元数据文件恢复运行(savepoint恢复指南)。注意,如果元数据文件中信息不充分,则 jobmanager 还需要使用相关的数据文件来恢复作业(参考目录结构)。

$ bin/flink run -s :checkpointMetaDataPath [:runArgs]

2.4.4. 非对齐checkpoints

从 Flink 1.11 开始,可以使用非对齐 checkpoint了。非对齐 checkpoints 包含还未处理的数据(比如存储在缓存中的数据),会将其作为 checkpoint 状态的一部分,该行为可以让 checkpoint barriers 追上这些缓存。如此一来,checkpint 的持续时间就不会受到当前吞吐量的影响了,因为 checkpoint barriers 不再有效的嵌入到数据流中了。

当由于过高的反压导致 checkpoint 持续时间很长时,就可以使用非对齐 checkpoit 了,之后,checkpoint 的时间就不会受到端到端延迟的影响了。注意,非对齐 checkpoint 会增加状态后端的 I/O,因此,在 I/O 是 checkpoint 期间使用状态后端的瓶颈时,就不应该使用非对齐 checkpoint 了。

注意,非对齐 checkpoint 目前是新特性,并且有以下限制:

  • Flink 目前不支持并行非对齐 checkpoint,但是 checkpoint 是可预测的,并且时间一般较短,因此可能也不需要并行 checkpoint。然而,savepoint 不能和非对齐 checkpoint 同事进行,因此 savepoint 会执行较长时间。
  • 非对齐 checkpoint 会在恢复期间对水印进行隐式保证。

目前,Flink 会在恢复的第一步就生成水印,而不是将算子中最新水印保存起来,以减少状态大小。使用非对齐 checkpoint 进行恢复时,Flink 会在恢复完还未处理的数据后生成水印。如果你的 pipeline 中使用需要接收每个数据最新水印的操作的话,这将会产出和非对齐 checkpoint 不同的结果。如果你的操作取决于永远可用的最新水印,则解决方案为将水印存储到算子状态中。为了支持减少大小,水印应该存储到合并状态的每个 key-group 中。我们很可能会将此方法作为通用解决方案使用(在 Flink 1.11.0 中未成功)。

启用非对齐 checkpoint 后,你也可以通过 CheckpointConfig.setAlignmentTimeout(Duration)execution.checkpointing.alignment-timeout 在配置文件中指定对齐超时时间。指定超时时间之后,每个 checkpoint 刚开始任然是对齐的 checkpoint,但是如果某些子任务的对齐时间超过了该超时时间,就会变成非对齐 checkpoint。

3. Savepoint

3.1. 概念以及与checkpoint的不同

Savepoint 是依据 Flink checkpointing 机制所创建的流作业执行状态的一致镜像。你可以使用 Savepoint 进行 Flink 作业的停止与重启、克隆或更新。 Savepoint 由两部分组成:稳定存储(比如 HDFS,S3,…) 上包含二进制文件的目录(通常很大)和元数据文件(相对较小)。稳定存储上的文件表示作业执行状态的数据镜像。Savepoint 的元数据文件主要包含以相对路径的形式指向稳定存储上所有文件的指针。

注意: 为了允许程序和 Flink 版本之间的升级,请务必查看以下有关分配算子 ID 的部分 。

从概念上讲, Flink 的 Savepoint 与 Checkpoint 的不同之处类似于传统数据库中的备份与恢复日志之间的差异。 Checkpoint 的主要目的是为意外失败的作业提供恢复机制。 Checkpoint 的生命周期由 Flink 管理,即 Flink 创建,管理和删除 Checkpoint,无需用户交互。作为一种恢复和定期触发的方法,Checkpoint 实现有两个设计目标:

  1. 轻量级创建
  2. 尽可能快地恢复。

可能会利用某些特定的属性来达到这个,例如, 工作代码在执行尝试之间不会改变。 在用户终止作业后,通常会删除 Checkpoint(除非明确配置为保留的 Checkpoint)。

与此相反、Savepoint 由用户创建,拥有和删除。 他们的用例是计划的,手动备份和恢复。 例如,升级 Flink 版本,调整用户逻辑,改变并行度,以及进行红蓝部署等。 当然,Savepoint 必须在作业停止后继续存在。 从概念上讲,Savepoint 的生成和恢复成本可能更高一些,Savepoint 更多地关注可移植性以及对作业更改的支持。

Flink 对所有的状态后端使用了统一的二进制格式,这意味着你可以使用过一种状态后端触发 savepoint,然后使用另一种状态后端来恢复作业。

在 1.13 版本之前,状态后端是没有统一的格式的,因此,如果你想切换作业使用的状态后端,你应该先升级你的 Flink 版本,然后使用新版本触发一个 savepoint,只有做完这些之后,你才能使用另一种状态后端来恢复作业。

3.2. 分配算子ID

强烈建议你按照本节所述调整你的程序,以便将来能够升级你的程序。主要是通过 uid(String) 方法手动指定算子 ID ,这些 ID 将用于恢复每个算子的状态。

DataStream<String> stream = env.
State backends did not start producing a common format until version 1.13.addSource(new StatefulSource()).uid("source-id") // source 算子的 ID.shuffle()// 有状态的 mapper 算子的 ID.map(new StatefulMapper()).uid("mapper-id") // 指定 mapper 算子的 ID// 无状态的 printing sink.print(); // 自动生成 ID

如果不手动指定 ID ,则会自动生成 ID 。只要这些 ID 不变,就可以从 Savepoint 自动恢复。生成的 ID 取决于程序的结构,并且对程序更改很敏感。因此,强烈建议手动分配这些 ID 。

3.2.1. Savepoint状态

你可以将 Savepoint 想象为对每个有状态的算子都保存一个“算子 ID ->状态”的映射:

Operator ID | State
------------+------------------------
source-id   | State of StatefulSource
mapper-id   | State of StatefulMapper

在上面的示例中,print sink 是无状态的,因此不是 Savepoint 状态的一部分。默认情况下,我们会尝试将 Savepoint 的每个 entry 都映射到新程序。

3.3. 算子

你可以使用命令行客户端来触发 Savepoint触发 Savepoint 并取消作业从 Savepoint 恢复,以及删除 Savepoint

从 Flink 1.2.0 开始,还可以使用 webui 从 Savepoint 恢复

3.3.1. 触发Savepoint

在触发 Savepoint 时,会创建一个新的 Savepoint 目录,用来存储数据和元数据。可以通过配置默认目标目录或使用命令来指定目标目录(参见:targetDirectory参数)来控制该目录的位置。

**注意:**目标目录必须是 JobManager(s) 和 TaskManager(s) 都可以访问的位置,例如分布式文件系统(或对象存储系统)上的位置。

FsStateBackendRocksDBStateBackend 为例:

# Savepoint 目标目录
/savepoint/# Savepoint 目录
/savepoint/savepoint-:shortjobid-:savepointid/# Savepoint 文件包含 Checkpoint元数据
/savepoint/savepoint-:shortjobid-:savepointid/_metadata# Savepoint 状态
/savepoint/savepoint-:shortjobid-:savepointid/...

从 1.11.0 开始,你可以通过移动(拷贝)savepoint 目录到任何地方,然后再进行恢复。

如下两种情况不支持 savepoint 目录的移动:

  1. 启用了 entropy injection:在这种情况下,savepoint 目录就不会包含所有的数据文件了,因为注入的路径会分散在各个路径中。由于缺乏一个共同的根目录,所以 savepoint 会包含绝对路径,从而导致无法支持 savepoint 目录的迁移。
  2. 作业包含 task-owned state(比如 GenericWriteAhreadLog sink)。

和 savepoint 不同,checkpoint 不支持随意移动文件,因为 checkpoint 可能包含一些文件的绝对路径。

如果你使用了 MemoryStateBackend ,则 metadata 和 savepoint 的数据都会保存在 _metadata 文件中,因此不要因为看到目录下没有数据文件而感到困惑。

注意: 不建议移动或删除正在运行作业的最后一个 Savepoint ,这可能会干扰故障恢复。因此,Savepoint 对精确一次的接收器有副作用,为了确保精确一次的语义,如果在最后一个 Savepoint 之后没有 Checkpoint ,则会使用 Savepoint 进行恢复。

3.3.1.1. 触发 Savepoint

$ bin/flink savepoint :jobId [:targetDirectory]

这将触发 ID 为 :jobId 的作业的 Savepoint,并返回创建的 Savepoint 路径。 你需要此路径来还原和删除 Savepoint 。

3.3.1.2. 使用 YARN 触发 Savepoint

$ bin/flink savepoint :jobId [:targetDirectory] -yid :yarnAppId

这将触发 ID 为 :jobId 和 YARN 应用程序 ID 为 :yarnAppId 的作业的 Savepoint,并返回创建的 Savepoint 的路径。

3.3.1.3. 使用 Savepoint 停止作业

$ bin/flink stop -s [:targetDirectory] :jobId

这将自动触发 ID 为 :jobid 的作业的 Savepoint,并停止该作业。此外,你也可以指定一个目标文件系统目录来存储 Savepoint 。该目录需要能被 JobManager(s) 和 TaskManager(s) 访问。

3.3.2. 从 Savepoint 恢复

$ bin/flink run -s :savepointPath [:runArgs]

这将提交作业并指定 Savepoint 路径。你可以指定 Savepoint 目录或 _metadata 文件的路径。

3.3.2.1. 跳过无法映射的状态恢复

默认情况下,恢复操作会尝试将 Savepoint 的所有状态映射回你要还原的程序。如果新程序删除了算子,则可以通过 --allowNonRestoredState(短命令:-n)选项跳过无法映射到新程序的状态:

$ bin/flink run -s :savepointPath -n [:runArgs]

3.3.3. 删除 Savepoint

$ bin/flink savepoint -d :savepointPath

这将删除存储在 :savepointPath 路径中的 Savepoint。

请注意,还可以通过常规文件系统操作手动删除 Savepoint ,而不会影响其他 Savepoint 或 Checkpoint(请记住,每个 Savepoint 都是自包含的)。在 Flink 1.2 之前,执行上面的 Savepoint 命令是一个很啰嗦的任务。

3.3.4. 配置

你可以通过 state.savepoints.dir 配置 savepoint 的默认目录,触发 savepoint 时,将使用此目录来存储 savepoint。可以使用触发命令指定自定义目录来覆盖缺省值(请参阅:targetDirectory参数)。

flink-conf.yaml

# 默认的 savepoint 目录
state.savepoints.dir: hdfs:///flink/savepoints

Java

env.setDefaultSavepointDir("hdfs:///flink/savepoints");

Scala

env.setDefaultSavepointDir("hdfs:///flink/savepoints")

如果既未配置缺省值也未指定自定义目目录,则触发 Savepoint 的操作将会失败。

**注意:**目标目录必须是 JobManager(s) 和 TaskManager(s) 可访问的位置,例如分布式文件系统上的位置。

3.4. F.A.Q

  1. 需要为所有算子分配 ID 吗

根据经验,是的。严格来说,只需要通过 uid 方法给有状态算子分配 ID 就足够了。Savepoint 仅包含这些有状态算子的状态,无状态算子不是 Savepoint 的一部分。

在实践中,建议给所有算子分配 ID,因为 Flink 的一些内置算子(如 Window 算子)也是有状态的,而内置算子是否有状态并不很明显。如果你完全确定某个算子是无状态的,则可以不调用 uid 方法。

  1. 如果我在作业中添加一个需要状态的新算子,会发生什么

当你向作业添加新算子时,它将在没有任何状态的情况下进行初始化。 Savepoint 包含了每个有状态算子的状态,无状态算子根本不是 Savepoint 的一部分。新算子相当于无状态算子。

  1. 如果从作业中删除有状态的算子会发生什么

默认情况下,从 Savepoint 恢复时会尝试将所有状态分配给新作业。如果有状态算子被删除,则无法从 Savepoint 恢复。

你可以通过使用 run 命令设置 --allowNonRestoredState (简称:-n )来允许删除有状态算子:

$ bin/flink run -s :savepointPath -n [:runArgs]
  1. 如果我在作业中重新排序了有状态算子,会发生什么

如果给这些算子分配了 ID,它们将会像往常一样恢复。

如果没有分配 ID ,则有状态算子自动生成的 ID 很可能在重新排序后发生更改。这将导致你无法从之前的 Savepoint 恢复。

  1. 如果我添加、删除或重新排序作业中没有状态的算子,会发生什么

如果将 ID 分配给有状态算子,则无状态算子不会影响 Savepoint 恢复。

如果没有分配 ID ,则有状态算子自动生成的 ID 很可能在重新排序后发生更改。这将导致你无法从以前的Savepoint 恢复。

  1. 当我在恢复时改变程序的并行度时会发生什么

如果 Savepoint 是用 Flink >= 1.2.0 触发的,并且没有使用像 Checkpointed 这样的不推荐的状态 API,那么你可以简单地从 Savepoint 恢复程序并指定新的并行度。

如果你正在从 Flink < 1.2.0 触发的 Savepoint 恢复,或者使用现在已经废弃的 api,那么你首先必须将作业和 Savepoint 迁移到 Flink >= 1.2.0,然后才能更改并行度。参见升级作业和Flink版本指南。

  1. 我可以将 savepoint 文件移动到稳定存储上吗

这个问题的答案目前是“是”,从 Flink 1.11.0 版本开始,savepoint 是自包含的,你可以按需迁移 savepoint 文件后进行恢复。

4. 状态后端

用 Data Stream API 编写的程序通常会以各种形式保存状态:

  • 在 Window 触发之前要么收集元素、要么执行聚合
  • 转换函数可以使用 key/value 格式的状态接口来存储状态
  • 转换函数可以实现 CheckpointedFunction 接口,使函数的本地变量具有容错能力

另请参阅 Streaming API 指南中的 状态部分 。

在启动 CheckPoint 机制时,状态会随着 CheckPoint 而持久化,以防止数据丢失、保障恢复时的一致性。状态内部的存储格式、状态在 CheckPoint 时如何持久化以及持久化在哪里均取决于选择的 State Backend

4.1. 可用的状态后端

Flink 内置了以下这些开箱即用的 state backends :

  • HashMapStateBackend
  • EmbeddedRocksDBStateBackend

如果不设置,则默认使用 HashMapStateBackend。

4.1.1. HashMapStateBackend

HashMapStateBackend 内部,数据以 Java 对象的形式存储在堆中。 Key/value 形式的状态和窗口算子会持有一个 hash table,其中存储着状态值、触发器。

HashMapStateBackend 的适用场景:

  • 有较大 state,较长 window 和较大 key/value 状态的 Job。
  • 所有的高可用场景。

建议同时将 managed memory 设为 0,以保证最大限度的将内存分配给 JVM 上的用户代码。

4.1.2. EmbeddedRocksDBStateBackend

EmbeddedRocksDBStateBackend 会将正在运行中的状态数据保存在 RocksDB 数据库中,RocksDB 数据库默认将数据存储在 TaskManager 的数据目录。不同于 HashMapStateBackend 中的 java 对象,数据以序列化字节数组的方式存储,这种方式由序列化器决定,因此 key 之间的比较是以字节序的形式进行而不是使用 Java 的 hashCodeequals() 方法。

EmbeddedRocksDBStateBackend 会使用异步的方式生成 snapshots。

EmbeddedRocksDBStateBackend 的局限:

  • 由于 RocksDB 的 JNI API 构建在 byte[] 数据结构之上, 所以每个 key 和 value 最大支持 2^31 个字节。 RocksDB 合并操作的状态(例如:ListState)累积数据量大小可以超过 2^31 字节,但是会在下一次获取数据时失败。这是当前 RocksDB JNI 的限制。

EmbeddedRocksDBStateBackend 的适用场景:

  • 状态非常大、窗口非常长、key/value 状态非常大的 Job。
  • 所有高可用的场景。

注意,你可以保留的状态大小仅受磁盘空间的限制。与状态存储在内存中的 HashMapStateBackend 相比,EmbeddedRocksDBStateBackend 允许存储非常大的状态。 然而,这也意味着使用 EmbeddedRocksDBStateBackend 将会降低应用程序的最大吞吐量。所有的读写都必须进行序列化、反序列化操作,这个要比基于堆内存的状态后端的效率低很多。

请同时参考 Task Executor 内存配置 中关于 EmbeddedRocksDBStateBackend 的建议。

EmbeddedRocksDBStateBackend 是目前唯一支持增量 CheckPoint 的状态后端(见 这里)。

flink 允许获取一些 RocksDB 的本地指标(metrics),默认是关闭的。你能在 这里 找到关于 RocksDB 本地指标的文档。

每个 slot 中的 RocksDB 实例的内存大小是有限制的,详情请见 这里。

4.2. 选择合适的状态后端

在选择 HashMapStateBackendRocksDB 的时候,其实就是在性能与可扩展性之间的权衡。HashMapStateBackend 是非常快的,因为每个状态的读取和算子对于对象的更新都是在 Java 的 heap 上进行的,但状态的大小受限于集群中可用的内存。另一方面,RocksDB 可以根据可用的磁盘空间扩展,并且只有它支持增量快照。然而,每个状态的读取和更新都需要序列化和反序列化,而且在 disk 上进行读操作的性能可能要比基于内存的状态后端慢一个数量级。

在 Flink 1.13 版本中我们统一了 savepoints 的二进制格式。这意味着你可以生成 savepoint 并且之后使用另一种状态后端读取它。从 1.13 版本开始,所有的状态后端都会生成一种普遍适用的格式。因此,如果想切换状态后端的话,最好先升级你的 Flink 版本,在新版本中生成 savepoint,在这之后你才可以使用另一个不同的状态后端来读取并恢复它。

4.2.1. 设置状态后端

如果没有明确指定,将使用 jobmanager 做为默认的状态后端。你能在 flink-conf.yaml 中为所有 Job 设置其他默认的状态后端。每一个 Job 的状态后端配置都会覆盖默认的状态后端配置,如下所示。

4.2.1.1. 设置每个 Job 的状态后端

StreamExecutionEnvironment 可以对每个 Job 的状态后端进行设置,如下所示:

Java

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new HashMapStateBackend());

Scala

val env = StreamExecutionEnvironment.getExecutionEnvironment()
env.setStateBackend(new HashMapStateBackend())

如果你想在 IDE 中使用 EmbeddedRocksDBStateBackend,或者需要在作业中通过编程方式进行动态配置,必须将以下依赖添加到 Flink 项目中。

<dependency><groupId>org.apache.flink</groupId><artifactId>flink-statebackend-rocksdb_2.11</artifactId><version>1.13.6</version><scope>provided</scope>
</dependency>

注意: 由于 RocksDB 是 Flink 默认分发包的一部分,所以如果你没在代码中使用 RocksDB,则不需要添加此依赖。而且可以在 flink-conf.yaml 文件中通过 state.backend 配置状态后端,以及更多的 checkpointing 和 RocksDB 特定的 参数。

4.2.1.2. 设置默认的全局状态后端

flink-conf.yaml 可以通过键 state.backend 设置默认的状态后端。

可选值包括 jobmanager (HashMapStateBackend), rocksdb (EmbeddedRocksDBStateBackend), 或使用实现了状态后端工厂 StateBackendFactory 的类的全限定类名,例如: EmbeddedRocksDBStateBackend 对应为 org.apache.flink.contrib.streaming.state.EmbeddedRocksDBStateBackendFactory

state.checkpoints.dir 选项指定所有状态后端写 CheckPoint 数据和元数据文件的目录。你能在 这里 可以找到关于 CheckPoint 目录结构的详细信息。

配置文件的部分示例如下所示:

# 用于存储 operator state 快照的 State Backend
state.backend: filesystem# 存储快照的目录
state.checkpoints.dir: hdfs://namenode:40010/flink/checkpoints

4.3. RocksDB状态后端进阶

该小节描述 RocksDB 状态后端的更多细节。

4.3.1. 增量快照

RocksDB 支持增量快照。不同于产生一个包含所有数据的全量备份,增量快照中只包含自上一次快照完成之后被修改的记录,因此可以显著减少快照完成的耗时。

增量快照是基于(通常是多个)前序快照构建的。由于 RocksDB 内部的压缩机制会对 sst 文件进行合并,所以 Flink 的增量快照也会定期压缩,因此增量 checkpoint 历史不会一直增长,旧快照包含的文件也会逐渐过期并被自动清理。

和基于全量快照的恢复时间相比,如果网络带宽成为瓶颈,则基于增量快照恢复可能会消耗更多时间,因为增量快照包含的 sst 文件之间可能存在数据重叠导致需要下载的数据量变大;而当 CPU 或 IO 是瓶颈的时候,基于增量快照的恢复会更快,因为从增量快照恢复并不需要解析 Flink 的统一快照格式来重建本地的 RocksDB 数据表,而是直接基于 sst 文件进行加载。

虽然状态很大时我们推荐使用增量快照,但这并不是默认的快照机制,需要通过下述配置手动开启该功能:

  • flink-conf.yaml 中设置:state.backend.incremental: true 或者
  • 在代码中按照右侧配置方式以覆盖默认配置:EmbeddedRocksDBStateBackend backend = new EmbeddedRocksDBStateBackend(true);

需要注意的是,一旦启用了增量快照,网页上展示的 Checkpointed Data Size 就只代表增量上传的数据量了,而不是一次快照的完整数据量。

4.3.2. 内存管理

Flink 致力于控制整个进程的内存消耗,以确保 Flink TaskManager 有良好的内存使用,从而既不会在容器(Docker/Kubernetes, Yarn等)环境中由于内存超用被杀掉,也不会因为内存利用率过低导致不必要的数据落盘或是缓存命中率下降,从而致使性能下降。

为了达到上述目标,Flink 默认将 RocksDB 的可用内存配置为 TaskManager 的单槽(per-slot)托管内存量。这将为大多数应用程序提供良好的开箱即用的体验,即大多数应用程序不需要调整 RocksDB 配置,简单的增加 Flink 的托管内存即可改善内存相关性能问题。

当然,也可以选择不使用 Flink 自带的内存管理,而是手动为 RocksDB 的每个列族(ColumnFamily)分配内存(每个算子的每个状态都对应一个列族)。这为专业用户提供了对 RocksDB 进行更细粒度控制的途径,但同时也意味着用户需要自行保证总内存消耗不会超过(尤其是容器)环境的限制。请参阅 大状态调优 了解有关大状态数据性能调优的一些指导原则。

RocksDB 使用托管内存

这个功能是默认打开的,并且可以通过 state.backend.rocksdb.memory.managed 配置项控制。

Flink 并不直接控制 RocksDB 的本地内存分配,而是通过配置 RocksDB 来确保其使用的内存正好与 Flink 的预算托管内存相同。这是在任务槽(per-slot)级别上完成的(托管内存以任务槽为粒度计算)。

为了设置 RocksDB 实例的总内存使用量,Flink 对同一个任务槽上的所有 RocksDB 实例使用共享缓存以及写入缓存管理器。 共享缓存将对 RocksDB 中内存消耗的三个主要来源(块缓存、索引和布隆过滤器、MemTables)设置上限。

Flink 还提供了两个参数来控制写路径(MemTable)和读路径(索引及过滤器,读缓存)之间的内存分配。当你遇到 RocksDB 由于缺少写缓冲内存(频繁刷新)或读缓存未命中而导致性能不佳时,可以使用这些参数调整读写间的内存分配。

  • state.backend.rocksdb.memory.write-buffer-ratio,默认值 0.5,即 50% 的给定内存会分配给写缓冲区使用。
  • state.backend.rocksdb.memory.high-prio-pool-ratio,默认值 0.1,即 10% 的快缓存内存会优先分配给索引及过滤器。我们强烈建议不要将此值设置为零,以防止索引和过滤器被频繁踢出缓存而导致性能问题。此外,我们默认将 L0 级的过滤器和索引固定到缓存中以提高性能,更多详细信息请参阅 RocksDB 文档。

注意:上述机制开启时将覆盖用户在 PredefinedOptionsRocksDBOptionsFactory 中对快缓存和写缓存进行的配置。

注意仅面向专业用户:若要手动控制内存,可以将 state.backend.rocksdb.memory.managed 设置为 false,并通过 ColumnFamilyOptions 配置 RocksDB。或者可以复用上述 缓存/写入缓存管理器 机制,将内存大小设置为与 Flink 的托管内存大小无关的固定大小(通过 state.backend.rocksdb.memory.fixed-per-slot 选项)。 注意在这两种情况下,用户都需要确保在 JVM 之外有足够的内存可供 RocksDB 使用。

4.3.3. 定时器(内存 vs.RocksDB)

定时器(Timer)用于执行定时操作(基于事件时间或处理时间),例如触发窗口或回调 ProcessFunction

当选择 RocksDB 作为状态后端时,默认情况下定时器也存储在 RocksDB 中。这是一种健壮且可扩展的方式,允许应用程序使用很多个定时器。另一方面,在 RocksDB 中维护定时器会有一定的成本,因此 Flink 也提供了将定时器存储在 JVM 堆上而使用 RocksDB 存储其他状态的选项。当定时器数量较少时,基于堆的定时器会有更好的性能。

可以通过将 state.backend.rocksdb.timer-service.factory 配置项设置为 heap 而不是默认的 rocksdb 来将定时器存储在堆上。

注意:在 RocksDB 状态后端中使用基于堆的定时器的组合当前不支持定时器状态的异步快照。其他状态(如 keyed state)可以进行异步快照。

当使用基于 java heap 的定时器的 RocksDB 状态后端时,如果程序中有算子写入原生 keyed 状态的话,则预期的 checkpointing 和触发 savepoint 的操作会发生异常而失败,这是为编写自定义流算子的高级用户提供的功能。

4.3.4. 开启 RocksDB 原生监控指标

您可以选择使用 Flink 的监控指标系统来汇报 RocksDB 的原生指标,并且可以选择性的指定特定指标进行汇报。请参阅 配置文档 了解更多详情。

注意:启用 RocksDB 的原生指标可能会对应用程序的性能产生负面影响。

4.3.5. RocksDB内存高级调优

Flink 对大多数用例都提供了详细的默认 RocksDB 内存管理,下面的机制只是为了专业调优和问题解决使用。

4.3.5.1. 列族(ColumnFamily)级别的预定义选项

使用预定义选项,用户可以在每个 RocksDB 列族上应用一些预定义的配置,例如配置内存使用、线程、压缩设置等。目前每个算子的每个状态都在 RocksDB 中有专门的一个列族存储。

有两种方法可以选择要应用的预定义选项:

  • 在配置文件 flink-conf.yaml 中设置 state.backend.rocksdb.predefined-options 配置项。
  • 通过程序设置:EmbeddedRocksDBStateBackend.setPredefinedOptions(PredefinedOptions.SPINNING_DISK_OPTIMIZED_HIGH_MEM)

该选项的默认值是 DEFAULT ,对应 PredefinedOptions.DEFAULT

程序中设置的预定义选项会覆盖 flink-conf.yaml 文件中的配置。

4.3.5.2. 通过 RocksDBOptionsFactory 配置 RocksDB 选项

您也可以通过配置一个 RocksDBOptionsFactory 来手动控制 RocksDB 的配置选项。此机制使您可以对列族的设置进行细粒度控制,例如内存使用、线程、压缩设置等。目前每个算子的每个状态都在 RocksDB 中有专门的一个列族存储。

有两种方法可以将 RocksDBOptionsFactory 传递给 RocksDB 状态后端:

  • 在配置文件 flink-conf.yaml 中设置 state.backend.rocksdb.options-factory 配置项。
  • 通过程序设置,例如 EmbeddedRocksDBStateBackend.setRocksDBOptions(new MyOptionsFactory());

注意:通过程序设置的 RocksDBOptionsFactory 将覆盖 flink-conf.yaml 配置文件中的设置,且 RocksDBOptionsFactory 设置的优先级高于预定义选项(PredefinedOptions)。

注意:RocksDB是一个本地库,会直接从进程中分配内存,而不是从 JVM 分配内存。分配给 RocksDB 的任何内存都必须被考虑在内,通常需要将这部分内存从 TaskManager 的 JVM 堆中减去。不这样做可能会导致JVM进程由于分配的内存超过申请值而被 YARN/Mesos 等资源管理框架终止。

从 flink-conf.yaml 中读取列族选项

实现了 ConfigurableRocksDBOptionsFactory 接口的 RocksDBOptionsFactory 可以直接从配置文件 flink-conf.yaml 中读取配置。

state.backend.rocksdb.options-factory 的默认配置是 org.apache.flink.contrib.streaming.state.DefaultConfigurableOptionsFactory,它默认会将 这里定义 的所有配置项全部加载。 因此您可以简单的通过关闭 RocksDB 使用托管内存的功能并将需要的设置选项加入配置文件来配置底层的列族选项。

下面是自定义 ConfigurableRocksDBOptionsFactory 的一个示例 (开发完成后,需要将实现类全限定名设置到 state.backend.rocksdb.options-factory).

public class MyOptionsFactory implements ConfigurableRocksDBOptionsFactory {public static final ConfigOption<Integer> BLOCK_RESTART_INTERVAL = ConfigOptions.key("my.custom.rocksdb.block.restart-interval").intType().defaultValue(16).withDescription(" Block restart interval. RocksDB has default block restart interval as 16. ");private int blockRestartInterval = BLOCK_RESTART_INTERVAL.defaultValue();@Overridepublic DBOptions createDBOptions(DBOptions currentOptions,Collection<AutoCloseable> handlesToClose) {return currentOptions.setIncreaseParallelism(4).setUseFsync(false);}@Overridepublic ColumnFamilyOptions createColumnOptions(ColumnFamilyOptions currentOptions,Collection<AutoCloseable> handlesToClose) {return currentOptions.setTableFormatConfig(new BlockBasedTableConfig().setBlockRestartInterval(blockRestartInterval));}@Overridepublic RocksDBOptionsFactory configure(ReadableConfig configuration) {this.blockRestartInterval = configuration.get(BLOCK_RESTART_INTERVAL);return this;}
}

4.4. 从旧版本迁移

Flink 1.13 版本开始,社区改进了状态后端的公开类,进而帮助用户更好理解本地状态存储和 checkpoint 存储的区分。这个变化并不会影响状态后端和 checkpointing 过程的运行时实现和机制,仅仅是为了更好地传达设计意图。用户可以将现有作业迁移到新的 API,同时不会损失原有状态。

4.4.1. MemoryStateBackend

旧版本的 MemoryStateBackend 等价于使用 HashMapStateBackendJobManagerCheckpointStorage

4.4.1.1. flink-conf.yaml 配置

state.backend: hashmap# 可选,如果没有指定 checkpoint 目录,则 flink 会默认使用 JobManagerCheckpointStorage
state.checkpoint-storage: jobmanager

Java

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new HashMapStateBackend());
env.getCheckpointConfig().setCheckpointStorage(new JobManagerStateBackend());

Scala

val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStateBackend(new HashMapStateBackend)
env.getCheckpointConfig().setCheckpointStorage(new JobManagerStateBackend)

4.4.2. FsStateBackend

旧版本的 FsStateBackend 等价于使用 HashMapStateBackendFileSystemCheckpointStorage

4.4.2.1. flink-conf.yaml 配置

state.backend: hashmap
state.checkpoints.dir: file:///checkpoint-dir/# 可选,如果没有指定 checkpoint 目录,则 flink 会默认使用 FileSystemCheckpointStorage
state.checkpoint-storage: filesystem

4.4.2.2. 代码配置

Java

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new HashMapStateBackend());
env.getCheckpointConfig().setCheckpointStorage("file:///checkpoint-dir");// FsStateBackend 的高级配置,比如写入缓存大小可以通过手动初始化 FileSystemCheckpointStorage 对象来设置。
env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("file:///checkpoint-dir"));

Scala

val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStateBackend(new HashMapStateBackend)
env.getCheckpointConfig().setCheckpointStorage("file:///checkpoint-dir")// FsStateBackend 的高级配置,比如写入缓存大小可以通过手动初始化 FileSystemCheckpointStorage 对象来设置。
env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("file:///checkpoint-dir"))

4.4.3. RocksDBStateBackend

旧版本的 RocksDBStateBackend 等价于使用 EmbeddedRocksDBStateBackendFileSystemCheckpointStorage.

4.4.3.1. flink-conf.yaml 配置

state.backend: rocksdb
state.checkpoints.dir: file:///checkpoint-dir/# 可选,如果没有指定 checkpoint 目录,则 flink 会默认使用 FileSystemCheckpointStorage
state.checkpoint-storage: filesystem

4.4.3.2. 代码配置

Java

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new EmbeddedRocksDBStateBackend());
env.getCheckpointConfig().setCheckpointStorage("file:///checkpoint-dir");// 如果你想通过在 RocksDBStateBackend 构造器中指定 FsStateBackend 来配置 checkpoint ,比如写入缓存大小,则可以自己初始化一个 FileSystemCheckpointStorage 对象来完成该目标。
env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("file:///checkpoint-dir"));

Scala

val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStateBackend(new EmbeddedRocksDBStateBackend)
env.getCheckpointConfig().setCheckpointStorage("file:///checkpoint-dir")// 如果你想通过在 RocksDBStateBackend 构造器中指定 FsStateBackend 来配置 checkpoint ,比如写入缓存大小,则可以自己初始化一个 FileSystemCheckpointStorage 对象来完成该目标。
env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("file:///checkpoint-dir"))

5. 大状态与Checkpoint调优

该张姐描述如何配置和优化使用大状态的程序。

5.1. Overview

为了让 Flink 程序能够大规模可靠的运行,必须满足以下两个条件:

  • 程序需要能够可靠的进行 checkpoint。
  • 在任务失败后,任务的资源能够满足追上输入的流数据。

第一个条件讨论如果在大规模任务中稳定的进行 checkpoint,第二个条件是有关规划使用多少资源的最佳实践。

5.2. 监控状态和Checkpoints

通过查看 UI 界面是监控 checkpoint 行为最简单的方式,checkpoint 监控 文档描述了如何访问可用 checkpoint 指标。

通过任务级别的指标和web 接口获取到的这两个数字对 checkpoint 调优是非常有用的:

  • 从触发 checkpoint 到算子接收到他们的第一个 checkpoint barrier 经常会花费非常多的时间,这意味着 checkpoint barrier 从 source 到算子需要很长的时间,这表明系统正在恒定的反压下运行。
  • barrrer 对其花费的时间为接收到第一个和下一个 checkpoint barrier 所花费的时间,精确一次的非对齐 checkpoint 和至少一次的 checkpoint 子任务会处理上游子任务所有的数据而不会发生中断。但是,精确一次的非对齐 checkpoint 中已经接受到 checkpoint barrier 的通道会被阻塞,并且不接受新的数据,直到剩下的通道追赶上,并且接收到他们的 checkpoint barrier(非对齐时间)。

理想情况下这两个值应该很小,较大的值意味着出现了一些反压,从而导致 checkpoint barrier 在作业图中移动的速度很慢,这个现象可以通过处理数据端到端的延迟观察到。注意,在发生瞬间反压、数据倾斜或网络问题时,这些数字会瞬间变大。

非对齐 checkpoints 可以加速 checkpoint barrier 的传播速度,但需要注意,该特性并不能解决导致反压的根本问题,而且端到端的数据延迟依然会很高。

5.3. Checkpointing调优

checkpoint 由程序配置的常规时间间隔来触发,当 checkpoint 花费很长的时间来完成时,则下个 checkpoint 在当前正被处理的 checkpoint 完成前不会被触发。默认情况下,下个 checkpoint 会在正在进行的 checkpoint 完成后马上触发。

如果做完 checkpoint 需要的时间经常超过基础间隔时间,比如状态大小超过预期,或临时性的 checkpoint 存储较慢,则系统会不断的进行 checkpoint,新的 checkpoint 会在正在进行的 checkpoint 完成后马上开始。这意味着太多的资源都花费在了 checkpoint 上,而算子只得到了很少的资源。该行为会对使用同步 checkpoint 状态的流式程序造成较小的影响,但仍然可能会对整个应用性能产生很大的影响。

为了阻止这个情况,程序可以定义两次 checkpoint 之间的最小间隔:

StreamExecutionEnvironment.getCheckpointConfig().setMinPauseBetweenCheckpoints(milliseconds)

最后一次 checkpoint 和下一个新开始的 checkpoint 之间必须经过该最小的时间间隔,下图展示该值如何影响 checkpoint。

在这里插入图片描述

注意:程序可以通过 CheckpointConfig 来配置可以同时执行多少个 checkpoint。对于使用了大状态的 flink 程序,这会导致 checkpoint 花费很多资源。当手动触发 savepoint 时,程序有可能也在执行 checkpoint。

5.4. RocksDB调优

很多大状态 flink 流式程序都会使用 RocksDB 为状态后端,该后端可以很好的扩展主内存之外的内存,并且可靠的存储 keyed 状态。

可以通过配置来改变 RocksDB 的执行,该章节为使用 RocksDB 状态后端来优化 job 的最佳实践。

5.4.1. 增量Checkpoints

如果想要减少 checkpoint 花费的时间的话,使用增量 checkpoint 应该该是第一选择。相比于全量 checkpoint,增量 checkpoint 可以明显减少 checkpoint 的时间,因为增量 checkpoint 只会记录与上次完成的 checkpoint 不同的地方,而不是生成一个完整的并且包含状态后端的备份。

查看 RocksDB 的增量 checkpoint 来了解更多信息。

5.4.2. 定时器使用RocksDB或JVM Heap

默认会将定时器存储到 RocksDB,这是个非常好的选择。

在对只含有少量定时器的 job 进行性能优化时,比如没有开窗,没有在 ProcessFunctgion 中使用定时器的 job,将这些定时器放到 heap 内存中是可以提升性能的。请谨慎使用该特性,基于 heap 存储的定时器可能额会增加 checkpoint 时间,而且还不能使用对外内存。

查看 该章节 获取配置基于 heap 定时器的细节。

5.4.3. 调整RocksDB内存

RocksDB 状态后端的性能表现大都取决于可用的内存大小,为了提升性能,增加内存就可以提升很多。

默认情况下,RocksDB 状态后端会使用 Flink 的管理内存预算 RocksDB 缓存,需要设置 state.backend.rocksdb.memory.managed: true。请参考 RocksDB 内存管理 来获取该机制工作的背景知识。

为了调整内存相关性能问题,可以参考以下步骤:

  • 提高性能的第一步应该是增加管理内存大小,该操作通常会有很大的改善,而且也不需要调整很多 RocksDB 底层复杂的选项。

    在遇到很大的容器或进程时,RocksDB 会使用很多内存,除非是程序的处理逻辑自己需要很多 JVM heap。默认的管理内存占比 0.4 是一个保守值,在 TaskManager 有好几 GB 的处理内存时,可以增加该占比值。

  • 写入缓存的数量取决于你应用程序中的状态数量(pipeline 中所有算子的状态)。每个状态会对应一个列族(columnFamily),并且每个状态都需要自己的写入缓存。因此,有很多状态的程序需要更多的内存。

  • 你可以通过设置 state.backend.rocksdb.memory.managed: false 来比较使用管理内存的 RocksDB 和使用单列族内存的性能,这对于基线的测试(假设没有容器内存限制)或与 Flink 早期版本的对比测试会很有用。

    相比于管理内存设置,不使用管理内存意味着 RocksDB 分配的内存与应用程序中的状态数量成正比(内存占用随着应用程序的变化而变化)。根据经验,非管理内存模式(除非使用列族选项)的上限大约为“140MB * 所有任务的状态数量 * slots数量”,定时器也算状态。

  • 如果你的程序有很多状态,并且观察到 MemTable 在频繁的刷新(写入侧瓶颈),如果你无法增加总内存,则可以选择增加写入缓存使用的内存比例,通过 state.backend.rocksdb.memory.write-buffer-ratio 来设置。查看 RocksDB 内存管理 来获取更多细节。

  • 一个对有很多状态的 job 减少 MemTable 刷新次数的高级选项为通过 RocksDBOptionsFactory 对象调优 RocksDB 的列族选项,比如 arean 块大小、更多的后台刷新线程等。

public class MyOptionsFactory implements ConfigurableRocksDBOptionsFactory {@Overridepublic DBOptions createDBOptions(DBOptions currentOptions, Collection<AutoCloseable> handlesToClose) {// 如果算子有很多状态,可以增加最大后台刷新线程数量,这意味着在一个 DB 示例中有很多列族return currentOptions.setMaxBackgroundFlushes(4);}@Overridepublic ColumnFamilyOptions createColumnOptions(ColumnFamilyOptions currentOptions, Collection<AutoCloseable> handlesToClose) {// 将默认的 arean 块大小从 8MB 减少为 1MBreturn currentOptions.setArenaBlockSize(1024 * 1024);}@Overridepublic OptionsFactory configure(ReadableConfig configuration) {return this;}
}

5.5. 容量规划

该节描述如何规划稳定运行 flink job 需要多少资源,容量规划的基础规则如下:

  • 正常来说,算子运行应该有足够的资源,以避免出现反压,查看 反压监控 来检查程序运行是否出现了反压。

  • 在程序无故障且无反压运行需要的资源基础上提供一些额外的资源,这些资源可以用来追上在程序恢复期间积压的输入数据。至于需要多少额外资源,这取决于算子恢复的所消耗的时间,在恢复期间需要加载到新 TaskManager 的状态大小,以及期望多快恢复完成。
    重要事项:恢复的基础时间点应该是 checkpoint 被激活的时间,因为 checkpoint 也会占用一定的资源,比如网络宽带。

  • 暂时性的反压通常是可以接受的,这是在负载峰值、追赶阶段或外部系统(写入sink)出现暂时减速时控制执行流的一个重要部分。

  • 一些算子,比如大窗口,会对他们的下游算子造成峰值负载:比如窗口,他的下游算子在窗口构建时并没什么事情可做,但是在窗口触发时,会有很大的负载。下游算子的并行度规划需要考虑有多少窗口会被触发,并且处理峰值能够多快完成。

重要:为了之后能够增加资源,请将 DataStream 程序的 maximum parallelism 设置为一个合理值。最大并行度会决定在修改并恢复程序(通过 savepoint)时可以设置的并行度最大值。

Flink 内部以最大并行度数量的 key group 来跟踪并行状态,即使执行的程序并行度很小,但 flink 仍然可以将最大并行度设置为一个很大的值。

5.6. 压缩

flink 对 checkpoint 和 savepoint 提供了压缩选项,默认关闭。目前使用 snappy compression algorithm (version 1.1.4) 压缩方式,不过我们计划将来支持自定义压缩算法。压缩会在 keyed state 上以 key-group 粒度执行,比如,单独对每个 key-group 进行解压,这对于调整大小是很重要的。

可以通过 ExecutionConfig 来开启压缩:

ExecutionConfig executionConfig = new ExecutionConfig();
executionConfig.setUseSnapshotCompression(true);

:压缩选项对增量快照无影响,因为增量快照使用 RocksDB 的内部格式,该格式通常使用开箱即用的 snappy 压缩。

5.7. Task本地恢复

5.7.1. 动机

在 flink 的 checkpoint 中,每个 task 的状态都会产生一个快照,然后写入到分布式存储。每个 task 都会通过向 JobManager 发送一个包含了状态对应分布式存储位置的句柄来表示状态写入成功,反过来,JobManager 会收集所有 task 发送的句柄,然后将他们捆绑到一个 checkpoint 对象中。

在恢复的时候,JobManager 会打开最新的 checkpoint 对象,然后将句柄返回给对应的 task,之后 task 就可以根据句柄从分布式存储恢复他们的状态了。使用分布式存储来保存状态有两个重要的优势:

  1. 存储有容错能力。
  2. 分布式存储中的存储的状态可以被所有的节点访问,并且可以很容易的被重新建立,比如并行度调整。

然而,使用远程分布式存储也有一个大的缺点:所有的 task 必须通过网络重远程位置读取它们的状态。在很多情况下,任务恢复是可以将失败的 task 重新调度在上一次运行的相同的 TaskManager 上,当然也有例外,比如机器故障,但我们仍然需要读取远程状态。这会导致即使一些失败只是出现在了单个机器上,大状态恢复也需要很长的时间。

5.7.2. 方式

task 本地状态恢复目标就是为了解决恢复时间过长问题,其主要思想如下:对于每个 checkpoint,每个 task 不仅需要将状态写入分布式存储,同时也需要将状态快照写入到 task 所在机器的本地存储,比如本地磁盘或内存。注意主存储依然是分布式存储,因为本次储存胡无法确保节点失败的持久化,并且不能被其他节点访问。

对于每个可以被重新调度在之前机器来进行恢复的 task,我们就可以从本地存储来恢复状态,本地拷贝可以避免远程状态读取的成本。很多失败并不是节点失败,并且节点失败通常只会影响一个或很少的节点,因此很多 task 可以从他们之前的位置进行恢复,并且找到完整的本地状态,一次你本地恢复更高效,而且可以减少恢复时间。

注意,本地恢复在 checkpoint 的创建和本地存储上会有一些额外的成本,这取决于选择的状态后端和 checkpoint 策略。在大多数情况下,该方案都是通过简单的将分布式存储复制到本地存储。

local_recovery

5.7.3.分布式存储和本地存储的关系

task 本地状态通常会考虑使用本地存储拷贝,checkpoint 状态的成功保障依然是分布式存储,这意味着在 checkpoint 和恢复期间本地存储可能会有问题:

  • 对于 checkpoint,分布式存储必须成功才行,本次拷贝失败并不会影响 checkpoint。checkpoint 在分布式拷贝创建失败时会失败,即使本地拷贝被成功创建也不行。
  • JobManager 只会成功并管理分布式拷贝,本地拷贝只属于 TaskManager,并且他们的生命周期独立于他们的分布式拷贝。比如,分布式拷贝可能会保留最新的 3 个 checkpoint,但是本地存储只会保留最新的 checkpoint。
  • 在恢复时,如果本地拷贝可用,Flink 通常会先尝试从 task 本地状态进行恢复。在从本地拷贝恢复期间发生任何问题,Flink 会马上从远程分布式拷贝来恢复 task。如果分布式拷贝和本地拷贝都失败的话,恢复才会失败。取决于 flink 的配置,在这种情况下,Flink 仍然可以从一个更老的 checkpoint 恢复。
  • task 本地拷贝可能只包含完整 task 状态的一部分,比如在写入本地文件时出现异常。在这种情况下,Flink 将会尝试通过本地状态恢复一部分,非本地状态将会从分布式拷贝进行恢复。分布式状态存储必须是完成的,并且是 task 本地状态的合集。
  • task 本地状态和分布式状态有不同的格式,并不要求他们完全相同。比如,task 本地状态保存在 heap 内存的对象中,并且没有被存储到任何文件。
  • 如果丢失了某个 TaskManager,则它上面的所有 task 本地状态都会丢失。

5.7.4. 配置task本地恢复

task 本地恢复默认是关闭的,可以通过指定 flink 的配置 state.backend.local-recoveryCheckpointingOptions.LOCAL_RECOVERY 来激活。该值也可以通过设置为 true 来启用,或设置 false (默认值)来禁用。

注意 非对齐 checkpoints 目前不支持 task 本地恢复。

5.7.5. task本地恢复与不同的状态后端

限制:目前,task 本地恢复只涉及到 keyed 状态后端,keyed 状态通常是状态中最大的一部分。在不久的将来,我们将会涉及到算子状态和定时器。

下面的状态后端支持 task 本地恢复:

  • HashMapStateBackend:task 本地恢复支持 keyed 状态,通过拷贝状态到本地文件来实现,会造成额外的写入成本,并且占用本地磁盘空间。在未来,我们可能会提供保存 task 本地状态到内存的实现。
  • EmbeddedRocksDBStateBackend:task 本地恢复支持 keyed 状态。对于完成 checkpoint,状态会被拷贝到本地文件,这会造成额外的写入成本并且占用本地磁盘空间。对于增量快照,本地状态基于 RocksDB 的原生 checkpoint 机制。该机制首先会创建分布式拷贝,这意味着在这种情况下,创建本地拷贝并不会产生额外的成本。我们会在上传分布式存储之后,简单的保存原生 checkpoint 目录,而不会删除它。该本地拷贝会通过硬链接分享 RocksDB 工作目录中的活跃文件,因此,对于活跃文件,通过增量快照进行 task 本地恢复,并不会占用额外的空间。使用硬链接意味着 RocksDB 目录必须在同一个物理设备上,并且所有配置本地恢复目录都可以被用来存储本地状态,否则硬链接建立会失败。目前,当 RocksDB 目录被配置到不同的物理设备上时,会阻止使用本地恢复。

5.7.6. 分配保存调度

task 本地恢复会在失败时使用分配保存 task 进行调度,进行如下工作。每个 task 成员会记住他们之前的配置,并且在重新恢复时要求想提供的 slot。如果没有 slot 可用,task 将会向资源管理器请求一个新 slot。这种情况下,如果 TaskManager 没有任何可用的 slot,则该 task 就无法返回它之前的位置,而且不会将其他恢复的 task 赶出他们之前的 slot。之前的 slot 只能在 TaskManager 不再可用时消失,在这种情况下,一些 task 就需要请求一个新的 slot 了。调度策略可以赋予最大数量的 task 从本地状态恢复的机会,避免从其他 task 窃取他们之前的 slot。

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

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

web前端期末大作业——基于HTML+CSS+JavaScript蓝色的远程监控设备系统后台管理界面模板

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…...

智能语音识别系统

广告关闭 腾讯云双11爆品提前享&#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高满返5000元&#xff01; 使用腾讯云语音识别完成电话录音质检 效率提升 倍 成本降低 过去 个人的工作量现在只需 个人工 台机器 同…...

java.lang.NoSuchMethodError: org.xx.AbstractHandlerMapping.obtainApplicationContext()

一、概述 中午不睡觉&#xff0c;来记录点东西。 某历史遗留项目&#xff0c;因为这几天的log4j漏洞问题要升级&#xff0c;但是由于种种原因&#xff0c;当时上线部署的包跟现在的代码已经对应不上了&#xff0c;现在已掌握的代码已经更新了很多内容了&#xff0c;当时部署在…...

CentOS7安装MySQL5.7.37

CentOS7安装MySQL5.3.37下载MySQL安装压缩包MySQL安装阶段下载MySQL安装压缩包 首先需要准备一个MySQL安装文件的压缩包“mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar”&#xff0c;进入官网点击download 点击MySQL社区版本下载&#xff08;英文&#xff09; 点击download arch…...

利用TCP网络编程实现客户端和服务端简单交互

概述 在TCP通信协议下&#xff0c;能实现两台计算机之间的数据交互&#xff0c;并且它们要严格区分客户端&#xff08;Client&#xff09;与服务端&#xff08;Server&#xff09; java.net.Socket 类表示客户端java.net.ServerSocket 类表示服务端 步骤 客户端和服务端通信…...

应广单片机可以用c语言,应广单片机(一)

/****************************************************************函数名称&#xff1a;void Set_User_T16(void)函数功能&#xff1a;定时器计数定时256us函数参数&#xff1a;无函数返回值&#xff1a;无函数说明&#xff1a;******************************************…...

Qt开发之串口通信(三)

VSQt中获取串口COM的两种方式&#xff1a; 1、使用QT自带的类 bool QBatteryTesting::serialport_init() { //获得所有可用端口列表 QList<QSerialPortInfo> serialPortInfoList QSerialPortInfo::availablePorts(); if (serialPortInfoList.isEmpty()) …...

常见WEB服务器种类

IIS&#xff08;Internet信息服务&#xff09;英文InternetInformationServer的缩写。它是微软公司主推的服务器。IIS的特点具有&#xff1a;安全性&#xff0c;强大&#xff0c;灵活。 2.Tomcat Tomcat是Apache软件基金会&#xff08;ApacheSoftwareFoundation&#xff09;的…...

WEB服务器与应用服务器的区别

一&#xff0c;简述 WEB服务器与应用服务器的区别: 1.WEB服务器: 理解WEB服务器,首先你要理解什么是WEB?WEB你可以简单理解为你所看到的HTML页面就是WEB的数据元素,处理这些数据元素的应用软件就叫WEB服务器,如IIS、apache。 WEB服务器与客户端打交道&#xff0c;它要处理的…...

应广单片机adc_应广单片机adc和pwm例程

应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说,上代码.#include "extern.h"/**********adc*****************/Word usAdcSum;Word usAdcSumBak;BI…...

应广单片机开发案例

特性 l 全自我知识产权 8 位指令集 l 8 层 10bit 硬件堆栈 l 1Kx14b 程序 FLASH 存储空间&#xff08;16bytes/page&#xff09; l 256x8b 数据 EEPROM&#xff08;16bytes/page&#xff09; l 数据 EEPROM 可在应用编程 l 64x8b SRAM l 1 x 带 8 位预分频的定时器 0 l…...

C语言练习 day1

注&#xff1a;C语言练习100天这个专栏 摘抄自菜鸟教程。我写在这里印象更深&#xff0c;练习自用的。有些地方会加入一些自己的思考。 题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 自己先想想~…...

[深度长文] 996的经济学

全文约13000字。文章较长&#xff0c;建议先收藏再阅读。目录一、996的概念定义二、李嘉图的比较优势原理三、支付加班费的996是个伪命题四、996的合理化五、收入的三个来源六、一切租皆来源于权力七、快速致富的唯一途径八、一个三层架构的简明政治经济学框架九、三层架构的两…...

算法day38|509,70,746

动态规划 DP数组以及下标的含义递推公式初始化遍历顺序打印DP数组五部曲509. 斐波那契数 class Solution:def fib(self, n: int) -> int:#确定数组和下标的含义,运用一维数组if n 0:return 0elif n 1:return 1dp [0]*(n1)#初始化dp[0] 0dp[1] 1#遍历顺序&#xff0c;…...

倒计时 css,css实现倒计时效果

一、实现效果截图(学习视频推荐&#xff1a;css视频教程)二、实现原理看到上图效果应该很容易猜到原理&#xff0c;纯CSS的话使用轮播。通过改变图片的margin-top&#xff0c;再加上亿点点动画&#xff0c;亿点点数字图片&#xff0c;就实现了。使用PS建数字图片&#xff1a;然…...

应广单片机PFC154

前面我们讲了PFC151&#xff0c;今天我们来讲一下PFC系列另外一个型号&#xff0c;PFC154。我们还是通过具体数据来直观的了解这款芯片。 系统特性 1.高抗干扰&#xff08;High EFT&#xff09;系列 2.特别适用于AC电源供电的、阻容降压电路的、需要较强抗干扰能力的&#x…...

Java开发童年小游戏

黄金矿工、贪吃蛇、飞机大战……这些名字你是否还记得&#xff1f; 这些陪伴我们成长的小游戏现在已然被手游取代&#xff0c;但它们带给我们的美好记忆却从不曾消失。 今天带来两小时就能自己动手开发这些小游戏的教程&#xff0c;希望大家能在这个纷扰的时代&#xff0c;通…...

ZooKeeper的监听原理

Main线程创建listener线程和connet线程 &#xff0c;监听事件发给connet线程&#xff0c;数据有变化Zookeeper通知到listener线程...

HTML+CSS制作简单的家乡网页 ——我的家乡介绍广东 web前端期末大作业

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…...

作图从此不求人,代谢组学宝藏作图能力提升班你来不来?

俗话说&#xff0c;一图胜千言。 在运用代谢组学研究课题的过程中&#xff0c;数据的分析并将其可视化表达是需要掌握的重点技能。 质量上乘的SCI的图片表格是论文的加分项&#xff0c;能极大提高论文的质量。很多同学文章写得多&#xff0c;勤勤恳恳投杂志、SCI&#xff0c;…...

【Java面向对象】04 对象构造

对象构造 1.默认值 数值0布尔false引用类型null 2.无参构造 如果类中没有提供任何构造函数&#xff0c;那么会默认添加一个无参构造如果提供了构造器&#xff0c;那么不再提供无参构造 3.显示域初始化 private String name "";// 属于类&#xff0c;所有构造出…...

MySQL Linux服务器快照克隆引起的binlog日志无法正常删除导致文件系统满

最近&#xff0c;一个mysql数据库Linux服务器文件系统空间满&#xff0c;查看是binlog消耗绝大部分空间&#xff1b;经了解mysql数据库每天进行全备并删除1天前binlog日志&#xff1b;然而&#xff0c;2022.11.15日开始的binlog均没删除&#xff0c;后续了解到linux服务器被快照…...

golang(gin框架),基于RESTFUL的跨语言远程通信尝试

golang(gin框架),基于RESTFUL的跨语言远程通信尝试 背景:在今年的项目实训过程中,遇到了这样的问题: 企业老师讲课实用的技术栈是Java springboot。 实训实际给我们讲课以外的开发时间非常短暂,为了方便协作、提高效率,我们想要将系统模块拆分成几个粒度比较大的分布式服…...

为什么要分区有必要分区吗

非常有必要。 这样可以避免经常读写硬盘的某个部位&#xff0c;分区后可以更加充分的利用硬盘。 你可以这样理解&#xff0c;你一个水杯&#xff0c;是300毫升的容量。而你每次只装100毫升水&#xff0c;这样杯子的上面200毫升的地方&#xff0c;永远也用不到。当然咱们存文件也…...

SWUST OJ 189: 素数判定

题目描述 给你两个数a、b,现在的问题是要判断这两个数组成的区间内共有多少个素数 输入 多组测试数据。 每个测试数据输入两个数a、b。(2<a,b<1000) 输出 输出该区间内素数的个数。 样例输入 2 4 4 6 样例输出 2 1 参考程序 #include<stdio.h> int main…...

B树的C语言实现

前言 今天我们再来学习另外一种高级数据结构B树&#xff0c;我们知道树的查询时间复杂度和其树的高度有直接关系&#xff0c;当我们向红黑树里面插入大量的数据时&#xff0c;有两个问题&#xff1a; &#xff08;1&#xff09;首先&#xff0c;内存是有限的不可能无止境的一直…...

Maven的简单介绍

Maven 构件 <packaging> : pom、jar、ear、war以及maven-plugin,构建Maven之后所生成的文件类型&#xff0c;Pom本身不产生构件&#xff0c;用来作为依赖库。 pom类型常用于微服务中作为父Pom,通过 可以将子模块包含进来&#xff0c;共享父Pom的依赖&#xff0c; GAV坐标…...

WebDAV之葫芦儿·派盘+书藏家

书藏家 支持webdav方式连接葫芦儿派盘。 是一款书籍收藏的软件,对于喜欢阅读书籍的用户来说非常友好,记录你所阅读的书籍内容,对你所阅读的书籍内容进行全方位的管理,并且支持多种录入的方式,不管是实体书籍还是网络书籍都能够进行更为有效的管理;内置WebDAV 模块,更加…...

图像 异常检测算法_检测图像异常的算法

图像 异常检测算法Modern applications are generating enormous amounts of image data. And in the last years, researches began to apply some data mining algorithms to extract useful information from these images to apply smart decisions in business, to detect…...

Adobe Acrobat Pro设置高亮快捷键

编辑->首选项->使用单键加速访问工具 切换输入法到英文输入状态&#xff0c;按下u&#xff0c; 就可以用鼠标直接高亮文字了。...

AOP简单示例

为了实现AOP&#xff0c;我们需要以下几个步骤&#xff1a; 1.导入坐标(pom.xml) 2.制作连接点(原始操作&#xff0c;Dao接口与实现类) 3.制作共性功能(通知类与通知) 4.定义切入点 5.绑定切入点与通知关系(切面) 1.导入坐标(pom.xml) 在pom.xml中添加依赖并刷新maven。 <d…...

matlab vector函数参数,将vector作为参数传递

这两天在用c写数值计算&#xff0c;手残选了个蛋疼的Boost库。boost的好处在于通用性&#xff0c;缺点……原型实在是太长了&#xff0c;make一下只要出一个error就被刷屏了(偶17寸屏幕18号字&#xff0c;谁让我是瞎子)。首先简单介绍一下boost::numeric::ublas。vector对象有v…...

向量与列表(一种线性的数据结构)

目录&#xff1a;1. 向量与列表2. 时间复杂度的区别3. 位置&#xff08;Position&#xff09;4. 基于可扩充数组实现的向量1. 向量与列表 向量&#xff08;Vector&#xff09;与列表&#xff08;List&#xff09;是两种典型的序列&#xff08;Sequence&#xff09;。所谓序列&…...

带外通道技术(OOB)总结

在渗透中&#xff0c;经常碰到关闭回显的漏洞&#xff0c;常见的XXE盲注&#xff0c;SQL盲注&#xff0c;反序列号无回显&#xff0c;这个时候常用到OOB带外数据通道&#xff0c;带外通道技术&#xff08;OOB&#xff09;让攻击者能够通过另一种方式来确认和利用所谓的盲目&…...

银河麒麟桌面操作系统kysec介绍

kysec即安全中心&#xff0c;该软件系统已默认安装 安全中心位置&#xff1a;开始菜单 - - 安全中心 Kysec提供了增强身份认证、系统访问控制、数据安全保护&#xff0c;提高系统运行环境的安全性与稳定性。可以有效地保护系统&#xff0c;提供了防篡改、软件源安全认证、内核…...

NIOS_Altera EPCS下载 注意事项20210815

第一&#xff1a;QSYS 如下图 第二&#xff0c;在Verilog 工程文件里面添加 qsys 生产的文件**.qip格式文件** 第三编译下载verilog硬件.sof文件 第四。NIOS文件注意 上图注意事项&#xff0c;allow_code_at_reset 这个项目的意思是允许代码存放在复位向量处。QSYS里面CPU…...

django中 celery 如何优雅重启

因为项目中有延时任务&#xff0c;如果使用kill -9 直接KILL进程&#xff0c;会导致现有任务无法在下次启动时被加载&#xff0c;这里使用官方推荐的信号机制&#xff0c;这时celery的主线程会将待完成的任务记录在 broker中&#xff08;博主用的是redis&#xff0c;而且没有改…...

应广单片机定时器TIME16配置

应广单片机定时器TIME16配置&#xff0c;关于time16的配置 $T16M sysCLK,/64,BIT15; $T16M sysCLK,/64,BIT15; 选择(SYSCLK/64)当Timer16时钟源&#xff0c;每2^16个时钟周期产生一次INTRQ.21系统时钟 System Clock HRC /28 MHz sysclk/648 MHz/64125 kHz&#xff0c;约每52…...

javaWeb课程设网上报名系统

1 概述 1.1 项目背景 随着计算机技术的迅猛发展&#xff0c;学校教学和管理的信息化发展也有长足的进步&#xff0c;这就 要求各个环节都均衡发展&#xff0c;从软硬件两方面把学校建设成一流的信息管理、教育教学的平台该系统本着减轻教师工作负担、提高工作效率&#xff0c…...

Javacv录制视频

基于maven的Javacv录制视频 由于opencv对Java的跨平台兼容性不友好&#xff0c;javacv的作者为了方便跨平台编写opencv相关的代码&#xff0c;就有了集成opencv的javacv产生。 录制视频 VideoCapture capture new VideoCapture(0); //参数0是默认的摄像头 VideoWriter vw …...

408 考研《操作系统》第一章第二节:操作系统的发展与分类和操作系统的运行机制与体系结构

文章目录教程1. 操作系统的发展与分类1.1 手工操作阶段1.2 批处理阶段1.2.1 单道批处理系统1.2.2 多道批处理系统1.3 分时操作系统1.4 实时操作系统1.5 其他几种操作系统1.6 总结教程 操作系统的发展与分类https://www.bilibili.com/video/BV1YE411D7nH/?p4&share_source…...

java读取摄像头视屏流,Java 摄像头视频获取

Rate this post背景介绍作为一门强大的语言&#xff0c;Java所展现给编程人员的不仅仅是来自于发上的便利&#xff0c;更是这题开发过程中的的可扩展性。通过添加jar包即可扩展和使用开源的架构和方法。这是Java给程序员带来的最直观的体验。但是请不要忘记Java也是多平台支持的…...

thermo fisher赛默飞世尔酶标仪维修Labserv K3 MK3

Labserv K3/MK3酶标仪特点 灵活性&#xff1a; 新一代K3型全自动中文酶标仪是一种光度计式酶标板读数仪&#xff0c;对于用酶标板的酶联免疫测定&#xff08;包括常规应用及科研&#xff09;&#xff0c;它都可提供很好的灵活性。 扩展记忆&#xff1a; K3型酶标仪自身携带的…...

常用空间函数和坐标转化查询思路

查询的bo无需对应标明&#xff0c;也可 按瓦片查的tile才需要瓦片裁剪&#xff0c;其他查直接返回geojson即可 瓦片-关系固定-四点框---查询ST_MakeEnvelope将四点框转为gemo st_envelope将geom转四点框--定位--瓦片 st_simplify 抽希可能会由于本身数据就少&#xff0c;再抽取…...

8-4 Prometheus服务发现

文章目录前言静态配置弊端服务发现优点原理服务发现类型基于K8S的服务发现基于File的服务发现基于Consul的服务发现基于DNS的服务发现前言 服务发现&#xff08;Service Discovery&#xff09;经常用在微服务治理以及配置管理上&#xff0c;在负载且动态变化的环境下如果没有服…...

java开发工程师简历模板,2022最新

模块科技招聘官莅临千锋教育 招聘Java开发工程师招聘官谢经理莅临千锋教育成都分校招聘10位Java开发工程师,谢经理在面试前的宣讲会上,为学员详细介绍了模块科技的发展现状和岗位需求,让学员对公司和岗位有了充分的认识。在随后的面试环节,学员们基于对企业的了解和自身职业发展…...

3 0 XPlanner使用手册

一、 XPlanner简介 XPlanner 是一个基于Web的XP团队计划和跟踪工具。XP的开发概念如iteration、user stories等&#xff0c;XPlanner都提供了相对应的管理工具&#xff0c;XPlanner支持XP开发流程&#xff0c;并解决利用XP思想来开发项目所碰到的问题。 XPlanner特点包括&#…...

​【交通标志识别】基于BP神经网络实现交通标志识别matlab代码

1 简介 近年来&#xff0c;交通标志识别在车辆视觉导航系统中是一个热门研究课题。为了安全驾驶和高效运输&#xff0c;交通部门在公路道路上设置了各类重要的交通标志&#xff0c;以提醒司机和行人有关道路交通信息&#xff0c;如指示标志、警告标志、禁止标志等。交通标志具…...

简单心形代码

心形图案&#xff0c;可以说是表白神器&#xff0c;怎么写出一个让你的另一半为之心动的心形❤呢&#xff1f; 以下便是部分代码&#xff0c;望亲们如愿以偿&#xff01;&#xff01;&#xff01; Scanner xin new Scanner(System.in);System.out.println("请输入心形的上…...

波浪排序

任务概述 一串n个不等式符号&#xff1b;即&#xff1a;>或< n1个不同的整数。 你的目标是将所有的n1个整数放在由给定的n个不等式符号所产生的可用位置上&#xff0c;以便整个表达式为真。 为了清楚起见&#xff0c;如果你有n个不等式符号&#xff0c;那么在字符串的 &q…...

基于粒子群算法优化BP神经网络的PID控制算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…...

大数据分析有哪些挖掘方式

大数据分析发掘&#xff0c;从可视化分析、数据发掘算法、猜测性分析、语义引擎、数据质量管理等方面&#xff0c;对杂乱无章的数据&#xff0c;进行萃取、提炼和分析的进程。那么&#xff0c;大数据分析发掘有哪些方法呢?今天就一同来了解下吧! 1、可视化分析 可视化分析&…...

Sql去重查询数据

最近在工作过程中&#xff0c;面试过程中&#xff0c; 部分求职者或者同事&#xff0c;对sql怎么去重查询&#xff0c;不是太熟练 今天下午忙里偷闲&#xff0c; 整理了一下 其实sql基本的查询 &#xff0c;还是蛮有意思&#xff0c; 下面是我大致整理的几种去重查询 1.…...

APUE学习笔记(十)信号

10.1 信号概念 mac和linux都支持31种信号。不存在编号为0的信号。 产生信号的方式&#xff1a; 当用户按某些终端键时引发终端产生的信号硬件异常产生信号&#xff1a;除数为0、无效的内存引用等用户可用kill命令将信号发送给其他进程进程调用kill函数可将任意信号发送给另一…...

机器学习:回归分析—— 一元线性回归、多元线性回归的简单实现

回归分析回归分析概述基本概念可以解决的问题基本步骤和分类线性回归一元线性回归多元线性回归回归分析概述 基本概念 回归分析是处理多变量间相关关系的一种数学方法。相关关系不同于函数关系&#xff0c;后者反应变量间的严格依存性&#xff0c;而前者则表现出一定程度的波…...

移位寄存器实现下降沿

...

【前端基建】基于Vue实现商城可视化搭建平台 Mall-Cook

前言 本项目旨在开发一个供运营、产品快速搭建商城的可视化平台&#xff0c;利用可视化的拖拽与属性配置完成商城构建和日常运营&#xff0c;而开发只进行平台的维护、业务组件的新增和迭代。避免高频的业务需求&#xff0c;提升我们的开发效率。 本项目提供的是可视化搭建平台…...

自卑的人,如何找到自信

转自&#xff0c;百度贴吧http://tieba.baidu.com/p/3090207985 &#xff08;1&#xff09; 改变委曲求全的思维方式 在你身上也许发生过这样一些事情&#xff1a;正在忙于自己的事情&#xff0c;朋友找上门来邀请你参加舞会&#xff0c;碍于面子答应了&#xff0c;可是玩得一点…...

小程序开发---02认识宿主环境

小程序依赖于微信提供宿主环境 小程序可以借助宿主环境提供的能力&#xff0c;可以完成许多普通网页无法完成的功能&#xff0c;如&#xff1a;微信扫码&#xff0c;微信支付&#xff0c;微信登录&#xff0c;定理定位&#xff0c;etc…等 小程序宿主环境包含以下内容&#xf…...

字符编码——简体中文编码中区位码、国标码、内码、外码、字形码的区别及关系

目录 区位码国标码(交换码)内码(机内码)区位码、国际码、内码的转换为什么要加上20H为什么加上80H外码字形码(字型码、字模码、输出码)汉字的打印及显示本文以GB2312为例,讲述区位码、国标码、内码、外码、字形码 区位码 整个GB2312字符集分成94个区,每区有94个位,每个区位…...

win7 计算机右键没有属性,Win7右键点击计算机/文件没有属性选项怎么办?

最近有使用win7系统的用户右键点击计算机的时候发现没有属性选项&#xff0c;同时点击所有文件都没有属性选项&#xff0c;第一次遇到这样的问题也不知道怎么解决&#xff0c;其实有可能是本地组策略编辑器里面属性被禁用的缘故&#xff0c;所以PE吧就教大家怎么重新设置本地组…...

用例图解释说明文档

用例图(Use Case Diagram)是由软件需求分析到最终实现的第一步&#xff0c;它描述人们如何使用一个系统。用例视图显示谁是相关的用户、用户希望系统提供什么样的服务&#xff0c;以及用户需要为系统提供的服务&#xff0c;以便使系统的用户更容易理解这些元素的用途&#xff0…...

文档规范

1. 产品需求定义 产品需求定义的目标是&#xff1a;“清楚地描述要做的产品是什么样的&#xff1f;不涉及具体实现方法。”&#xff0c;其定义过程如下图所示。 此产品需求定义包括&#xff1a;软件硬件。 2. 结构化设计方法的基本思路 按照需求&#xff0c;将软件逐级细化&am…...

如何完整高效地制作一款APP产品需求文档

转自 http://www.admin5.com/article/20160217/647464.shtml 【文章摘要】首先声明一下&#xff0c;笔者虽然写过几个网站的代码&#xff0c;那也是5年前的事情了&#xff0c;并非技术出身&#xff0c;很多表达方式上也没有技术语言&#xff0c;有不妥的地方还请海涵。怎么完整…...

产品各种文档(BRD,PRD,MRD)参考

BRD&#xff08;一般用PPT&#xff09; 面向boss、投资人&#xff0c;需求、盈利模式描述 一、项目背景&#xff08;为什么要做&#xff0c;where are we&#xff09; 1.市场环境分析 2.我们要做什么 3.解决什么问题 4.我们的优势 5.得到可行的结论 二、商业价值&#…...

产品需求文档(PRD)写作(一) 写前准备(信息结构图)

由于公司需求&#xff0c;我竟然要开始“项目需求文档”之路了&#xff0c;搜罗了半天&#xff0c;发现一系列不错的文章&#xff0c;收录一下&#xff0c;方便自己日后查阅&#xff0c;原文地址。 当我们初次接触产品需求文档时&#xff0c;首先会从网络上寻找产品需求文档模板…...

MongoDB根据内置文档属性查询 -- 关于mongoDB查询内置文档属性的坑

最近用fastify做一个项目的后台,数据库用的mongodb,有一个需求,需要根据mongo中一条记录中的子属性查询和排序,懂的人貌似很简单,不过初学还是踩了很多坑,而且网上针对这个问题的文章也不很多,在此将mongodb在使用过程中的一些坑和经验分享与大家. MongoDB根据内置文档属性查询…...

产品APP架构说明文档

目录介绍 1.关于项目架构的技术堆栈1.1 该项目App整体架构 1.1.1 目前项目[准备中]使用的架构1.1.2 市面常见的架构1.1.3 MVP架构使用心得1.2 主要的技术要点 1.2.1 视频播放技术1.2.2 音频播放技术1.2.3 复杂页面展示1.2.4 状态切换1.2.5 缓存1.2.6 音视频文件下载技术1.3 …...

产品经理技术脑:怎么看懂接口文档

日常产品开发过程中&#xff0c;涉及前后端数据交互的时候&#xff0c;往往会离不开接口调用&#xff0c;尽管产品经理一般不需要写接口文档&#xff08;负责接口中间层产品经理除外&#xff09;&#xff0c;但对接口了解&#xff0c;对于需求沟通、需求传达还是很有帮助的。 接…...

最棘手的Java面试题(上)

这是收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案&#xff0c;或者觉得这些不足以挑战你的 Java 知识&#xff0c;但这些问题都是容易在各种 Java 面试中被问到的&#xff0c;而且包括…...

美国在线计算机硕士排名,2020US.News美国计算机专业硕士排名 美国卡耐基梅隆大学位居第一...

US News发布2020版美国大学最佳研究生院排名。在每个研究生院排名下&#xff0c;还设有细分专业排名。在此和大家分享美国计算机专业硕士排名。该排名通过对美国研究生学院基于各项指标加权平均计算所得&#xff0c;这些指标主要包括&#xff1a; 学术声誉、毕业率和新生返校率…...

美国计算机专业硕士排名,US News美国计算机专业硕士排名

该排名通过对美国研究生学院基于各项指标加权平均计算所得&#xff0c;这些指标主要包括&#xff1a; 学术声誉、毕业率和新生返校率、师资力量、新生水平、经济实力、毕业率表现、校友捐赠等&#xff0c;在工程学院的排行当中参考了该研究学院中是国家学术工程教授的人数。当然…...

美国计算机专业排名2019,美国大学计算机专业排名2019情况如何?

随着我国前往美国留学的人数每年都在增多&#xff0c;人们对于如何选择专业十分的谨慎。很多人都选择了计算机专业&#xff0c;那么美国大学计算机专业排名2019情况如何?对于这些问题&#xff0c;让我们一起听听小编是如何介绍的吧。美国大学计算机专业排名2019情况&#xff1…...

奥城大学计算机专业,2013年美国留学硕士双录取院校一览

1阿拉巴马大学位于阿拉巴马州 管理学&#xff0c;市场学可以双录取2 东北大学 位于麻省波士顿市 可以提供衔接的桥梁课程8个月3 阿德菲大学位于纽约市 可以提供MBA双录取4 威德勒大学位于宾州 可以提供MBA&#xff0c;MPA双录取5 桥港大学位于康涅狄格州 可以提供双录取6 北得克…...

美国计算机学什么好,哪些美国学校计算机专业就业率高?

达特茅斯大学(Dartmouth University)达特茅斯大学占地270英亩&#xff0c;位于美国新罕布什尔州汉诺威市&#xff0c;这里交通方便&#xff0c;学生的生活品质较高。学校的贝克图书馆是根据费城的独立宫设计的&#xff0c;那里还有墨西哥壁画大师奥罗斯科的作品。计算机专业毕业…...

奥城大学计算机专业,研究生美国留学双录取院校汇总

研究生美国留学双录取对于很多语言基础不是很好的人来说&#xff0c;可以先申请美国研究生后学习语言。美国大学中有哪些院校有双录取?下面就为大家介绍下研究生美国留学双录取院校的情况。1 阿拉巴马大学 全美88 位于阿拉巴马州 管理学&#xff0c;市场学可以双录取2 东北大学…...

奥城大学计算机专业,美国硕士双录取院校一览表:

1阿拉巴马大学全美88位于阿拉巴马州管理学&#xff0c;市场学可以双录取2东北大学全美98位于麻省波士顿市可以提供衔接的桥梁课程8个月3阿德菲大学全美125位于纽约市可以提供MBA双录取4威德勒大学全美187位于宾州可以提供MBA&#xff0c;MPA双录取5桥港大学全美230位于康涅狄格…...

洛杉矶儿童医院连续第三年入选美国太平洋沿岸地区第一、全美第五的儿童医院

在《美国新闻与世界报道》2021-22年度医院调查中&#xff0c;该院排名加州儿科医院第一&#xff0c;并在多项亚专科中名列前茅 洛杉矶--(美国商业资讯)--洛杉矶儿童医院(Children’s Hospital Los Angeles, CHLA)拥有世界一流的专业知识&#xff0c;同时秉持以患者为中心的护理…...

美国犹他大学计算机专业怎么样,犹他大学最热门专业,了解一下?

原标题&#xff1a;犹他大学最热门专业&#xff0c;了解一下&#xff1f;犹他大学(The University of Utah)&#xff0c;简称U of U&#xff0c;世界著名高等学府&#xff0c;世界百强大学&#xff0c;是美国犹他州高等教育的旗舰型学校&#xff0c;也是一所世界顶尖的公立研究…...

奥城大学计算机专业,双录取的美国研究生大学有哪些?哪些专业被允许?

一、美国研究生双录取途径介绍&#xff1a;总是一般美国研究生双录取可以通过四种途径来进行&#xff1a;1、正常的填写研究生网申系统里面&#xff0c;会问是否要参加语言课程&#xff0c;针对这个问题&#xff0c;选YES就可以了。2、需要同时填写语言申请和研究生申请。3、通…...

奥城大学计算机专业,美国研究生双录取的大学及可提供学位详情

美国研究生双录取的大学及可提供学位详情介绍&#xff0c;对于非常希望去美国留学但是语言基础不好&#xff0c;或语言考试多次成绩都不理想&#xff0c;已经没有信心或没有时间再次参加考试的同学&#xff0c;美国研究生双录取是最佳选择。那么你所希望去的学校开设有双录取吗…...

奥城大学计算机专业,[美国金融硕士排名2018]2018年美国硕士双录取大学名单

【www.gywlwh.com--会计】对于美国留学有想法的朋友&#xff0c;肯定听说过双录取&#xff0c;也就是有条件录取。那么美国硕士都有哪些院校是可以双录取的呢?下面就由本站小编给各位介绍一下吧。2018年美国硕士双录取大学名单1、阿拉巴马大学 全美88 位于阿拉巴马州 管理学&a…...

奥城大学计算机专业,美国研究生双录取大学有哪些?

1 阿拉巴马大学 全美88 位于阿拉巴马州管理学&#xff0c;市场学可以双录取2 东北大学 全美98 位于麻省波士顿市可以提供衔接的桥梁课程8个月3 阿德菲大学 全美125 位于纽约市可以提供MBA双录取4 威德勒大学 全美187 位于宾州可以提供MBA&#xff0c;MPA双录取5 桥港大学 全美2…...

奥城大学计算机专业,2018年美国大学硕士双录取最全名单

原标题&#xff1a;2018年美国大学硕士双录取最全名单如果你成绩一般&#xff0c;语言能力薄弱&#xff0c;但又想去美国留学该怎么办?其实&#xff0c;美国针对这类学生设置了双录取&#xff0c;学生可以先学习语言&#xff0c;之后再进行专业课的学习&#xff0c;那么&#…...

美国计算机音乐专业,美国大学音乐疗法专业Music therapy解析

音乐疗法专业介绍音乐疗法(Music therapy)主要是针对在身、心方面“有需要”进行治疗的个案&#xff0c;针对其“需要治疗”的部分&#xff0c;进行“有计划”&#xff0c;“有目的”的疗程&#xff0c;是利用乐音、节奏对生理疾病或心理疾病的患者进行治疗的一种方法。在这个方…...

日期模拟器(改变check即可 手切日期)

目录 含 2 天数 运行限制 完全日期 运行限制 星期几 运行限制 含 2 天数 https://www.lanqiao.cn/problems/1038/learning/ 小蓝特别喜欢 2&#xff0c;今年是公元 2020 年&#xff0c;他特别高兴&#xff0c;因为每天日历上都可以看到 22。 如果日历中只显示年月日&…...

微信小程序图片的垂直和水平居中,line-height无效,使用flew布局

微信小程序中&#xff0c;图片的完全居中显示&#xff0c;line-height并不能发挥效果&#xff0c; line-height可以时内部文字垂直居中显示&#xff0c;但是对于图片并未发挥效果 如图&#xff1a; 不过&#xff0c;水平居中显示&#xff0c;可以使用 text-align:center 解决方…...

微信小程序 图片缓存

问题产生&#xff1a; 需求&#xff1a;有个页面有个banner&#xff0c;不想做大面积开发&#xff08;不想后端做功能&#xff09;&#xff0c;就问我们前端同事&#xff0c;能不能根据时间来替换图片&#xff0c;能是肯定能的&#xff0c;但是客户端时间不一致会导致图片显示不…...

微信小程序图片懒加载实现

实现思路 首先设立一个数组都为false&#xff0c;让图片的高度和屏幕滚动的高度进行比较&#xff0c;当到达这个点的时候&#xff0c;数组里面对应的false变成true。当数组的false变成true的时候&#xff0c;我们让图片进行显示就可以啦。当然&#xff0c;首先我们需要判断一下…...

微信小程序 图片处理的几个样式

每天记录一点对自己来说的新内容。 1、外层包裹的view标签显示边框 示例&#xff1a; 样式&#xff1a; .viewborder {border: 3px solid #f1bb69;border-radius: 10rpx;padding: 10rpx;margin: 10px; } 2、图片边框阴影效果 示例&#xff1a; 样式&#xff1a; .icon {wi…...

微信小程序-实现保存图片功能的3种方式

点击图片预览保存 点击图片预览保存先通过wx.previewImage接口预览图片&#xff0c;然后长按图片弹出底部弹窗保存图片。这种方式的缺点是会多一个预览的步骤 详细实现代码如下&#xff1a; wx.previewImage({current: , // 当前显示图片的http链接urls: [https://www.xxx.png…...

制作一个人物介绍界面

制作一个人物介绍界面 运用image组件显示人物照片 参考微信开放文档 image组件 1.熟悉image组件的属性列表 属性类型说明srcstring图片资源地址modestring图片裁剪、缩放的模式webpboolean默认不支持webP格式lazy-loadboolean图片懒加载&#xff0c;在即将进入一定范围&…...

Linux常见的文件系统

硬盘是用来存储数据的,可以将其想象成柜子,只不过柜子是用来存储衣物的。新买来的硬盘,通常要对其进行分区并格式化,分区就如同把一个大柜按照要求分割成几个小柜子(组合衣柜);格式化就好比在每个小柜子中打入隔断,决定每个隔断的大小和位置,然后在柜门上贴上标签,标签…...

C#程序下扫描枪扫描文本自动执行解决方案

扫码枪扫描特性 扫描枪扫描文本后都有结束符&#xff0c;可以自行配置&#xff0c;如加回车 or 回车换行 or TAB。通过结束符实现自动处理后续业务逻辑。 C# WinForm控件&#xff1a; TextBox文本框 事件分析&#xff1a; Leave事件&#xff1a;就是当窗体不是当前窗体时引发的…...

Arduino I2C设备地址扫描程序

Arduino I2C设备地址扫描程序 📌主要是用于扫描挂载在外部的I2C设备地址。 📝示例程序 #include <Wire.h>void setup() {Wire.begin();Serial.begin...

使用c语言实现端口全扫描程序,用vc++实现端口扫描程序

一、前言一个端口就是一个潜在的通信通道&#xff0c;也是一个入侵通道。对计算机进行端口扫描能得到许多有用的信息。进行扫描的方法有多种&#xff0c;可以手动进行扫描&#xff0c;也可以用端口扫描软件进行。在手工进行扫描时&#xff0c;需要熟悉各种命令&#xff0c;对命…...

UltraISO 制作U盘启动盘

1、 从Ubuntu官网http://cn.ubuntu.com/download/下载系统的iso文件 用来制作的U盘需要是FAT32格式的&#xff0c;可以通过格式化U盘更改&#xff08;注意&#xff0c;如果U盘已经写入过隐藏分区了&#xff0c;需要在磁盘管理里面删除相关隐藏分区然后合并为一个大分区后…...

8年一线.NET开发程序员求职

本人目前找工作&#xff0c;8年一线.NET开发经验&#xff0c;从事过电子政务、AI客服和企业级文档安全系统的开发&#xff0c;以及互联网招聘网站的架构设计。目前薪资18K/月&#xff0c;最低期望薪资&#xff1a;20K/月。意向地&#xff1a;北京&#xff0c;意向职位&#xff…...

王道程序员求职宝典 pdf

链接&#xff1a;https://pan.baidu.com/s/14Fjt0yYusiPhocfDNoYy8A 提取码&#xff1a;2rwl 侵删...

必看!前辈们总结出的程序员找工作遇到的坑

最近不管是裁员潮&#xff0c;还是被炒的火热的 996 有赞事件&#xff0c;感觉大家都不容易&#xff0c;今天给大家推荐的就是程序员找工作黑名单的开源库。&#xff08;结尾带链接&#xff09; 程序员给人的印象就是&#xff1a;宅&#xff0c;不爱说话&#xff0c;埋头苦敲。…...

个人经历:谈一谈的程序员求职途径

个人经历&#xff1a;谈一谈的程序员求职途径互联网招聘网站的确是五花八门&#xff0c;种类繁多&#xff0c;在投递简历&#xff0c;接听面试电话的过程中&#xff0c;要擦亮眼睛&#xff0c;慎重选择和沟通。我是去年跳槽的&#xff0c;下面就来说说我投递简历的过程&#xf…...

为什么没有工作经验的程序员很难找工作?

主要是和大量的培训出来的程序员有关&#xff0c;很多培训机构都变了味&#xff0c;变得越来越商业化。 第一&#xff0c;招生门槛越来越低。大部分培训机构为了赚钱&#xff0c;不管什么学员都收&#xff0c;非专业的收&#xff0c;高中毕业的也收。一个班里几十号人&#xf…...

漫画:程序员找工作—外包公司

【回复“1024”&#xff0c;送你一个特别推送】今天推送一篇一位在刚刚被阿里收购了饿了么工作的程序员朋友画的一幅漫画文章&#xff0c;其实也不是主要推他画的漫画&#xff0c;核心想推送的是他最近制作了一套程序员专用的微信表情包&#xff0c;希望有兴趣的朋友可以去下载…...

亲身经历,大龄程序员找工作,为什么这么难...

背景 临近年底&#xff0c;公司还在招人&#xff0c;可筛选的人才真是越来越少&#xff0c;这可能是因为大家都在等年终奖吧。于是在简历筛选时&#xff0c;将学历和年龄都适当的放松了。正因为如此&#xff0c;面试了不少大龄的程序员。 网络上一直有讨论大龄程序员找工作困…...

为什么有些人学完Java后找不到工作,原因是什么?

经常会听到一些人抱怨&#xff0c;明明感觉自己已经学完了Java&#xff0c;为什么面试时却屡屡被拒&#xff0c;始终找不到一份合适的Java开发工作&#xff0c;究竟是什么原因呢&#xff1f;下面&#xff0c;我就带大家分析一下学完Java后找不到工作的具体原因。 1、专业技术…...

南京和上海找工作的区别

上篇文章我分析了一下在南京工作和在上海工作的区别&#xff0c;这篇文章我来分析一下在南京和在上海找工作的区别。实际上在上篇文章中我也大概提到了一些&#xff0c;但是相对来说不是很具体。在来上海之前我在南京也面试了几家公司&#xff0c;公司规模都不是很大。第一家是…...

互联网公司裁员,中年失业找不到工作,大龄程序员的出路在哪里

对于最近10年互联网一定是一个最好的赛道和职业发展路径&#xff0c;年薪百万也是常事。但是最近一系列的事件&#xff0c;类似国家的互联网反垄断&#xff0c;共同富裕&#xff0c;45岁的大龄Java程序员求助总理找不到工作&#xff0c;类似阿里&#xff0c;拼多多等中概互联网…...

如何找到好工作?

​什么样的工作才是好工作呢&#xff1f;我们一起从下面几部分来详细聊聊&#xff1a; 第一部分&#xff1a;找工作要考虑清楚什么&#xff1f; 第二部分&#xff1a;如何选择工作地点&#xff1f; 第三部分&#xff1a;为什么你不应该裸辞&#xff1f; 第四部分&#xff1a;为…...

.NET餐厅管理系统user数据帮助类查找用户姓名、判断用户电话号码是已否存在、获取用户信息、获取管理员权限、注册

#region//查找用户姓名 /// <summary> /// 查找用户姓名 /// </summary> /// <param name"uid"></param> /// <returns></returns> public string GetUName(string uid) …...

装修行业怎么获客

1、粉丝营销 我们以充满想象力的方法满足顾客的期望值&#xff0c;但要争取新客户也愈发困难&#xff0c;因此采取“为客户终身供应”的思维&#xff0c;以快捷周到的服务、较低的价格来为顾客提供长期供应服务&#xff0c;获取利润微薄但稳定的利润。现在很多平台都可以运作粉…...

弘辽科技浅谈移动互联网时代如何定位品牌

原标题《弘辽科技浅谈移动互联网时代如何定位品牌》 移动互联网时代&#xff0c;品牌和顾客之间横亘着一个巨大的信息海洋。如果顾客知道你&#xff0c;那么你和顾客无限近。如果顾客不知道你&#xff0c;那么你跟顾客无限远。 我们看一下智能手机时代的一个特征&#xff0c;…...

互联网——降级论

几乎一年没有写博客了&#xff0c;说没时间那是借口&#xff0c;唯一的原因是&#xff0c;年纪越大越发觉自己肤浅。有些想法还没提笔&#xff0c;就发现很幼稚&#xff0c;就不敢发出来贻笑大方了。这次先给大家说个小故事&#xff1a; 从前有三个屌丝&#xff0c;聚在一起做网…...

谈谈互联网推广:从了解用户开始

2016年&#xff0c;也是互联网发展飞跃的一年&#xff0c;在互联网推广的盛世的现在&#xff0c;大到国际知名企业&#xff0c;小到面膜微商&#xff0c;都愿意投资在互联网营销&#xff0c;对于草根站长和小企业来说&#xff0c;更多的人会选择SEO营销推广&#xff0c;注意&am…...

搜索引擎排名威新hfqjwl_如何提高搜索引擎排名?

为了提高搜索引擎的排名&#xff0c;有必要对网站进行多维度的推广&#xff0c;而不能忽视推广的重点&#xff0c;从百度关键词精准定位、内容、网站结构和连接等方面作为立足点进行持续改进&#xff0c;此外&#xff0c;我们必须把客户体验放在首位&#xff0c;只有这样才能快…...

更好用计算机怎么打,电脑输入法哪个好用(最受欢迎的7大输入法对比详情)...

输入法推荐关键看准确度一般来说输入法的主要用途就是为了打字与人交流交流或者记录文字&#xff0c;那么在看输入法推荐时一个重要的点就是输入法的速度以及准确度。对于这一点&#xff0c;不同人有着不同的输入倾向&#xff0c;比如9宫格或是26宫格&#xff0c;但是不论使用哪…...

12.3 - 每日一题 - 408

每日一句&#xff1a;现在很痛苦&#xff0c;等过阵子回头看看&#xff0c;会发现其实那都不算事。 数据结构 1 哈希函数为H&#xff08;key&#xff09;key MOD 11&#xff0c;表中已存入关键字分别为7、14&#xff0c;37、60和83的五个记录&#xff0c;此时哈希表的装填因子…...

简历的项目经验该怎么写?看过来啦。文章结尾内含简历模板福利

你是否还在为简历而烦恼&#xff0c;是的&#xff0c;我来帮助你了。作为一个分享达人&#xff0c;自然碰到好的东西也想分享给你们啦&#xff01;&#xff08;主要也是为了我自己&#xff09; 项目一 米乐淘网上商城 项目名称&#xff1a; 米乐淘网上商城 开发环境&#x…...

一些并查集的题~~判树,连通,带权

目录 A-Wireless Network B-The Suspects C - How Many Tables D - How Many Answers Are Wrong G - Supermarket L - 小希的迷宫 M - Is It A Tree&#xff1f; J - A Bug‘s Life E - 食物链 A-Wireless Network POJ - 2236 ​ 翻译&#xff1a; 东南亚发生了地震…...

2021年江苏制造业百强企业排行榜:24家苏州企业营收比重达43.66%(附年榜TOP100详单)

榜单解读&#xff1a; 江苏省企业联合会发布了“2021江苏制造业百强企业榜单”。榜单以江苏企业2020年度营业收入为依据进行排序。榜单企业总计营收达45832.33亿元。 依据榜单可知&#xff1a;1&#xff09;榜单企业营收均超过80亿元&#xff0c;其中11家企业突破1000亿元&am…...

2021年安徽省服务业企业排行榜:有18家企业营收超过100亿元(附年榜TOP77详单)

榜单解读&#xff1a; 安徽省企业联合会、省企业家联合会发布了2021安徽省服务业企业榜单&#xff0c;榜单以安徽企业2020营业收入为依据进行排序。榜单企业有23家入围安徽百强企业名单&#xff0c;且榜单企业总营收约为5509.52亿元。 依据榜单可知&#xff1a;1&#xff09;…...

python儿童编程例子代码-少儿编程之 Python

一个孩子爸爸联系我&#xff0c;想咨询如果让娃学习Python。我思考了好久&#xff0c;两个问题一直困扰着我&#xff1a; 1. Why Python?图片发自简书App 这是我在网上找到的Python具体应用的领域&#xff0c;大人学习可以从自己的行业入手&#xff0c;那么如何让小孩子入门呢…...

带有风的诗词_含有风的诗句_诗词完美版

《含有风的诗句》含有风的诗句(一)&#xff1a;1、却余人物淘难尽&#xff0c;又挟风雪作远游。梁启超《太平洋遇雨》2、夜来风雨声&#xff0c;花落知多少。孟浩然《春晓》3、春风得意马蹄疾&#xff0c;一日看尽长安花。孟郊《登科后》4、随风潜入夜&#xff0c;润物细无声。…...

儿童背诵古诗词-3

1 春江花月夜-张若虚 春江潮水连海平&#xff0c;海上明月共潮生 滟滟随波千万里&#xff0c;何处春江无月明 江流宛转绕芳甸&#xff0c;月照花林皆似霰 空里流霜不觉飞&#xff0c;汀上白沙看不见 江天一色无纤尘&#xff0c;皎皎空中孤月轮 江畔何人初见月&#xff0…...

儿童诗词学习

鹿寨&#xff08;王维&#xff09; 空山不见人&#xff0c;但闻人语响。 返景入深林&#xff0c;复照青苔上。 独坐敬亭山&#xff08;李白&#xff09; 众鸟高飞尽&#xff0c;孤云独去闲。 相看两不厌&#xff0c;只有敬亭山。 杂诗&#xff08;王维&#xff09; 君自…...

关于某某大学校园网认证系统的一些工作

由于我们学校的校园网认证是弹出页面的那种&#xff0c;每次输密码都会很蛋疼&#xff0c;于是大一的时候我写过一个宏&#xff0c;每次打开认证界面按一下设定好的键就可以自动填上账号密码了&#xff0c;用了将近三年&#xff0c;效果一直不错。 但最近我发现了一个新的问题…...

校园网认证系统-802.1x协议介绍

本文转自http://hi.baidu.com/xinghui100/blog/item/e0edb36dbbacb8fe43169405.html802&#xff0e;1x协议解析 802.1X协议是由(美)电气与电子工程师协会提出&#xff0c;刚刚完成标准化的一个符合IEEE 802协议集的局域网接入控制协议&#xff0c;其全称为基于端口的访问控制协…...

重构信息茧房

我现在越来越反感弹幕的存在。其罪有二&#xff1a;一为扰乱我感受视频原有的内容&#xff1b;二为传播戾气。首罪对我危害最大&#xff0c;回顾以往&#xff0c;视频上的弹幕是如何将浮躁、快节奏、段子等互联网无聊产物潜移默化的塞入我的思维。它带给我快乐的价值远远低于收…...

Ending Prison Break(越狱)

用了三天时间看完了《Prison Break》,这是看完了《Desperate Housewives》后看的第二部美国电视剧&#xff0c;还算不错&#xff0c;虽然只有一季&#xff0c;但绝对能让人过把瘾了&#xff0c;一个和desperate housewives 完全不同风格的剧集&#xff0c;每一季都环环相扣&…...

图森计划裁员25%/ 特斯拉被曝将冻结招聘/ 天才黑客Geohot从推特辞职…今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI大家好&#xff0c;今天是12月22日星期四&#xff0c;距离周末还有两天&#xff0c;距离圣诞还有三天。今天科技圈都有哪些大事发生&#xff0c;快来和日报君一起康康&#xff5e;图森计划裁员25%当地时间周三&#xff0c;图森未来宣布…...

我眼中的光明·第四周

冰冻三尺一 冰冻三尺&#xff0c;非一日之寒。日积月累&#xff0c;方能见效。见效越快意味着越不能持久。珍惜每一分钟的给予&#xff0c;珍惜在一起的每一刻钟。我们千万不要和自己心爱的人之间冰冻三尺。如果有了矛盾及时解决&#xff0c;将这一点点的矛盾之冰及时融化。因为…...

《越狱》中的项目管理 [原稿]

很早的时候写的一篇文章&#xff0c;那时候还只是个主管&#xff0c;文章发表于《商界评论》&#xff08;2007第六期&#xff09;&#xff0c;转载请注明出处 五一期间&#xff0c;又看了一遍《越狱》的第一季。其实&#xff0c;越狱并非一个新鲜的题材&#xff0c;记得之前就有…...

iOS时间那点事

NSDate NSDate对象用来表示一个具体的时间点。NSDate是一个类簇&#xff0c;我们所使用的NSDate对象&#xff0c;都是NSDate的私有子类的实体。NSDate存储的是GMT时间&#xff0c;使用的时候会根据 当前应用 指定的 时区 进行时间上的增减&#xff0c;以供计算或显示。 可以快…...

《越狱》穿帮集锦(第一季)

第一集里面MS与哥哥在粉刷墙壁&#xff08;注意、刷子是白色的&#xff09;在下工返监时候交接工具&#xff0c;白刷子居然变成绿的了。第二集里面&#xff0c;MS从操场上的长椅下拆下来螺栓&#xff0c;计划可以磨成一把头部为正六面体的改锥。&#xff08;注意、螺栓与地面的…...

饥荒 阿里云服务器搭建记录

获得一个服务器 我选的是阿里云学生免费体验的服务器 ubuntu 4核(vCPU) 8 GiB 3Mbps 带宽 饥荒 照搬的 饥荒云服务器搭建流程【Steam】【阿里云】 安装工具 sudo apt-get update #更新软件源 sudo apt-get upgrade #更新软件 sudo apt-get install dos2unix #转换格式工具…...

饥荒开服(含各种踩雷)

饥荒开服(含各种踩雷) 纯小白,用过Mac电脑.这就是我全部Linux基础了,结果搭建了一个上午才勉强搭出来过程中感觉比饥荒还饥荒.所以我在这里分享一下我自己的搭建过程…我是使用的阿里云的Ubuntu 18.04 64位的服务器,我尽量会把出错误的各种情况说清楚 0.安装步骤 安装依赖下载…...

饥荒 出现error during initialization的解决方法

最先我的电脑是可以运行饥荒的&#xff0c;然而&#xff0c;我重装系统后&#xff0c;打开饥荒这款游戏。游戏黑屏显示error during initialization错误。我在网上找了很多方法&#xff0c;花了很多时间&#xff0c;各种折腾。最终&#xff0c;完美解决了。或许&#xff0c;我的…...

在centos上搭建饥荒服务器

用这篇文章记录一下我搭建饥荒服务器的过程&#xff0c;在阅读参考本文章前&#xff0c;您需要&#xff1a; 拥有安装CentOS的云服务器&#xff0c;使用其他操作系统在部署饥荒服务器的时候可能会出现问题包含cluster_token的地图文件夹。这部分操作比较简单&#xff0c;现在在…...

饥荒服务器怎么改成无限模式,tgp饥荒服务器搭建怎么搭建无尽模式

匿名用户1级2017-03-08 回答TGP饥荒专用服务器创建地表及洞穴的方法还有很多玩家们不太熟悉&#xff0c;具体该如何操作&#xff1f;接下来为大家带来ldquo;安菲儿公主rdquo;分享的详细操作玩法&#xff0c;一起来看看吧。服务器搭建图文教程点击查看首先创建一个地表服务器1、…...

【MySQL】MyCAT三大配置文件详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公…...

【学习分享】C语言程序设计思维导图—4:基本输入输出

分享在华为云Classroom中学习C语言时做的思维导图。 在课程里&#xff0c;第四章为基本输入输出和顺序程序设计&#xff0c;在学习总结的过程中&#xff0c;把顺序程序设计放到了下一章节&#xff0c;将三种基本结构放到了一章里。下载链接&#xff1a;https://bbs.huaweicloud…...

CAD一个命令快速绘制箭头,真的是敲极快!

CAD中利用多段线可以快速绘制一个箭头&#xff0c;具体步骤如下&#xff1a; 执行多段线【命令PL】&#xff0c;按下空格 鼠标指定起点&#xff0c;单击一下左键&#xff0c;再输入命令【w】&#xff0c;按下空格 输入箭头直线段的宽度&#xff0c;指定起点宽度这里我们以100为…...

如何使用CAD编辑器来画箭头

我们在CAD图纸中一般都是看见有很多的指示箭头&#xff0c;在图纸中能够起到很好的指示作用。那么&#xff0c;如何使用CAD编辑器来画箭头呢&#xff1f;相信很多的小伙伴们都想要知道具体的操作方法&#xff0c;那下面小编本编教程就来教教大家&#xff0c;希望对你们有帮助&a…...

天正引出标注lisp_CAD中怎么画引出标注?

展开全部做法标注、引出标注都是天正命令的名称&#xff0c;在CAD中全部是用多重引线来完成。32313133353236313431303231363533e78988e69d8331333433646436先说天正&#xff0c;比较简单。做法标注&#xff1a;天正菜单中&#xff0c;符号标注——做法标注&#xff0c;出现对话…...

cad的半截箭头快捷键

le...

lisp画弯箭头_AutoCAD中怎么画箭头 CAD画箭头的方法

看到网上很多人不知道CAD怎么画箭头的方法&#xff0c;AutoCAD中怎么画箭头&#xff1f;其实在CAD中绘制箭头的方法很多&#xff0c;CAD培训的老师就自己常用的方法说说吧&#xff1a;1.如果你要标注的话,系统会自动画出箭头,如果想改变箭头的大小可以在-------修改----箭头文字…...

vue 运行项目浏览器页面显示“该网页无法正常运作”

项目运行成功并自动弹出 但是页面上显示&#xff1a; 确定问题&#xff1a; 检查build/webpack.dev.conf.js文件中是否存在下面代码&#xff1a; disableHostCheck: true, https: true,如果有的话&#xff0c;确定一下是否用的https进行的访问&#xff0c;如果用https进行访…...

asp.net 调试 无法显示该网页

在用VS2008调试网站的时候&#xff0c;突然页面不能正常显示了&#xff0c;IE显示“无法显示该网页”。 症状一&#xff1a;  IE地址栏里面显示的端口号和桌面任务栏右下角“ASP.NET Development Server”的端口不一致&#xff0c;而把IE地址栏的端口号改成“ASP.NET Develo…...

SAP F1 无法显示该网页 完美解决方案(不用重装SAP)

SAP F1或HTML页面都找不到页面完美解决方案(不用重装SAP) 问题截图&#xff1a; 图一 原因&#xff1a; 无法显示该网页&#xff0c;最近总被这样的问题困扰&#xff0c;这几天重装两次发现&#xff0c;偶尔用电脑管家清理一下病毒&#xff0c;总是发现有这样的信息存在&…...

vs无法显示该网页

看了这篇文章&#xff08;http://hi.baidu.com/leilongbing/blog/item/fa3a3253a39f0a060df3e3f1.html&#xff09;解决了问题&#xff1a; 调试Web程序的时候&#xff0c;突然页面不能显示出来&#xff0c;老是显示着“网页无法显示”的页面。云里雾里&#xff0c;鬼知道是怎…...

准备转行入坑iOS开发的大灯,第一步-第一篇:基本要求和技术趋势

毛笔照片 - 加上直式文字&#xff0c;更显中国水墨风说到App开发的工作时常令人兴奋&#xff0c;而且报酬也好。可以创造令人惊叹的产品&#xff0c;让人们的生活更美好&#xff0c;并在一个舒适温暖的办公室里度过一整天... 梦想总是美好的。如果没有开始行动&#xff0c;梦终…...

解决关于腾讯会议黑屏问题(ThinkpadE420型号)

近期&#xff0c;由于2020年1月的疫情影响&#xff0c;开学时间一度被延期&#xff0c;毕设答辩被安排到线上&#xff0c;学院安排使用 腾讯会议app进行线上答辩。然而在测试阶段发现问题&#xff0c;打开页面出现黑屏问题&#xff0c;现就解决方案分享给出现类似问题的你。 问…...

iPad 3 即将发布,网传价格,IPD2降价50$ 新功能猜测

中关村在线消息&#xff1a;近几日苹果 iPad 3明显受到了更多用户的关注&#xff0c;互联网中关于此款 产品的消息早已被传的沸沸扬扬&#xff0c;之前曾有国外媒体曝出 苹果iPad 3将会于3月9日发布&#xff0c;这个时间与 iPad 2的发布时间相差无几&#xff0c;而今天我们也发…...

苹果gamecenter未能连接服务器,win7系统GameCenter无法连接服务器的解决方法

很多小伙伴都遇到过win7系统GameCenter无法连接服务器的困惑吧&#xff0c;一些朋友看过网上零散的win7系统GameCenter无法连接服务器的处理方法&#xff0c;并没有完完全全明白win7系统GameCenter无法连接服务器是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xf…...

windows无法连接到打印机

项目场景&#xff1a;windows无法连接到打印机 windows无法连接到打印机。本地打印后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机 问题描述 解决方案&#xff1a; 搜索服务&#xff0c;点击打开 搜索Print Spooler 查看状态是否运行&#xff0c;…...

win7进去提醒未能连接一个服务器,win7系统提示“未能连接一个windows服务”这个情况如何解决...

win7系统提示“未能连接一个windows服务”这个情况如何解决发布时间&#xff1a;2020-01-14小编&#xff1a;yongzhi浏览数&#xff1a;最近呢&#xff0c;小编收到了一些小伙伴的来信&#xff0c;他们说&#xff1a;重装win7系统过后&#xff0c;就会弹出一个“未能连接一个wi…...

电脑显示未连接一个服务器怎么处理,Win7开机提示“未能连接一个windows服务”的解决方法...

最近有一位Win7系统用户&#xff0c;开机之后系统出现提示“未能连接一个windows服务”&#xff0c;上面显示Windows无法连接到System Event Notification Service服务&#xff0c;肯定是服务项出现了问题。那么我们该如何解决这个问题&#xff1f;下面装机之家分享一下Win7开机…...

老是未能连接一个window服务器,未能连接一个Windows服务 怎么回事

打开【运行】&#xff0c;然后输入CMD&#xff1b;输入【NETSH WINSOCK RESET CATALOG】命令&#xff0c;然后重新启动【System Event Notification Service】服务&#xff1b;输入【NETSH WINSOCK RESET CATALOG】命令&#xff1b;如果不行在安全模式上输入重启。以下是详细介…...

HarmonyOS内核(Lite-mOS)开发——任务管理

任务管理简介基本概念 1、从系统的角度看&#xff0c;任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独 立于其它任务运行。 2、LiteOS的任务模块可以给用户提供多个任务&#xff0c;实现了任务之间的切换和通信&#xff0c;…...

windows7未能连接一个windows服务(无法连接网络)的解决方法

今天下午不知道怎么搞的&#xff0c;就搞的无线不可以用了&#xff0c;出现了个 “windows7未能连接一个windows服务”问题&#xff0c;而且连eclipse都打不开了。 晚上在网上找了一个方法&#xff0c;终于搞定了。 方法&#xff1a;是重新安装了下360&#xff0c;然后它自动…...

如何解决win7开机提示未能连接一个Windows服务

1.以安全模式打开电脑&#xff1b; 2.打开运行菜单&#xff0c;在运行对话框中输入CMD&#xff0c;回车打开命令对话框&#xff1b; 3.然后在命令对话框中输入“NETSH WINSOCK RESET CATALOG”命令&#xff0c;点击Enter&#xff1b; 4.重启电脑。...

windos未能链接服务器,提示Windows没法连接到System Event Notification Service服务

是win7吗?百度来的&#xff0c;您试试&#xff01;Windows7系统无法连接到System Event Notification Service服务的解决方法第一步&#xff1a;点击开始&#xff0c;在搜索栏中输入CMD&#xff0c;右键点击程序下的cmd&#xff0c;在右键菜单中左键点击&#xff1a;以管理员身…...

windows 7 开机错误 未能连接到一个Windows服务

Windows无法连接到system event notification service服务。此问题阻止标准用户登录系统。作为管理员用户&#xff0c;您可以复查系统事件日志&#xff0c;以获得有关此服务未响应原因的详细信息。 如下图&#xff1a; 莫名其妙突然电脑死机了&#xff0c;重启后就出现了上述问…...

黑镜.潘达斯奈基 高清中字

链接&#xff1a;https://pan.baidu.com/s/1Y8tHh3ss8UdxZT4lqMPvlw 提取码&#xff1a;kysl...

《黑镜》(Black Mirror)

《黑镜》&#xff08;Black Mirror&#xff09;是英国电视4台&#xff08;Channel 4&#xff09;及美国NetFlix公司出品的迷你电视剧。由英国制片人查理布洛克编剧及制作&#xff0c;包括第一季、第二季、圣诞特辑和第三季构成 [1] 。 该剧分别以多个建构于现代科技背景的独立故…...

豆瓣时间“黑镜人生”的推荐书单

前言 今天在豆瓣上购买了《黑镜人生–网络生活的传播学肖像》这个专栏。专栏里推荐了25本中文书单&#xff0c;应该都还不错。特此整理书单如下。 书单推荐 《娱乐至死》 《美丽新世界》 《读屏时代》 《浅薄》 《上瘾》 《群体性孤独》 《自恋主义文化》 《自恋时代》…...

Google设想将《黑镜》情节变为现实,但要你的隐私作交换

译者 | shawn,Just 出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09; Google 靠着收集和利用用户的信息造就了数十亿美元的业务。近日&#xff0c;外媒 The Verge 发现了一部 Google 内部制作的短片&#xff0c;这部短片非常大胆地介绍了一些 Goog…...

科技公司带来的信任冲突:“黑镜般的世界”你喜欢吗?

“小提示&#xff1a;后台回复关键词“2.0图谱”可获取《2021中国数据智能产业图谱2.0版》高清PDF版原图。大数据产业创新服务媒体——聚焦数据 改变商业刚刚过去的2020是充满变数的一年&#xff0c;对于众多金融科技公司、电商平台也是难忘的一年&#xff0c;之前很多无序的模…...

波士顿动力机器狗上街执法,“黑镜”成真了?

本文转载自 新智元 我们是否正生活在一个赛博朋克荒诞的世界里&#xff1f; 近日&#xff0c;如同《黑镜》中的一幕出现了&#xff01; 这天&#xff0c;摄像师Daniel Valls正在街上闲逛&#xff0c;突然听见一阵骚动&#xff0c;职业的本能让他拿起摄影机录下了这荒诞的一幕…...

现实黑镜:将死去好友复活为AI

人们很难接受挚爱之人的逝世&#xff0c;当他们走得突然的时候尤为如此。但感谢发展迅速的人工智能&#xff0c;也许很快你就不必再放手了。当然&#xff0c;也不是完全不放开。俄罗斯人工智能创业公司的CEO和联合创始人 Eugenia Kuyda就是这样的例子&#xff0c;最近她将最好的…...

人工智能的“黑镜”——计算机人脸识别!

安全专家警告说&#xff0c;人脸识别技术可能会造成大规模的隐私侵犯&#xff0c;因为机器人在你走在街上时默默地监视着你。 有人担心“伪装面部识别”技术可能侵蚀个人匿名。 根据IEEE计算机视觉研讨会国际会议的一份新研究论文&#xff0c;人工智能可能很快就能够识别被服装…...

产品经理必看电影:《黑镜》(Black Mirror)

​ 叫《黑镜》为电影&#xff0c;有些出入。 《黑镜》是一部迷你剧&#xff0c;2011年在英国开播&#xff0c;这部剧一经播出就在世界范围内引起了巨大的收视热潮&#xff0c;其实这部剧并没有什么高端的特效镜头&#xff0c;拍摄手法虽然精良&#xff0c;但是也并不是能够很出…...

观影:《黑镜》

转自&#xff1a; http://weibo.com/ttarticle/p/show?id2309404035317026935153 最危险的状态&#xff0c;就是永远舒适&#xff5c;观影&#xff1a;《黑镜》KY主创们 2016-10-27 22:20:14 举报阅读数&#xff1a;4590一部用未来讨论当下的好剧。​《黑镜》第三季刚播出不久…...

《奈飞文化手册》的一点启发

介绍 奈飞文化手册&#xff0c;是前奈飞首席人才官帕蒂麦考德所写的一本书。奈飞是一家颇具传奇色彩的公司&#xff0c;它与Facebook、亚马逊、谷歌并称“美股四剑 客”。相较于其他三家公司&#xff0c;中国读者对奈飞的了解较少&#xff0c;印象最深的可能是它出品的 《纸牌…...

IPFS 深入浅出:从《黑镜》说起

翻译 | 老曹 编辑 | 波波 元旦期间&#xff0c;《黑镜&#xff1a;潘达斯奈基》的互动式剧情唬住了不少人。 可在自小玩游戏的营长看来&#xff0c;这个互动式剧情却不是什么新鲜玩意&#xff0c;十年前的《质量效应》游戏早就把它玩腻了&#xff0c;而游戏剧情的最终结局却是…...

电视剧 | 黑镜S5E2 碎片

Episode: Black Mirror S5E2 Smithereens Service: Netflix Author: WiZ Created: 11th June 2019 Version: 1.0 通话呼叫转移 1.剧情&#xff08;剧透&#xff09; 克里斯是一名司机&#xff0c;几年前车祸带走了他的未婚妻。他把罪过归咎于一个热门社交应用“碎片”&#x…...

wordpress主题 黑镜主题 2.0下载 卡片式主题 原创正版设计素材教程网站模板

黑镜主题是一款卡片式多图流的wordpress模板&#xff0c;黑白灰简约风格&#xff0c;非常适合图片作品分享、站长素材下载类型网站使用。 响应式布局&#xff0c;完美匹配电脑、平板、和移动端。个性化后台菜单&#xff0c;纯手工原生代码&#xff0c;未集成任何第三方插件&am…...

Mask RCNN 实战(二)--像黑镜一样屏蔽图片和视频中的人和物体

Mask RCNN&#xff1a;项目地址 《黑镜&#xff1a;圣诞特别篇》里&#xff0c;出现了“屏蔽”技术。不喜欢一个人&#xff0c;可以屏蔽他。这样&#xff0c;你们就再也看不见对方&#xff0c;也无法打电话、写信。甚至你看到电视机上的她和照片上的她&#xff0c;都只有一团模…...

html文字破碎特效,CSS3黑镜破裂文本效果

CSS语言&#xff1a;CSSSCSS确定body {display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #000;overflow: hidden;}h1 {position: relative;font-family: Montserrat, Arial, sans-serif;font-size: calc(20px 5vw);font-weight: 7…...

一群机器狗亮相MIT,集体后空翻、踢足球,网友:去看黑镜压压惊

2019-11-09 13:06:12 鱼羊 乾明 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在&#xff0c;机器人开始成群出动了…… 一起后空翻&#xff0c;而且每一个都能稳稳落地&#xff1a; 因为比较小巧&#xff0c;它们还能够隐藏起来&#xff0c;来个猝不及防的后空翻&#xff1a; …...

爱我吧

十年前他&#xff0c;是家财过亿的富家公子他&#xff0c;是默默无名的新人舞者十年后他&#xff0c;成了受人追捧的亚洲视帝(终于想到合适的词语了 汗)他&#xff0c;成了高层力捧的tvb小生台前他与他是相交多年的知交老死幕后他与他是暧昧不清的情感纠格 一晃十年身份变了&am…...