Flink底层原理解析:案例解析(第37天)

系列文章目录


一、flink架构
二、Flink底层原理解析
三、Flink应用场景解析
四、fink入门案例解析

文章目录

  • 系列文章目录
  • 前言
  • 一、flink架构
    • 1. 作业管理器(JobManager)
    • 2. 资源管理器(ResourceManager)
    • 3. 任务管理器(TaskManager)
    • 4. 分发器(Dispatcher)
  • 二、Flink底层原理解析
    • 1. 数据流模型
      • 1.1 例1
    • 2. 任务调度与执行
      • 2.1 例2
    • 3. 内存管理
      • 3.1 例3
    • 4. 容错机制
      • 4.1 例4
  • 三、Flink应用场景解析
    • 1. 实时数据分析
      • 1.1 例子:网络流量监控
    • 2. 社交媒体分析
      • 2.1 例子:实时用户行为分析
    • 3. 交易监控
      • 3.1 例子:金融交易实时监控
    • 4. 日志处理
      • 4.1 例子:大规模日志实时处理
    • 5. 物联网(IoT)
      • 5.1 例子:设备数据实时收集和处理
  • 四、fink入门案例解析
    • 1. 滚动窗口(tumble window)
      • 1.1 处理时间演示
      • 1.2 事件时间演示
      • 1.3 窗口的时间计算
    • 2. 滑动窗口(hop)
      • 2.1阿里云: SQL-入门案例
    • 3. 会话窗口(session)
      • 3.1 SQL案例实现
    • 4. 聚合窗口(over)
      • 4.1. 根据时间聚合代码实现
      • 4.2. 根据行号聚合代码实现


前言

Apache Flink 是一个开源的流处理框架,用于处理无界和有界数据流。其底层原理复杂而精细,涉及到数据流模型、任务调度与执行、内存管理、容错机制等多个方面。本文是对 Flink 底层原理的详细分析,并尝试通过举例来说明这些原理。


提示:以下是本篇文章正文内容,下面案例可供参考

一、flink架构

在这里插入图片描述
在这里插入图片描述

Flink是一个用于有状态并行数据流处理的分布式计算引擎,其运行时架构主要包括四个核心组件:作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager)以及分发器(Dispatcher)。以下是这些组件的详细功能介绍:

1. 作业管理器(JobManager)

  • 功能:作业管理器是单个应用程序的主线程,每个应用程序都有一个单独的JobManager进行控制。它负责接收并执行应用程序,这些应用程序通常包含作业图(JobGraph)、逻辑数据流图(logical dataflow graph)以及一个打包了所有类、库和其他资源的JAR包。
  • 作用:JobManager会将JobGraph转换成物理层面的数据流图,即执行图(Execution Graph),这个图包含了所有可以并发执行的任务。JobManager还会向ResourceManager请求执行任务所需的资源(即TaskManager中的插槽),一旦获取到足够的资源,就会将执行图分发到TaskManager上执行。同时,JobManager还负责所有需要中央协调的操作,如检查点(checkpoint)的协调。

2. 资源管理器(ResourceManager)

  • 功能:资源管理器负责管理TaskManager的插槽(slot),slot是Flink中定义的处理资源的最小单元。Flink为不同的环境和资源管理工具提供了不同的资源管理器,如YARN、Mesos、Kubernetes以及standalone部署。
  • 作用:当JobManager申请slot资源时,ResourceManager会将有空闲的TaskManager分配给JobManager。如果ResourceManager没有足够的slot来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

3. 任务管理器(TaskManager)

  • 功能:任务管理器是Flink的工作进程,负责执行JobManager分配的任务。Flink集群中通常会运行多个TaskManager进程,每个TaskManager都包含一定数量的插槽(slots),插槽的数量限制了TaskManager能够执行的任务数量。
  • 作用:TaskManager启动后会向ResourceManager注册它的插槽,并在收到ResourceManager的指令后,向JobManager提供一个或多个插槽资源。JobManager随后会将任务分配到这些插槽中执行。在运行过程中,同一个应用程序中不同的TaskManager进程可以进行数据交换。

4. 分发器(Dispatcher)

  • 功能:分发器可以跨作业运行,并为应用程序提供了REST接口。它的主要作用是在应用被提交执行时,分发并将应用移交给一个JobManager。
  • 作用:Dispatcher还会启动一个Web UI,用于方便地展示和监控作业的执行。然而,Dispatcher在架构中可能并不是必须的,这取决于应用提交运行的方式。
    综上所述,Flink的四大组件在运行时协同工作,共同管理流应用程序的执行。每个组件都承担着特定的功能和作用,确保了Flink能够高效地处理数据流。

二、Flink底层原理解析

Apache Flink 是一个开源的流处理框架,用于处理无界和有界数据流。其底层原理复杂而精细,涉及到数据流模型、任务调度与执行、内存管理、容错机制等多个方面。以下是对 Flink 底层原理的详细分析,并尝试通过举例来说明这些原理。

1. 数据流模型

核心概念:

  • 事件时间(Event Time):基于事件本身的时间戳进行处理,适用于有时间顺序的数据流。这意味着即使数据因为网络延迟等原因到达系统的时间不一致,Flink 也会根据事件的时间戳来重新排序并处理数据。
  • 处理时间(Processing Time):基于数据处理开始或结束的时间进行处理,适用于无明确时间顺序的数据流。这种处理方式较为简单,但可能无法准确反映数据的实际顺序。
  • 窗口(Window):将连续事件划分为时间片或数据片进行聚合分析。窗口是 Flink 中处理数据流的关键机制之一,它允许开发者定义时间窗口(如滚动窗口、滑动窗口等)来对数据进行聚合操作。

1.1 例1

假设我们有一个实时交易系统,需要统计每分钟的交易数量。在这个场景下,我们可以使用 Flink 的事件时间窗口来处理数据流。每个交易事件都会携带一个时间戳(即事件发生的时间),Flink 会根据这个时间戳将交易事件分配到对应的时间窗口中,并进行聚合计算。这样,即使交易事件因为网络延迟等原因没有立即到达系统,Flink 也能保证最终统计结果的准确性。

2. 任务调度与执行

核心概念:

  • 任务调度器:Flink 使用基于时间的调度器来调度和执行任务。调度器会根据任务的依赖关系和资源可用性来动态地分配任务到不同的 TaskManager 上执行。
  • 并行执行:Flink 支持多任务并行执行,以提高处理速度和吞吐量。在 Flink 中,一个作业(Job)会被拆分成多个任务(Task),每个任务可以在不同的 TaskManager 上并行执行。

2.1 例2

继续以实时交易系统为例。假设我们的系统需要处理大量的交易数据,并且希望尽快得到统计结果。在 Flink 中,我们可以将交易数据处理作业拆分成多个任务,并分配给多个 TaskManager 并行执行。每个 TaskManager 都会处理一部分交易数据,并生成相应的统计结果。最后,这些统计结果会被汇总起来,形成最终的统计报告。

3. 内存管理

核心概念:

  • 分层内存管理系统:Flink 采用了分层内存管理系统来确保各个层次的内存使用合理。这包括堆内存(Heap Memory)和堆外内存(Off-heap Memory)等不同的内存区域。
  • 垃圾回收:Flink 会进行定期的垃圾回收操作,以释放不再使用的内存资源。这有助于防止内存泄漏问题,并提高系统的稳定性和性能。

3.1 例3

在实时交易系统中,由于交易数据是持续不断地产生的,因此 Flink 需要高效地管理内存资源以避免内存溢出等问题。Flink 的分层内存管理系统允许开发者根据数据的特性和处理需求来合理地分配内存资源。例如,对于需要频繁访问的数据(如热点数据),可以将其存储在堆内存中以便快速访问;而对于不需要频繁访问的数据(如历史数据),则可以将其存储在堆外内存中以节省堆内存资源。

4. 容错机制

核心概念:

  • 检查点(Checkpoint):Flink 通过周期性地保存作业的状态到持久化存储中来实现容错。当系统发生故障时,Flink 可以从最近的检查点恢复作业的状态并继续执行。
  • 日志复制:Flink 还采用了基于日志复制的方法来确保任务在处理期间不会丢失数据。这有助于提高系统的可靠性和容错性。

4.1 例4

在实时交易系统中,如果某个 TaskManager 发生故障导致任务失败,那么 Flink 会利用检查点机制来恢复该任务的状态并继续执行。具体来说,Flink 会从最近的检查点中读取任务的状态信息,并将这些信息重新加载到新的 TaskManager 上。然后,新的 TaskManager 会从检查点之后的位置开始继续处理数据流。这样,即使发生了故障,Flink 也能保证数据的完整性和一致性。

总结
Apache Flink 的底层原理涉及多个方面,包括数据流模型、任务调度与执行、内存管理、容错机制等。这些原理共同构成了 Flink 强大的实时流处理能力。通过举例分析,我们可以看到 Flink 是如何在实际应用中处理数据流、调度任务、管理内存和保障容错的。这些特性使得 Flink 成为处理大规模实时数据流的理想选择。

三、Flink应用场景解析

Apache Flink 作为一个开源流处理框架,在实时数据处理领域有广泛的应用。以下是一些实际例子来说明 Flink 的应用场景和优势:

1. 实时数据分析

1.1 例子:网络流量监控

  • 场景描述:在大型互联网公司中,网络流量是评估服务性能和用户行为的重要指标。使用 Flink 可以实时地监控和分析网络流量数据,如每秒的请求数、响应时间等。
  • 实现方式:通过 Flink 的 DataStream API,可以实时地从数据源(如 Kafka)读取流量数据,并进行聚合、过滤等处理,然后将结果输出到实时分析平台或数据库中。
    *优势:Flink 的高吞吐量和低延迟特性使得它能够快速响应数据变化,为决策者提供实时、准确的数据支持。

2. 社交媒体分析

2.1 例子:实时用户行为分析

  • 场景描述:社交媒体平台需要实时分析用户的行为数据,如点赞、评论、分享等,以了解用户偏好和趋势,从而优化内容推荐和广告投放策略。
  • 实现方式:利用 Flink 的事件时间窗口和状态管理功能,可以实时地处理用户行为数据流,计算用户的活跃度、兴趣偏好等指标,并实时更新用户画像。
  • 优势:Flink 的高可靠性和容错性保证了数据处理的一致性和连续性,即使在系统发生故障时也能快速恢复,保证数据的实时性和准确性。

3. 交易监控

3.1 例子:金融交易实时监控

  • 场景描述:在金融领域,交易监控是保障交易安全、预防欺诈的重要手段。通过 Flink 可以实时监控交易数据流,识别异常交易行为。
  • 实现方式:使用 Flink 的复杂事件处理(CEP)功能,可以定义复杂的交易模式并实时地匹配交易数据流,一旦发现异常交易行为则立即触发警报。
  • 优势:Flink 的高并发处理能力和低延迟特性使得它能够处理大量的交易数据,并实时地识别出异常交易行为,从而保障交易安全。

4. 日志处理

4.1 例子:大规模日志实时处理

  • 场景描述:在大型分布式系统中,日志文件是排查问题、优化性能的重要依据。使用 Flink 可以实时地处理和分析大规模日志数据。
  • 实现方式:通过 Flink 的 DataStream API,可以实时地从日志收集系统(如 Flume、Logstash)读取日志数据,并进行过滤、聚合等处理,然后将结果输出到日志分析平台或数据库中。
  • 优势:Flink 的高吞吐量和可扩展性使得它能够处理海量的日志数据,并实时地提供分析结果,帮助运维人员快速定位问题并优化系统性能。

5. 物联网(IoT)

5.1 例子:设备数据实时收集和处理

  • 场景描述:在物联网场景中,大量设备产生的数据需要被实时收集和处理,以支持智能决策和远程控制。
  • 实现方式:使用 Flink 可以实时地从设备数据源(如 MQTT 消息队列)读取数据,并进行数据清洗、聚合等处理,然后将处理结果发送到云端或本地系统进行进一步分析。
  • 优势:Flink 的实时性和可靠性使得它能够快速响应设备数据变化,并保证数据处理的一致性和连续性,为物联网应用提供强大的数据支持。
    这些例子展示了 Flink 在不同领域的实际应用和优势,体现了其在实时数据处理领域的强大能力。

四、fink入门案例解析

1. 滚动窗口(tumble window)

在这里插入图片描述
在这里插入图片描述

滚动窗口:窗口大小固定不变,同时窗口的移动距离和窗口大小相等

  1. 特点:
  • 窗口大小固定不变
  • 窗口的移动距离和窗口大小相等
  • 相邻的两个窗口间,既没有重叠也没有空缺,也就是数据仅且只会被处理一次
  1. 语法
    格式: tumble(时间字段名称, 滚动窗口大小)
    示例: tumble(pt, interval ‘10’ second),创建了一个窗口大小是10秒的滚动窗口

1.1 处理时间演示

**如下操作全部都在node1上面执行:**
#1.建表
CREATE TEMPORARY TABLE source_table_tumble0 ( user_id BIGINT, price BIGINT,`timestamp` STRING,pt AS PROCTIME()
) WITH ('connector' = 'socket','hostname' = '192.168.88.161',        'port' = '9999','format' = 'csv'
);#2.启动nc
nc -lk 9999#3.SQL逻辑
select user_id,count(user_id) as pv,sum(price) as sum_price
from source_table_tumble0
group by
user_id,tumble(pt, interval '10' second);

在这里插入图片描述
在这里插入图片描述

1.2 事件时间演示

#1.创建source表
CREATE TEMPORARY TABLE source_table_tumble1 ( user_id STRING, price BIGINT,`timestamp` bigint,row_time AS TO_TIMESTAMP(FROM_UNIXTIME(`timestamp`)),watermark for row_time as row_time - interval '0' second
) WITH ('connector' = 'socket','hostname' = '192.168.88.161',        'port' = '9999','format' = 'csv'
);#2.启动nc
nc -lk 9999#3.执行查询语句
select 
user_id,
count(user_id) as pv,sum(price) as sum_price,
UNIX_TIMESTAMP(CAST(tumble_start(row_time, interval '5' second) AS STRING)) * 1000  as window_start,
UNIX_TIMESTAMP(CAST(tumble_end(row_time, interval '5' second) AS STRING)) * 1000  as window_end
from source_table_tumble1
group byuser_id,tumble(row_time, interval '5' second);解释: window_start、window_end用来帮助查看窗口的开始和结束时间的,字段数据的表达式是固定写法,单位是毫秒。

在这里插入图片描述

1.3 窗口的时间计算

一、窗口的开始时间窗口的开始时间,与第一条数据的时间相关计算公式 = 第一条数据的时间 - (第一条数据的时间 % 窗口大小)二、窗口的结束时间窗口的结束时间,与窗口的开始时间和窗口大小有关计算公式= 窗口的开始时间 + 窗口大小 - 1毫秒三、窗口计算的触发时间点触发时间,也就是窗口内部的数据被进行计算的时间点。窗口什么时候结束,那么就什么时候触发窗口内数据的计算操作四、以案例给大家进行演示第一个窗口:窗口的开始时间 = 1000 - (1000 % 5000) = 1000 - 1000 = 0窗口的结束时间 = 0 + 5000 - 1 = 4999窗口的时间范围 = [0, 4999] = [0, 5000)窗口的触发时间 = 5000第二个窗口:窗口的开始时间 = 5000 - (5000 % 5000) = 5000 - 0 = 5000窗口的结束时间 = 5000 + 5000 - 1 = 9999窗口的时间范围 = [5000, 9999] = [5000, 10000)窗口的触发时间 = 10000

2. 滑动窗口(hop)

在这里插入图片描述
在这里插入图片描述

滑动窗口的分类
场景1: 相邻的滑动窗口间有重叠的部分,有部分数据被重复计算的情况。滑动窗口的主要使用场景
场景2: 相邻的滑动窗口间既没有重叠,也没有空隙。这种就是滚动窗口
场景3: 相邻的滑动窗口间有空隙,这种情况会导致部分数据得不到计算,也就是有数据丢失情况。实际工作中不允许出现。

2.1阿里云: SQL-入门案例

--0.语法
格式: hop(事件时间字段名称, 滑动距离, 窗口大小)
示例: hop(row_time, interval '2' SECOND, interval '5' SECOND)
滑动距离: 可以理解为多久对窗口内的数据执行一次计算--1.创建表
CREATE TEMPORARY TABLE source_table_hop1 ( user_id STRING, price BIGINT,`timestamp` bigint,row_time AS TO_TIMESTAMP(FROM_UNIXTIME(`timestamp`)),watermark for row_time as row_time - interval '0' second
) WITH ('connector' = 'socket','hostname' = '172.24.24.49',        'port' = '9999','format' = 'csv'
);--2.查询的SQL
SELECT user_id,
UNIX_TIMESTAMP(CAST(hop_start(row_time, interval '2' SECOND, interval '5' SECOND) AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(hop_end(row_time, interval '2' SECOND, interval '5' SECOND) AS STRING)) * 1000 as window_end, sum(price) as sum_price
FROM source_table_hop1
GROUP BY user_id, hop(row_time, interval '2' SECOND, interval '5' SECOND);注意: hostname要改成自己的阿里云ECS服务器的内网IP--3.在你自己的阿里云ECS服务器上启动nc
nc -lk 9999

在这里插入图片描述

3. 会话窗口(session)

在这里插入图片描述

3.1 SQL案例实现

--0.语法--1.创建表
CREATE TEMPORARY TABLE source_table_session ( user_id STRING, price BIGINT,`timestamp` bigint,row_time AS TO_TIMESTAMP(FROM_UNIXTIME(`timestamp`)),watermark for row_time as row_time - interval '0' second
) WITH ('connector' = 'socket','hostname' = 'node1',        'port' = '9999','format' = 'csv'
);---2.执行SQL
SELECT user_id,
UNIX_TIMESTAMP(CAST(session_start(row_time, interval '5' SECOND) AS STRING)) * 1000 as window_start,
UNIX_TIMESTAMP(CAST(session_end(row_time, interval '5' SECOND) AS STRING)) * 1000 as window_end, sum(price) as sum_price
FROM source_table_session
GROUP BY user_id, session(row_time, interval '5' SECOND);

4. 聚合窗口(over)

4.1. 根据时间聚合代码实现

--1.创建表
CREATE TEMPORARY TABLE source_table_over_time (order_id BIGINT,product BIGINT,amount BIGINT,order_time as cast(CURRENT_TIMESTAMP as TIMESTAMP(3)),WATERMARK FOR order_time AS order_time - INTERVAL '0' SECOND
) WITH ('connector' = 'datagen','rows-per-second' = '1','fields.order_id.min' = '1','fields.order_id.max' = '2','fields.amount.min' = '1','fields.amount.max' = '10','fields.product.min' = '1','fields.product.max' = '2'
);--2.执行SQL
SELECT product, order_time, amount,SUM(amount) OVER (PARTITION BY productORDER BY order_time-- 标识统计范围是一个 product 的最近1小时内的数据RANGE BETWEEN INTERVAL '5' SECOND PRECEDING AND CURRENT ROW) AS one_hour_prod_amount_sum
FROM source_table_over_time;--3.和Hive中的over函数写法类似,只是在over里面多了时间的条件

4.2. 根据行号聚合代码实现

--1.创建表
CREATE TEMPORARY TABLE source_table_over_rows (order_id BIGINT,product BIGINT,amount BIGINT,order_time as cast(CURRENT_TIMESTAMP as TIMESTAMP(3)),WATERMARK FOR order_time AS order_time - INTERVAL '0' SECOND
) WITH ('connector' = 'datagen','rows-per-second' = '1','fields.order_id.min' = '1','fields.order_id.max' = '2','fields.amount.min' = '1','fields.amount.max' = '2','fields.product.min' = '1','fields.product.max' = '2'
);--2.执行SQL
SELECT product, order_time, amount,SUM(amount) OVER (PARTITION BY productORDER BY order_time-- 标识统计范围是一个 product 的最近 5 行数据ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS one_hour_prod_amount_sum
FROM source_table_over_rows;--2.根据行号聚合,和上面的根据时间聚合类似,也和Hive中的over函数类似。只是添加了行号的条件

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

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

相关文章

【数学建模】高温作业专用服装设计(2018A)隐式差分推导

为方便计算,对区域进行离散化处理,采用隐式差分格式进行离散计算。隐式差分格式如图: 每层材料内部 对第 j j j层材料: 其中, λ j \lambda_j λj​表示第 j j j层的热扩散率, c j c_j cj​表示第 j j j层的比热容…

RFID(NFC) CLRC663非接触读取芯片GD32/STM32 SPI读取

文章目录 基本介绍硬件配置连接硬件连接详解程序代码代码解释 基本介绍 CLRC663 是高度集成的收发器芯片,用于 13.56 兆赫兹的非接触式通讯。CLRC663 收发器芯片支 持下列操作模式 • 读写模式支持 ISO/IEC 14443A/MIFARE • 读写模式支持 SO/IEC 14443IB • JIS X…

全网超详细Redis主从部署(附出现bug原因)

主从部署 整体架构图 需要再建两个CentOs7,过程重复单机部署 http://t.csdnimg.cn/zkpBE http://t.csdnimg.cn/lUU5gLinux环境下配置redis 查看自己ip地址命令 ifconfig 192.168.187.137 进入redis所在目录 cd /opt/software/redis cd redis-stable 进入配置文件 vim redi…

【JavaEE精炼宝库】 初识网络原理——网络通信基础 | 协议

文章目录 一、网络发展史1.1 独立模式:1.2 网络互连:1.3 局域网(LAN):1.4 广域网(WAN): 二、网络通信基础2.1 IP地址:2.2 端口号: 三、协议3.1 协议的概念&am…

Python基础语法篇(上)

Python基础语法(上) 一、基知二、基本数据类型(一)标准数据类型(二)数据类型转换 三、字符串基本操作(一)字符串的索引和切片(二)字符串的拼接 三、运算符四、…

在golang中Sprintf和Printf 的区别

最近一直在学习golang这个编程语言,我们这里做一个笔记就是 Sprintf和Printf 的区别 fmt.Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。 fmt.Printf 根据格式化参数生成格式化的字符串并写入标准输出。由上面就可以知道,fmt.Sprintf返回的…

AI第二课堂第一次笔记

conda的使用 在输入cmd进入终端后,使用命令 conda create -n env_name python3.10 创建环境 命令 conda activate env_name 打开环境,如:使用 conda deactivate退出指令 2.python一些常见操作 python中的文件打开与关闭 调开源的库 p…

C++--lambda表达式

介绍 一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。和函数类型,lambda有一个返回值,一个参数列表和一个函数体,但比函数多一个捕获列表。具体形式如下: [捕获列表](参数列表) ->返回值类型 {函数体}其中:捕获列表:可以捕获定义lam…

NineData全面支持PostgreSQL可视化表结构设计

“PostgreSQL 是最像 Oracle 的开源关系型数据库“,也正因为如此,很多企业都青睐 PostgreSQL,拿它当成 Oracle 的替代品。所以毫无疑问,目前 PostgreSQL 在企业中非常常见。 对于直接接触 PostgreSQL 的开发人员而言,…

60K起?“软件安全岗”比“网络安全岗”薪资高在哪里?

在网络世界的江湖中,“软件安全”与“网络安全”这两大“武林高手”都肩负着守护数字领域和平的重任。不过,眼尖的小伙伴们可能发现了,软件安全岗位的薪资待遇往往比网络安全岗位要丰厚那么一些,这到底是为啥呢?今天&a…

使用ETLCloud实现MySQL数据库与StarRocks数据库同步

在现代数据架构中,数据同步是保证数据一致性和分析准确性的关键步骤之一。本文将介绍如何利用ETLCloud技术实现MySQL数据库与StarRocks数仓数据库的高效数据同步,以及其在数据管理和分析中的重要性。 数据同步的重要性 在数据驱动的时代,企…

【紫光同创盘古PGX-Nano教程】——(盘古PGX-Nano开发板/PG2L50H_MBG324第十三章)蓝牙透传实验例程说明

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 适用于板卡型号: 紫光同创PG2L50H_MBG324开发平台(盘古PGX-Nano) 一:…

OZON成本低卖价高产品,OZON单价高产品

Top1 Crocs鞋扣配件 Джиббитсы набор украшения для обуви крокс значки на crocs клипсы аксессуары украшение для сабо бутылка вина бокал 商品id:1409545850…

第一百六十七节 Java IO教程 - Java Zip字节数组

Java IO教程 - Java Zip字节数组 校验和 Java在java.util.zip包中提供了一个Adler32类来计算数据字节的Adler-32校验和。 我们需要调用这个类的update()方法将字节传递给它。 在同一个包中还有另一个名为CRC32的类,它允许您使用CRC32算法计算校验和。 以下代码…

使用geoipupdate自动更新GeoIP数据库

一、 什么是 GeoIP? 通过在数据库中将地理位置和 IP 地址相互映射,软件程序便可以使用 IP 地址来确定其对应的地理位置,其中包括国家/地区、州/省、城市、邮政编码、纬度/经度、ISP、区号和其他信息。 很多软件都使用 MaxMind 的数据库对 IP…

选择Maya进行3D动画制作与渲染的理由

如果你对3D动画充满热情并追求成为专业3D动画师的梦想,你一定听说过Maya——近年来3D动画的行业标准。Maya被3D艺术家广泛使用,你是否想知道为什么Maya总是他们的首选?下面一起来了解下。 一、什么是Maya? 由Autodesk开发的Maya是…

昇思25天学习打卡营第24天|基于MindSpore的Diffusion扩散模型

Diffusion扩散模型 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 关于扩散模型(Diffusion Models)有很多种理解,本文的介绍是基于denoising di…

浅谈Git

一:什么是 git git一种开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 下图是 git 的一个工作流程简图 二:什么是 分布/集中式版本控制系统 软件开发过程中,要解决多人协作的问题,需要…

FPGA CFGBVS 管脚接法

说明 新设计了1个KU040 FPGA板子,回来之后接上JTAG FPGA不识别。做如下检查: 1、电源测试点均正常; 2、查看贴片是否有漏焊,检查无异常,设计上NC的才NC; 3、反复检查JTAG接线是否异常,贴片是…

PostgreSQL 的 generic xlog 模块代码解读

为了描述方便,定义一些名词: wal/WAL -- Write Ahead Log,指PG中事务日志模块,这里所指的其实比较模糊,相关的函数,内存都算,自定义WAL就是指,用户可以决定自己存储在shared buffer …