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://www.mzph.cn/web/46047.shtml

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

相关文章

JavaScript统计字符串中出现次数最多的字符

思路&#xff1a;使用charAt()方法可以通过for循环来依次遍历出字符串中的字符 将遍历出来的字符作为一个空对象的属性 如果该对象中该属性没有值则对其赋值为1 如果该对象中已经有值了则在原基础上加1 最后通过for in循环比较对象中个属性值大大小然后将其打印出来 <!DOCT…

liunx面试题目

如何看当前Linux系统有几颗物理CPU和每颗CPU的核数&#xff1f; 查看物理cup&#xff1a; cat /proc/cpuinfo|grep -c ‘physical id’ 查看每颗cup核数 cat /proc/cpuinfo|grep -c ‘processor’ 若希望自动实现软件包的更新&#xff0c;可以使用yum-cron并启动该服务 yum -y …

C++ std::lock_guard和 std::unique_lock

二者都是 C 标准库中用于管理互斥锁&#xff08;mutex&#xff09;的 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制的类。这些类可以确保互斥锁在构造时被获取&#xff0c;在析构时被释放&#xff0c;从而避免死锁和资源泄漏问题。不过&#xff0c…

Python基础语法篇(上)

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

web安全之跨站脚本攻击xss

定义: 后果 比如黑客可以通过恶意代码,拿到用户的cookie就可以去登陆了 分类 存储型 攻击者把恶意脚本存储在目标网站的数据库中(没有过滤直接保存)&#xff0c;当用户访问这个页面时&#xff0c;恶意脚本会从数据库中被读取并在用户浏览器中执行。比如在那些允许用户评论的…

Ansys Zemax|探索OS中的物理光学传播

概述 物理光学传播 (Physical Optics Propagation, POP) 分析是OpticStudio序列模式中的一个强大的分析工具&#xff0c;它可以用来分析光束的传播和光纤耦合的效率。这篇文章旨在介绍这一分析工具的功能&#xff0c;并向您展示一些具体的应用示例。本文同时为您介绍了如何使用…

有关电力电子技术的一些相关仿真和分析:⑦三相桥式电压型PWM逆变器与直接/间接法控制单相全桥结构PWM整流器(MATLAB/Siumlink仿真)

1.1 题目一要求 以三相桥式电压型PWM逆变器为对象,研究其在不同调制度下,输出电压的频谱成分变化,依据仿真波形分析其工作时序。 参数要求:三相桥式逆变电路,直流侧电压800V,调制波频率50HZ,开关频率10kHZ,阻感负载R=10Ω,L=5mH。 1.2 题目二要求 以单相全桥结构P…

高效接入电商订单API,掌握这些技巧轻松实现

受全渠道大趋势的影响&#xff0c;很多实体商家纷纷开展电商业务&#xff0c;为了提升业务管理效率&#xff0c;想要在原有管理系统的基础上通过接入电商订单API接口&#xff0c;方便将线上线下的订单进行统一管理&#xff0c;但各个电商平台的电商订单API接口那么多&#xff0…

allure_pytest:AttributeError: ‘str‘ object has no attribute ‘iter_parents‘

踩坑记录 问题描述&#xff1a; 接口自动化测试时出现报错&#xff0c;报错文件是allure_pytest库 问题分析&#xff1a; 自动化测试框架是比较成熟的代码&#xff0c;报错也不是自己写的文件&#xff0c;而是第三方库&#xff0c;首先推测是allure_pytest和某些库有版本不兼…

彩电上自带的推箱子游戏是什么编程语言开发的?

2000年左右的厦新彩电上&#xff0c;自带了推箱子、华容道游戏。界面如下&#xff1a; 在线版推箱子游戏&#xff0c;网址&#xff1a;https://www.tuixiangzi.cn/ BASIC&#xff0c;全称是Beginners All-purpose Symbolic Instruction Code&#xff0c;含义是初学者通用符号…

【IEEE出版顺利申请中】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024)

2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024) 2024 4th International Conference on Electronic Information Engineering and Computer Science 中国延吉 | 2024年9月27-29日 电子信息的出现与计算机技术、通信技术和高密度存储技术的迅速发展并在各个领域里…

每日练习,不要放弃

目录 题目1.下面叙述错误的是 ( )2.java如何返回request范围内存在的对象&#xff1f;3.以下代码将打印出4.下列类定义中哪些是合法的抽象类的定义&#xff1f;&#xff08;&#xff09;5.以下代码段执行后的输出结果为6.以下代码运行输出的是总结 题目 选自牛客网 1.下面叙述…

深度学习驱动智能超材料设计与应用

在深度学习与超材料融合的背景下&#xff0c;不仅提高了设计的效率和质量&#xff0c;还为实现定制化和精准化的治疗提供了可能&#xff0c;展现了在材料科学领域的巨大潜力。深度学习可以帮助实现超材料结构参数的优化、电磁响应的预测、拓扑结构的自动设计、相位的预测及结构…

分析示例 | Simufact Additive铺粉增材制造工艺缺陷仿真分析方案

近年来&#xff0c;随着增材制造工艺的快速发展&#xff0c;仿真模拟的重要性日益凸显&#xff0c;越来越多的科研及应用单位选择在实际打印之前&#xff0c;通过仿真预测打印问题&#xff0c;从而优化打印工艺、减少物理试错次数、降低打印成本。就不同增材工艺仿真的占比而言…

netxduo http server 创建回复以及json解析

我们今天要整http的response,比如我创建的http server,我对它发送了一个POST,然后服务器解析出json里的body,再回复过去。今天会用到json的解析库cjson以及postman去发送消息。这次用nx_web_http_server.h这个库,不用之前的nx_http_server.h 本教程在最后附带app_netxduo…

大数据基础:Doris重点架构原理

文章目录 Doris重点架构原理 一、Apache Doris介绍 二、Apache Doris使用场景 三、Apache Doris架构原理 四、Apache Doris 特点 Doris重点架构原理 一、Apache Doris介绍 基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff…

JVM---对象是否存活及被引用的状态

1.如何判断对象是否存活 1.1 引用计数算法 概念&#xff1a;在对象头部增加一个引用计数器,每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 优点&#xff1…

vue2迁移到vue3注意点

vue2迁移到vue3注意点 1、插槽的修改 使用 #default &#xff0c; 以及加上template 模板 2、 类型的定义&#xff0c;以及路由&#xff0c;vue相关资源&#xff08;ref, reactive,watch&#xff09;的引入等 3、类装饰器 1&#xff09;vue-class-component是vue官方库,作…

ubuntu搭建harbor私仓

1、环境准备 链接: https://pan.baidu.com/s/1q4XBWPd8WdyEn4l253mpUw 提取码: 7ekx --来自百度网盘超级会员v2的分享 准备一台Ubuntu 机器:192.168.124.165 将上面两个文件考入Ubuntu上面 2、安装harbor 安装Docker Harbor仓库以容器方式运行,需要先安装好docker,参考:…

which 命令在Linux中是一个快速查找可执行文件位置的工具

文章目录 0、概念1、which --help2、which命令解释 0、概念 which命令用于查找命令的可执行文件的路径which 命令在 Linux 中用于查找可执行命令的完整路径。当你在 shell 中输入一个命令时&#xff0c;shell 会在环境变量 $PATH 定义的目录列表中查找这个命令。which 命令可以…