Lambda离线实时分治架构深度解析与实战
一、引言
在大数据技术日新月异的今天,Lambda架构作为一种经典的数据处理模型,在应对大规模数据应用方面展现出了强大的能力。它整合了离线批处理和实时流处理,为需要同时处理批量和实时数据的应用场景提供了成熟的解决方案。本文将对Lambda架构的演变、核心组件、工作原理及痛点进行深度解析,并通过Java代码实现一个实战实例。
二、Lambda架构的演变
Lambda架构是由Storm的作者Nathan Marz提出的一种实时大数据处理框架。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm,而Lambda架构则是他根据多年进行分布式大数据系统的经验总结提炼而成。Lambda架构的诞生离不开现有设计思想和架构的铺垫,如事件溯源架构和命令查询分离架构。
Lambda架构的设计初衷是提供一个能满足大数据系统关键特性的架构,包括高容错、低延迟、可扩展等。它整合了离线计算和实时计算,融合了不可变性、读写分离和复杂性隔离等一系列架构原则,可集成Hadoop、Kafka、Spark、Storm、Flink等主流大数据组件。随着大数据技术的不断发展,Lambda架构也在不断优化和完善,以更好地适应新的数据处理需求。
三、Lambda架构的核心组件
Lambda架构主要包含以下三个核心组件:
1. 批处理层(Batch Layer)
批处理层负责处理离线或批量数据。这一层通常使用分布式计算框架(如Hadoop)来处理大规模数据集。它的核心功能包括存储数据集和生成批视图(Batch View)。批处理层的数据处理是准确且全量的,但数据处理时延较高。它接收原始数据流,并进行批量处理和分析。数据是原始的、不可变的,并且永远是真实的。批处理层使用容错性较强的分布式文件系统(如Hadoop HDFS)存储和处理数据,在处理过程中可以处理故障和错误。
2. 实时处理层(Speed Layer)
实时处理层负责处理实时数据流。这一层通常使用流处理框架(如Apache Kafka、Apache Flink或Apache Storm)来处理数据流。它执行实时计算和聚合操作,生成实时视图(Real-time View)或实时处理视图。这些视图是基于实时数据流计算得到的结果。实时处理层的数据处理只针对最近的实时数据,处理结果可能不准确,但时延很低。为了提高数据处理效率,该层接收到新数据后会不断更新实时数据视图。
3. 合并层(Serving Layer)
合并层负责将批处理层和实时处理层生成的视图合并为一致的查询结果。这一层通常使用分布式存储系统(如HBase或Cassandra)来存储视图,并为用户提供查询接口。合并层的任务包括数据同步、视图合并和查询处理。它整合批处理层和实时处理层的结果,为用户提供统一的访问接口。用户可以通过该接口查询历史数据和实时数据。
四、Lambda架构的工作原理
Lambda架构的工作原理可以概括为以下几个步骤:
1. 数据采集
数据采集是Lambda架构的第一步。通常情况下,使用Apache Kafka来收集实时流数据。Kafka是一个分布式消息系统,以其可以水平扩展和高吞吐率而被广泛使用。同时,对于离线数据,可以使用Sqoop等离线数据传输工具将数据从传统数据库(如MySQL、PostgreSQL等)传输到Hadoop(Hive)等离线数据处理平台。
2. 批处理
在批处理层,使用分布式计算框架(如Hadoop或Spark)对采集到的离线数据进行批量处理和分析。批处理层会预先在数据集上计算并保存查询函数的结果,这些结果保存在批视图中。当用户查询时,可以直接或通过简单运算返回结果,而无需重新进行完整费时的计算。
3. 实时处理
在实时处理层,使用流处理框架(如Storm或Spark Streaming)对实时数据流进行处理。实时处理层会接收到新数据后不断更新实时数据视图,以提供低延迟的查询结果。实时处理层通常执行较简单的计算任务,如数据过滤、聚合、索引等。
4. 合并与查询
在合并层,将批处理层和实时处理层的结果进行整合,为用户提供统一的查询接口。合并层会保证查询结果的完整性和一致性。用户可以通过该接口查询历史数据和实时数据,并获取合并后的结果。
五、Lambda架构的痛点
尽管Lambda架构在大数据处理方面展现出了强大的能力,但它也存在一些痛点:
1. 复杂性
Lambda架构引入了多层次的处理和管理,增加了系统的复杂性和维护成本。开发人员需要熟悉多个技术栈和组件,因此学习曲线较陡。
2. 延迟
由于数据要经历批处理和实时处理两个阶段,可能会引入一些延迟,特别是在合并数据时。这对于需要极低延迟的应用场景来说可能是一个问题。
3. 数据一致性
虽然合并层通过数据同步和视图合并来提供一致的查询结果,但在某些情况下,实时视图和批视图之间可能存在不一致性。这需要在系统设计和实现时进行权衡和取舍。
4. 部署和迁移成本
Lambda架构需要同时部署批处理层和实时处理层,这增加了系统的部署和迁移成本。特别是在数据量较大或系统复杂度较高的情况下,部署和迁移过程可能会更加复杂和耗时。
六、Lambda架构的Java实战实例
下面将通过一个简单的Java实例来展示如何实现Lambda架构的基本功能。这个实例将包括数据采集、批处理、实时处理和合并与查询四个步骤。
1. 数据采集
使用Apache Kafka来收集实时流数据。首先,需要启动Kafka服务并创建一个Kafka生产者来发送数据。
java复制代码
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
public class KafkaProducerExample {
public static void main(String[] args) {
Properties props = new Properties();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());KafkaProducer<String, String> producer = new KafkaProducer<>(props);
for (int i = 0; i < 100; i++) {
String key = "key" + i;
String value = "value" + i;ProducerRecord<String, String> record = new ProducerRecord<>("topic", key, value);producer.send(record);}producer.close();}
}
在上面的代码中,我们创建了一个Kafka生产者,并发送了100条消息到名为“topic”的主题中。
2. 批处理
使用Apache Spark对采集到的离线数据进行批量处理和分析。假设我们已经将离线数据存储在HDFS中,并且数据格式为CSV。下面是一个使用Spark进行批处理的示例代码。
java复制代码
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
public class SparkBatchProcessingExample {
public static void main(String[] args) {
SparkSession spark = SparkSession.builder().appName("Batch Processing").master("local[*]").getOrCreate();Dataset<Row> df = spark.read().csv("hdfs://path/to/batch_data.csv");df.createOrReplaceTempView("batch_data");Dataset<Row> filteredData = spark.sql("SELECT * FROM batch_data WHERE value > 10");filteredData.write().mode("overwrite").parquet("hdfs://path/to/processed_batch_data");spark.stop();}
}
在上面的代码中,我们创建了一个Spark会话,读取了存储在HDFS中的CSV文件,并对数据进行了过滤操作。然后,将过滤后的数据以Parquet格式存储回HDFS中。
3. 实时处理
使用Apache Spark Streaming对实时数据流进行处理。假设我们已经将Kafka中的数据作为实时数据源。下面是一个使用Spark Streaming进行实时处理的示例代码。
java复制代码
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairDStream;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka010.ConsumerStrategies;
import org.apache.spark.streaming.kafka010.KafkaUtils;
import org.apache.spark.streaming.kafka010.LocationStrategies;
import scala.Tuple2;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class SparkStreamingExample {
public static void main(String[] args) throws InterruptedException {
SparkConf conf = new SparkConf().setAppName("Real Time Processing").setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaStreamingContext ssc = new JavaStreamingContext(sc, Durations.seconds(1));Map<String, Object> kafkaParams = new HashMap<>();kafkaParams.put("bootstrap.servers", "localhost:9092");kafkaParams.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");kafkaParams.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");kafkaParams.put("group.id", "spark-streaming-group");kafkaParams.put("auto.offset.reset", "latest");kafkaParams.put("enable.auto.commit", false);JavaPairInputDStream<String, String> streams = KafkaUtils.createDirectStream(ssc,LocationStrategies.PreferConsistent(),ConsumerStrategies.Subscribe(Collections.singletonList("topic"), kafkaParams));JavaDStream<String> lines = streams.map(Tuple2::_2);JavaPairDStream<String, Integer> wordCounts = lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator()).mapToPair(word -> new Tuple2<>(word, 1)).reduceByKey((a, b) -> a + b);wordCounts.print();ssc.start();ssc.awaitTermination();}
}
在上面的代码中,我们创建了一个Spark Streaming上下文,并连接到Kafka中的实时数据源。我们对数据流进行了单词计数操作,并将结果打印出来。
4. 合并与查询
在合并层,我们需要将批处理层和实时处理层的结果进行整合,并为用户提供统一的查询接口。这里可以使用一个简单的Java程序来模拟这个过程。假设我们已经将批处理结果和实时处理结果存储在不同的数据表中(如HDFS中的Parquet文件或数据库中的表)。
java复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class MergingAndQueryingExample {
public static void main(String[] args) {
// 假设我们已经将批处理结果存储在名为"batch_results"的表中
// 实时处理结果存储在名为"realtime_results"的表中List<String> batchResults = fetchBatchResults();List<String> realtimeResults = fetchRealtimeResults();
// 合并结果List<String> mergedResults = new ArrayList<>(batchResults);mergedResults.addAll(realtimeResults);
// 提供查询接口queryResults(mergedResults);}
private static List<String> fetchBatchResults() {
// 模拟从批处理结果表中获取数据List<String> results = new ArrayList<>();results.add("Batch Result 1");results.add("Batch Result 2");
return results;}
private static List<String> fetchRealtimeResults() {
// 模拟从实时处理结果表中获取数据List<String> results = new ArrayList<>();results.add("Realtime Result 1");results.add("Realtime Result 2");
return results;}
private static void queryResults(List<String> results) {
// 模拟查询接口,打印合并后的结果
for (String result : results) {System.out.println(result);}}
}
在上面的代码中,我们模拟了从批处理结果表和实时处理结果表中获取数据的过程,并将结果合并后打印出来。这可以看作是一个简单的查询接口,用户可以通过这个接口查询合并后的结果。
七、总结与展望
Lambda架构作为一种经典的大数据处理模型,在应对大规模数据应用方面展现出了强大的能力。它通过整合离线批处理和实时流处理,为需要同时处理批量和实时数据的应用场景提供了成熟的解决方案。然而,Lambda架构也存在一些痛点,如复杂性、延迟、数据一致性和部署迁移成本等。在未来的发展中,我们可以探索如何进一步优化Lambda架构,提高其性能和可扩展性,并降低其复杂性和维护成本。
同时,随着大数据技术的不断发展,新的数据处理架构也在不断涌现。例如,Kappa架构就是一种专注于实时处理的架构,它试图通过实时流处理来替代传统的批处理层。虽然Kappa架构在某些场景下可能具有更好的性能和可扩展性,但它也面临着一些挑战,如如何保证数据的准确性和一致性等。因此,在选择数据处理架构时,我们需要根据具体的应用场景和需求进行权衡和取舍。
对于大数据技术专家来说,掌握Lambda架构的原理和实现方法是非常重要的。通过深入理解Lambda架构的演变、核心组件、工作原理及痛点,我们可以更好地应对大数据处理中的挑战和问题。同时,通过实践和应用Lambda架构,我们可以不断提升自己的技术水平和实战能力,为大数据技术的发展贡献自己的力量。
相关文章:
Lambda离线实时分治架构深度解析与实战
一、引言 在大数据技术日新月异的今天,Lambda架构作为一种经典的数据处理模型,在应对大规模数据应用方面展现出了强大的能力。它整合了离线批处理和实时流处理,为需要同时处理批量和实时数据的应用场景提供了成熟的解决方案。本文将对Lambda…...
Vue.js组件开发,AI时代的前端新玩法
AI可不只是写写小说、聊聊天,现在它的触角已经伸到了程序员的代码世界里。特别是前端开发,很多人都在尝试用ChatGPT或者类似的AI工具来写代码,甚至直接生成Vue.js组件。有些人感叹,"写代码的时代是不是要结束了?&…...
标定 3
标定场景与对应的方式 标定板标定主要应用场景: (1)无法获取到执行机构物理坐标值,比如相机固定,执行机构为传送带等 (2)相机存在畸变等非线性标定情况,需要进行畸变校正 (3)标定单像素精度 (4)获取两个相机之间的坐标系关系 标定板操作步骤: (1)确定好拍…...
电商项目-基于ElasticSearch实现商品搜索功能(三)
本系列文章主要介绍基于 Spring Data Elasticsearch 实现商品搜索的后端代码,介绍代码逻辑和代码实现。 主要实现功能:根据搜索关键字查询、条件筛选、规格过滤、价格区间搜索、搜索查询分页、搜索查询排序、高亮查询。 主要应用技术:canal,…...
【51单片机】03 蜂鸣器-播放音乐
蜂鸣器-播放音乐 一、原理介绍1.硬件电路 二、练习1.让蜂鸣器发声2.尝试演奏小星星 一、原理介绍 蜂鸣器分为有源蜂鸣器、无源蜂鸣器两种。 有源蜂鸣器:施加合适的电压之后就会发出特定频率的声音 无源蜂鸣器:需要提供特定频率的声音信号,才能…...
MySQL 架构
MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器的连接器。整体架构图如下所⽰: MySQL Connectors:为使⽤…...
XML 解析器:深入解析与高效应用
XML 解析器:深入解析与高效应用 引言 XML(可扩展标记语言)作为一种重要的数据交换格式,被广泛应用于各种系统和平台中。为了有效地处理和解析XML数据,XML解析器发挥着至关重要的作用。本文将深入探讨XML解析器的原理…...
LabVIEW设计 IIR 滤波器
这是一个设计 IIR 滤波器的 LabVIEW 程序框图,其功能主要是用于设计滤波器并计算其频率响应,但它并不直接对输入的波形进行实时滤波,而是提供一个滤波器的频率响应分析工具。 以下是框图中各部分的详细解释: 1. 主要模块功能说明 …...
基于改进粒子群优化的无人机最优能耗路径规划
目录 1. Introduction2. Preliminaries2.1. Particle Swarm Optimization Algorithm2.2. Deep Deterministic Policy Gradient2.3. Calculation of the Total Output Power of the Quadcopter Battery 3.OptimalEnergyConsumptionPathPlanningBasedonPSO-DDPG3.1.ProblemModell…...
AI刷题-数列推进计算任务、数组中的幸运数问题
目录 一、数列推进计算任务 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 优化思路 最终代码: 运行结果: 二、数组中的幸运数问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步…...
微服务的配置共享
1.什么是微服务的配置共享 微服务架构中,配置共享是一个重要环节,它有助于提升服务间的协同效率和数据一致性。以下是对微服务配置共享的详细阐述: 1.1.配置共享的概念 配置共享是指在微服务架构中,将某些通用或全局的配置信息…...
【计算机网络】窥探计网全貌:说说计算机网络体系结构?
标签难度考察频率综合题⭐⭐⭐60% 这个问题在计算机网络知识体系中是一个比较重要的问题,只有完整地了解计算机网络的体系结构才能清晰地认识网络的运行原理。 在回答这个问题时,笔者认为有几个比较重要的点: 首先一定要分清楚前置条件&am…...
【MySQL】DATEDIFF()函数使用
DATEDIFF 函数用于计算两个日期之间的差值,以天为单位 DATEDIFF 函数返回一个整数,表示 date1 和 date2 之间的天数。如果 date1 在 date2 之前,结果为负数;如果在 date2 之后,结果为正数;如果相等…...
计算机网络学习笔记
第1课 绪论、传输介质 【知识点回顾】 两种导线可以减小电磁干扰: 双绞线(分为非屏蔽双绞线、屏蔽双绞线)(RJ-45用)同轴电缆(短距离使用)网络通信的基本单位:位(bit&…...
Spring Boot性能提升的核武器,速度提升500%!
虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势: 轻量级:虚拟线程由 JVM 管理,而非操作系统,因此它们的内存占用和创建成本远低于传统线程。理论上&am…...
zig 安装,Hello World 示例
1. 安装 Zig 首先,你需要在你的计算机上安装 Zig 编译器。你可以从 Zig 官方网站 下载适合你操作系统的版本。 安装完成后,你可以在终端中运行以下命令来检查 Zig 是否安装成功: zig version如果一切正常,它会显示 Zig 的版本信…...
【数据库系统概论】第5章 数据库完整性【!触发器】
目录 5.1数据库完整性概述 5.2 实体完整性 5.3 参照完整性 5.4 用户定义的完整性 属性上的约束 1. 列值非空(NOT NULL) 2. 列值唯一(UNIQUE) 3. 检查列值是否满足条件(CHECK) 元组上的约束 5.5 完…...
Linux中通过frp实现内网穿透
1、准备工作 准备一台公网服务器(云服务器),推荐阿里云或者腾讯云都可以 需要下载好frp安装包Linux端的和Windows端的安装包 网址:Releases fatedier/frp (github.com)https://github.com/fatedier/frp/releases 2、下载frp_0…...
Vscode辅助编码AI神器continue插件
案例效果 1、安装或者更新vscode 有些版本的vscode不支持continue,最好更新到最新版,也可以直接官网下载 https://code.visualstudio.com/Download 2、安装continue插件 搜索continue,还未安装的,右下脚有个Install,点击安装即可 <...
上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天探底回升,沪指盘中跌超1.6%,创业板指一度跌逾3%,午后集体拉升翻红…...
LeetCode 3297.统计重新排列后包含另一个字符串的子字符串数目 I:滑动窗口
【LetMeFly】3297.统计重新排列后包含另一个字符串的子字符串数目 I:滑动窗口 力扣题目链接:https://leetcode.cn/problems/count-substrings-that-can-be-rearranged-to-contain-a-string-i/ 给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新…...
ssm旅游攻略网站设计+jsp
系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 需要源码或者定制看文章最下面或看我的主页 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B/S结构介绍 3 …...
前端学习-环境this对象以及回调函数(二十七)
目录 前言 目标 环境对象 作用 环境对象this是什么? 判断this指向的粗略规则是什么? 回调函数 目标 常见的使用场景 综合案例:Tab任务栏切换 总结 前言 男儿何不带吴钩,收取关山五十州 目标 能够分析判断函数运行在不…...
计算机网络-数据链路层(虚拟局域网VLAN)
2.6 虚拟局域 2.6.1 虚拟局域网概述 以太网交换机连接的各个网络同属于一个广播域,随着以太网的规模扩大,广播域也会相应的扩大,巨大的广播域会带来巨大的弊端。 广播风暴 难以治理 潜在的安全问题 TCP/IP协议下会进行广播的协议:…...
Python贪心
贪心 贪心:把整体问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直至所有步骤结束;每个步骤不会影响后续步骤核心性质:每次采用局部最优,最终结果就是全局最优如果题目满足上述核心性质…...
CSS 盒模型
盒模型 CSS盒模型是网页布局的核心概念之一,它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范,每个HTML元素都被视为一个矩形盒子,这个盒子由以下四个部分组成: 内容区(Content areaÿ…...
【linux】vi编辑文件及readonly文件修改读写权限方法
板端vi修改文件: 1、vi 文件路径 vi mnt/eol/config/oem_eol.xml2、按 i进入修改状态,此时可以修改配置文件 3、按 esc退出修改状态,并按"wq!保存 问题:readonly文件无法直接vi修改 方案: 1、mount -o remoun…...
Git使用笔记
Git 版本控制 一、Git 介绍二、Git 使用1. 安装及配置2. 使用方法3. Git 命令3. 历史版本回退4. 分支 (Branch) 三、远程仓库1. SSH公钥连接Gitee2. 推送到远程仓库 一、Git 介绍 常见版本控制软件:集中式(CVS、SVN),分布式&#…...
mermaid大全(语法、流程图、时序图、甘特图、饼图、用户旅行图、类图)
⚠️ 有些网站的mermaid可能不完整,因此下面教程中可能有些语法是无效的。 😊亲测Typora软件均可以显示。 1. 介绍 Mermaid是一个基于JavaScript的图表绘制工具,它使用类似Markdown的语法来创建和修改各种类型的图表。以下是关于Mermaid的详…...
慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)
3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置࿱…...
vue3+ts+element-plus 输入框el-input设置背景颜色
普通情况: 组件内容: <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置: ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…...
python迷宫寻宝 第6关 安全策略
地图: 1、体力不足去找终点,体力足则原地不动 import api## 判断是否需要离场的函数 # 体力足返回False,体力不足返回True def should_leave():# 拿到我离终点的距离e_row api.get.exit(what"row")e_col api.get.exit(what"…...
【计算机网络】lab7 TCP协议
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 实验目的…...
Monorepo设置:新手指南
Monorepo是一种项目代码管理方法,指在单个代码仓库中管理多个项目,有助于简化代码共享、版本控制、构建和部署的复杂性,并提供更好的可重用性和协作性。 简单理解:所有项目都在一个代码仓库中 📦,但这并不意…...
HTTP 请求与响应的结构
一、引言 在当今数字化的时代,网络通信如同空气一般无处不在,而HTTP协议则是网络世界中最为重要的基石之一。当我们在浏览器中输入一个网址,轻松浏览网页、观看视频、下载文件或是进行在线购物等操作时,背后HTTP协议都在默默地发…...
计科高可用服务器架构实训(防火墙、双机热备,VRRP、MSTP、DHCP、OSPF)
一、项目介绍 需求分析: (1)总部和分部要求网络拓扑简单,方便维护,网络有扩展和冗余性; (2)总部分财务部,人事部,工程部,技术部,提供…...
Soildworks的学习【2025/1/12】
右键空白处,点击选项卡,即可看到所有已调用的选项卡: 点击机械小齿轮选项卡,选择文档属性,选择GB国标: 之后点击单位,选择MMGS毫米单位: 窗口右下角有MMGS,这里也可以选择…...
ORACLE-表空间和分区控制
--查询最后更新的统计信息时间 SELECT table_name, last_analyzed FROM dba_tables WHERE table_name 表名; --更新统计信息 -----按分区 BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname > XI_SF, -- 模式名称 tabname > 表名, -- 表名称 partnam…...
C# 与 Windows API 交互的“秘密武器”:结构体和联合体
一、引言 在 C# 的编程世界里,当我们想要深入挖掘 Windows 系统的底层功能,与 Windows API 打交道时,结构体和联合体就像是两把神奇的钥匙🔑 它们能够帮助我们精准地操控数据,实现一些高级且强大的功能。就好比搭建一…...
【数字化】华为-用变革的方法确保规划落地
导读:华为在数字化转型过程中,深刻认识到变革的必要性,并采用了一系列有效的方法确保转型规划的有效落地。华为认为,数字化转型不仅仅是技术层面的革新,更是企业运作模式、流程、组织、文化等深层次的变革。数字化转型…...
SpringData-Redis缓存
Spring Framework是领先的全堆栈Java/JEE应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP和可移植服务抽象实现的非侵入性编程模型。 NoSQL存储系统为传统RDBMS提供了一种横向可扩展性和速度的替代方案。就实现而言,键值存储代表NoSQL空间中最大…...
大语言模型兵马未动,数据准备粮草先行
从OpenAI正式发布ChatGPT开始,大型语言模型(LLM)就变得风靡一时。对业界和吃瓜群众来说,这种技术最大的吸引力来自于理解、解释和生成人类语言的能力,毕竟这曾被认为是人类独有的技能。类似CoPilot这样的工具正在迅速…...
跳表和Mysql联合索引的最左原则和索引下推的优化
文章目录 跳表(Skip List)关键特性跳表的结构示意图跳表的查询效率为什么 MySQL 不使用跳表而使用 B 树?跳表的实际应用场景 总结 MySQL 联合索引的最左匹配原则最左匹配原则的规则示例:创建联合索引查询示例及索引使用情况设计联…...
Android切换语言不退出App
1.需求 实现用户选择语言(未点击下一步),更新当前界面UI,点击下一步后,更新App的语言,并进行保存。 实现目标: 1.设置App的语言,本地进行保存 2.updateResources更新本地语言配置…...
Unity编程与游戏开发-编程与游戏开发的关系
游戏开发是一个复杂的多领域合作过程,涵盖了从创意构思到最终实现的多个方面。在这个过程中,技术、设计与美术三大核心要素相互交织,缺一不可。在游戏开发的过程中,Unity作为一款强大的跨平台游戏引擎,凭借其高效的开发工具和庞大的社区支持,成为了很多游戏开发者的首选工…...
【Git】问题汇总
在push的时候显示 protocol error: bad line length 8192 我在本地创建了一个gogs服务器,现在正在上传代码,但是出现了上述的这个问题。 解决方法 设置本地http.postBuffer(待验证) 方法一:全局配置 git config --g…...
搭建docker私有化仓库Harbor
Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…...
修改sshd默认配置,提升安全
对于Linux服务器,特别是暴露在公网的服务器,会经常被人扫描、探测和攻击。包括通过ssh访问登录攻击。对此,对默认的sshd配置进行调整,提升安全。 下面以CentOS 7.9为例说明: 一、常见安全措施 以root用户编辑vim /e…...
formik 的使用
礼记有言:独学而无友,则孤陋而寡闻 让我们一起了解更多便捷方法,缩短开发时间去摸鱼,嘿嘿。 框架:react 在写表单的时候,我不太喜欢把验证写的很繁琐,这里讲介绍,验证表单的非常好用…...
【学习笔记】理解深度学习的基础:机器学习
1. 机器学习基础 1.1 机器学习的定义与重要性 定义:深度学习是机器学习的一种特定形式。为了深入理解深度学习,必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法,通过经验E在任务T上提高性能度量P(Mi…...