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

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统,用于存储和处理大规模数据集。Hadoop 主要由HDFS(Hadoop Distributed File System)、MapReduce、Yarn(Jobtracker,TaskTracker)三大核心组件组成。其中HDFS是分布式文件系统,用于存储文件,MapReducer是计算框架,可以分为Map和Reduce两部分,简单来说就是先分组,后计算,而Yarn则是对主机资源的协调,辅助计算的顺利进行。

1. HDFS(Hadoop Distributed File System)

HDFS基本架构

HDFS负责存储所有文件。他将大型文件分成若干个数据块,默认情况下,HDFS 的数据块大小为 128MB(可以配置),方便计算的分布式进行,提高计算效率。每个数据块还可以生成多个副本,存储在不同主机中提高系统容错率。

HDFS中有三个角色发挥着主要作用,分别是NameNode,DataNode,Secondary NameNode。

  • NameNode:主要负责管理集群中的所有数据,包括DataNode节点信息,以及文件保存的位置信息等等。
  • DataNode:实际存储数据的节点,一个集群中存在多个DataNode,互相不知道对方的信息,需要和NameNode保持心跳,汇报存储状态。当DataNode没有定期向NameNode发送心跳时,会触发NameNode的故障恢复,例如副本重新分配。
  • Secondary NameNode:从名字来看,难道是NameNode的备份节点?当NameNode宕机时代替NameNode发挥作用?实际上并不是,他的作用是帮助NameNode优化磁盘空间。和大多数持久化数据的中间件一样,HDFS对于集群元数据的持久化也是通过快照和日志来持久化进磁盘,不过Hadoop作为大型文件分布式处理系统,其操作日志非常庞大,如果靠操作日志来持久化文件,将要占用极高的磁盘空间,使用快照文件能够显著的压缩信息持久化体积,不过由于操作日志的内容过于巨大,将操作日志变为快照的过程极为耗时,如果这一操作由NameNode完成,可能会导致Hadoop集群的正常服务受到影响,所以Hadoop使用Secondary NameNode这一角色来完成这一过程,Secondary NameNode会定期的向NameNode获取快照文件(FsImage ),以及操作日志(EditLog),并且讲操作日志的内容,补充进快照文件,再将快照文件返回给NameNode,帮助NameNode完成一次信息压缩。

通常上面的学习,我们可以得到一个简单的HDFS架构图如下:

在这里插入图片描述

HDFS存储数据流程

  1. 当一个客户端想要向Hadoop中的HDFS中存储数据时,首先他需要将大型文件按照要求的文件大小进行分块,
  2. 将文件进行分块后,客户端会向NameNode发送请求(多个数据块可能会并发请求),NameNode再确认文件不存在后(如果已经存在会抛出错误),集群的元数据信息,给这个数据块,及其副本分配位置。

NameNode在给数据块分配位置时,会考虑到节点当前的负载程度,存储空间,节点是否存活等因素,并且还会尽可能将其副本分配到不同主机,甚至机架中(机架需要在配置文件中配置机架感知)。

  1. 客户端在接收到NameNode返回的信息后,会按照NameNode的安排,开始将数据块传向第一个DataNode。当第一个DataNode接收完成后,会继续将数据发向下一个DataNode(注意这里是第一个DataNode向第二个DataNode发送数据块,而不是客户端向第二个DataNode发送)。在此期间,DataNode会持续向NameNode以及客户端汇报进度。
  2. 当所有数据传输完成后,客户端会向NameNode发送一个写入完成的请求,NameNode会根据客户端发送的信息来更新自己的集群元数据。

流程图如下:

在这里插入图片描述

2. MapReduce

MapReduce是建立在HDFS基础之上的Hadoop计算框架之一(还有很多其他的计算框架),用于处理大量数据块并发计算的计算框架,MapReduce可以分为四个阶段。

输入分割(Input Splitting)

在这一阶段,输入数据被分割成较小的块,称为输入分割(Input Splits)。每个输入分割的大小通常与 Hadoop 分布式文件系统(HDFS)的块大小一致,用户可以通过配置参数(如 mapreduce.input.fileinputformat.split.minsize 和 mapreduce.input.fileinputformat.split.maxsize)调整大小。这些分割被分配给不同的映射任务(Map Tasks)进行处理。客户端也可以自由选择分块大小,甚至大于HDFS分块大小,因为MapReducer的分块是逻辑分块,是指向实际文件的引用,并不是物理分块,不受HDFS分块大小的限制。

Map阶段(Mapping)

分块完毕后,每个Map任务通过RecordReader从输入分片中解析出一个个键值对。这个过程涉及到如何定义记录边界,例如在文本文件中,可能每一行被视为一个记录。RecordReader的作用是将输入分片的内容转换为可以作为Map函数输入的键值对形式。例如,在单词计数中,RecordReader可能将文本行分割成单词,并输出如 <“Hadoop”, 1> 的键值对。

Hadoop会将映射任务尽量分配到其数据所在节点上,以节省网络带宽和提升性能。也就是计算资源向数据移动,这被称为数据本地性(Data Locality)。当无法将计算任务分配到目标主机时,Hadopp考虑机架感知,将任务分配到同一机架的主机中(机架感知需要手动配置)。

洗牌和排序阶段(Shuffling and Sorting)

在Map输出键值对后、Reducer输入前进行一次局部规约操作,称为Combiner。这一步骤是可选的优化项,可以看作是对数据的局部计算,比如说在单词计数的例子中,规约就会将当前分块的单词进行局部汇总。然后将得到的结果传入分区,通过规约的方式可以减少传输到Reducer的数据量,提高整体效率。

Combiner完成后,会进一步对结果进行分区(Partition)、排序(Sort)等多个子阶段。在这个过程中,Map输出的结果会被写入内存缓冲区(默认大小 100MB,可通过 mapreduce.task.io.sort.mb 配置)。当缓冲区达到阈值(如 80%,可通过 mapreduce.map.sort.spill.percent 配置)时,后台线程会将其溢写到磁盘;随后,Reduce任务会从各个Map节点拉取属于自己的那部分数据,并对其进行合并、排序、分组等预处理操作。

分区操作是将键值对发向目标reducer,而排序是将分区结果进一步分类,将相同的key,放在一起,比如说如果分区结果一个reducer需要处理的键值对如下:

(world, 1)
(hadoop, 1)
(world, 1)
(mapreduce, 1)

那么经过排序后,结果是:

(hadoop, 1)
(mapreduce, 1)
(world, 1)
(world, 1)

如果在Combiner阶段出现两个(world, 1),可能会变成(world, 2),这就叫规约。

reducer在开始拉取数据时,还需要再次进行合并、排序和分组,因为在洗牌和排序阶段的排序是单节点的,而reducer需要从多个节点拉取数据,所以需要将结果进行合并,在排序,并且按照既定规则进行分组。分组规则可以自定义,reducer每次会根据分组处理一组数据。

Reducer阶段

分组结束后,Hadoop会将这些分组数据依次交给对应的Reducer执行,Reducer的数量由用户通过配置参数 mapreduce.job.reduces预先指定,默认值为 1。Reduce 任务数会影响并行度和输出文件数量。Reducer 的输入是一个迭代器(Iterator),它指向当前分组的所有值。每次调用Reducer时都会传入一个分组。Reducer 会依次按照用户定义的Reducer函数(一个传入HDFS的jar包)处理每一组数据。并将结果将处理结果输出到指定的目标位置,通常是 HDFS,且默认以键值对形式存储(可以通过 OutputFormat 自定义输出格式,例如文本或序列化文件)。

流程图

在这里插入图片描述

3. Yarn

对于计算框架中,计算像向数据移动的理念,需要一个调度器来辅助执行,Yarn就是这样的一个调度器,他承接这在计算过程中的资源管理和任务调度的工作,让每个一个任务都能分配到最佳节点,并监控整个任务的执行情况。

在Hadoop1.x版本中,这一功能是由jobtracker和tasktracker完成的。

3.1 JobTracker和TaskTracker

JobTracker是一个全局服务组件,它在整个Hadoop集群中是唯一的,并且通常运行在一个专门配置的主节点上。他的主要职责包括:

  • 作业调度:接收来自客户端提交的作业,并将其分解为多个任务(Map任务和Reduce任务)。
  • 资源管理:监控整个集群的资源使用情况,并决定哪些TaskTracker节点可以执行新任务。
  • 状态监控:持续跟踪所有正在运行的任务的状态,并处理任务失败或节点失效的情况,必要时重新调度任务

当用户通过客户端提交一个MapReduce作业时,首先会创建一个JobClient实例。这个JobClient负责与JobTracker进行交互。它会将作业所需的所有文件(如输入分片信息、客户端配置文件、jar包(jar包就是客户端编写的计算任务)等)上传到HDFS上,并向JobTracker发送请求来注册该作业。

JobTracker接收到新的作业请求后,会根据客户端的配置参数将整个作业拆分为多个Map和Reducer任务,并向NameNode请求数据块所在位置,以及TaskTracker的状态信息,尽可能将任务分配给数据所在主机的TaskTracker。当数据所在的主机的TaskTracker过于繁忙时,也会根据机架感知,分配给一个机架的TaskTracker

TaskTracker是运行在每个工作节点上的从属服务。每个节点上只会有一个TaskTracker实例,它负责以下任务:

  • 任务执行:根据JobTracker的指令执行分配给它的具体任务。
  • 状态汇报:定期向JobTracker发送心跳信号,报告自身健康状况及所执行任务的进展。

TaskTracker通过心跳机制,和JobTracker保持连接,并在发送心跳时发送自己的状态信息。JobTracker会根据这些状态信息以及数据所在位置,合理的分配任务,并在返回心跳时,返回给目标TaskTracker为其分配的任务。

TaskTracker接收到来自JobTracker分配下来的具体任务之后,会为每一个任务生成一个Task实例,并且启动相应的Java虚拟机(JVM)去实际运行这个任务(因为任务的计算本质上是执行jar包的内容)。根据接收到的不同类型的动作命令(例如启动任务、提交结果、终止任务等),TaskTracker会采取相应措施来满足要求。

如果某个TaskTracker失去联系超过一定时间,则会被标记为不可用,并且其上正在运行的任务可能需要重新分配给其他可用节点。对于任何失败的任务,JobTracker会尝试重新启动它们直到达到最大重试次数为止。

当所有的Map和Reduce任务都顺利完成之后,TaskTracker会通知JobTracker。随后,JobTracker将正式宣布该作业已完成,并清理相关的临时资源。同时,如果存在输出数据的话,也会告知客户端可以从指定位置下载最终结果。

流程图

在这里插入图片描述

这个资源调度架构有一些明显缺陷:

  1. 首先所有调度任务都会集中在一个JobTracker上,这样随着集群的扩展和任务的增加,jobtrakcer的性能会成为集群扩展的瓶颈。
  2. 一旦jobtracker故障,所有计算任务都无法进行。
  3. Hadoop1.x中将TaskTracker中可用资源抽象为插槽,这些插槽的数量以及分类(map还是reducer)由启动时的hadoop配置决定,这就导致了如果map任务和reducer任务的比例和插槽分类的比例不一致,就会导致资源浪费的问题。
  4. jobtracker不能满足不同计算框架的任务调度需求。

为了解决这些问题,在hadoop2.x版本中重新引入了Yarn

3.2 Yarn

Yarn将原本的jobtracker负责的任务一分为二,将资源管理和任务调度,分别用两套结构分别负责。

资源管理

资源管理由ResourceManager和NodeManager负责管理,每个主机上都有一个NodeManager,NodeManager会向集群中唯一的ResourceManager发送主机资源信息,并维持心跳。

当客户端需要发起一个工作请求时,首先需要携带AppMaster、启动AppMaster的命令、用户程序等向ResourceManager发起请求,ResourceManager接受请求后会根据资源情况为其分配一个Contarin,并且寻找对应的NodeManager。ResourceManager会将任务分配到对应的NodeManager,NodeManager在接收到任务后会生成一个Container,负责容纳AppMaster。

Container是用来代替hadoop1.x中的插槽概念的,和插槽不同的是Container不仅可以随意容纳map和reducer任务,还可以容纳AppMaster。

AppMaster是负责任务调度的组件。在Yarn的架构中,为了兼容更多的计算框架的不同的任务调度需求。任务调度组件由计算框架自己实现,也就是说不同的计算框架会使用不同的调度组件,所以需要有客户端发送。

资源调度

AppMaster在被启动后,需要向ResourceManager进行注册,并汇报任务运行状态。和jobTracker不同的是,ResourceManager不在负责管理大量的map,reducer任务,而是由AppMaster进行管理。

AppMaster会通过心跳向ResourceManager申请任务资源,申请成功后会通知NodeManager,为任务创建Contrainer,并启动任务。各个任务需要和AppMaster维持心跳并汇报工作进度。在程序运行时,客户端可以随时向AppMaster发起请求查看任务进度。

当应用程序运行完成后,ApplicationMaster通知ResourceManager释放已分配的资源。

通过这些改变,Hadoop2.x解决了Hadoop1.x中的集群扩展问题,ResourceManager的负载能力不再是集群扩展的瓶颈。Container解决了插槽中对于资源利用的问题。多计算框架的兼容问题也随着AppMaster的出现而被解决。于此同时Hadoop2.x还可以配置多个ResourceManager来解决集群的高可用问题。

集群高可用

ResourceManager的高可用性是通过Active/Standby架构模式实现的,这种设计确保了在任意时刻只有一个ResourceManager处于Active状态,其余的则处于Standby状态。Active状态的ResourceManager会正常处理客户端的请求,而Standby状态则处于待机状态,随时等待Active状态的ResourceManager宕机时接管其任务。

为了保证故障切换时的状态一致性,Active状态的ResourceManager会将其状态信息写入到一个共享的状态存储系统中。这个状态存储系统可以是基于ZooKeeper的state-store或基于FileSystem的state-store。

FileSystem是Hadoop的一个抽象类,它定义了文件系统的基本操作接口,如创建文件、删除文件、打开文件、重命名文件等。通过 FileSystem 抽象类,Hadoop 可以轻松地支持多种文件系统。基于FileSystem的state-store就是利用HDFS自身的能力为ResourceManager提供状态存储系统能力,可以通过配置实现。

Yarn依赖于Zookeeper来实现自动故障转移,当Active节点故障时,Standby会通过抢占Zookeeper节点的方式获取Active状态,并读取共享的状态存储系统来恢复功能。

如果未启用自动故障转移,则管理员必须手动将其中一个ResourceManager转换为Active。要从一个ResourceManager到另一个ResourceManager进行故障转移,他们应该先将Active状态的ResourceManager转换为Standby,然后将Standby状态的ResourceManager转换为Active。所有这些都可以使用yarn rmadmin命令完成。

流程图(红色箭头是心跳)

在这里插入图片描述

相关文章:

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统&#xff0c;用于存储和处理大规模数据集。Hadoop 主要由HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce、Yarn&#xff08;Jobtracker&#xff0c;TaskTracker&#xff09;三大核心组件组成。其中HDFS是分布式文件…...

【操作系统】文件

文件 一、文件的概念二、文件目录2.1 FCB2.2 目录结构2.2.1 单机目录2.2.2 两级目录2.2.3 树形目录结构2.2.4 无环图目录结构 三、文件的逻辑结构和物理结构3.1 文件的逻辑结构3.1.1 顺序文件3.1.2 索引文件3.1.3 索引顺序文件 3.2 文件的物理结构3.2.1 连续分配3.2.2 隐式链接…...

我的ChatGPT怎么登不上?

近期&#xff0c;不少用户反馈在使用ChatGPT时遇到登录困难、连接超时等问题。本文将从技术角度分析常见原因&#xff0c;并提供合规、安全的解决方案&#xff0c;同时结合开发者实际需求推荐实用工具&#xff0c;助您高效应对登录障碍。 ChatGPT登录失败的常见原因 网络环境限…...

实时金融信息搜索的新突破:基于大型语言模型的智能代理框架

“An Agent Framework for Real-Time Financial Information Searching with Large Language Models” 论文地址&#xff1a;https://arxiv.org/pdf/2502.15684 摘要 在金融决策过程中&#xff0c;需要处理海量的实时信息以及复杂的时序关系。然而&#xff0c;传统的搜索引擎在…...

Linux服务器Ubuntu系统环境中安装Jupyter Notebook并且配置内核以便在网页端调用

一、前提 在使用终端访问&#xff0c;并且个人目录下已创建环境。如果还不知道创建环境和安装包&#xff0c;请参考之前文章 机器学习模型算法代码需要在环境中安装的库和包 二、安装相关库Jupyter Notebook 使用pip 或 conda指令安装&#xff0c;确保服务器上安装了 Python …...

Magic 1-For-1: 在一分钟内生成一分钟视频片段(基于Python实现,视频生成模型)

一、前言 文章所有代码都使用Python实现&#xff0c;并且可以分享开源&#xff0c;文章末尾联系博主或者往期文章末尾联系&#xff0c;欢迎探讨学习分享专业领域前言研究和技术分享。 二、摘要 在本技术报告中&#xff0c;我们介绍了 Magic 1-For-1 &#xff08;Magic141&#…...

基于RK3588的重症监护信息系统应用解决方案

重症监护信息系统是医院临床信息系统的重要组成部分&#xff0c;也是医院信息化建设的重要组成部分。通过集成化的电子病历、实时监测、决策支持等功能&#xff0c;提高重症患者的诊疗效率和质量。 图片来源于网络 重症监护信息系统主要由数据信息采集单元、信息处理单元、通信…...

二十三种设计模式

2 工厂方法模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通…...

网络安全六层模型

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单选题&#xff08;一&#xff09; 1、在以下人为的恶意攻击行为中&#xff0c;属于主动攻击的是&#xff08; &#xff09;A A&#xff0e;数据篡改及破坏 B…...

BrainSCK:通过知识注入和再激活进行大脑结构和认知对齐以诊断脑部疾病

文章目录 BrainSCK: Brain Structure and Cognition Alignment via Knowledge Injection and Reactivation for Diagnosing Brain Disorders摘要方法实验结果 BrainSCK: Brain Structure and Cognition Alignment via Knowledge Injection and Reactivation for Diagnosing Bra…...

【在Spring Boot项目中接入Modbus协议】

【在Spring Boot项目中接入Modbus协议】 在Spring Boot项目中接入Modbus协议&#xff0c;可以通过使用第三方库&#xff08;如jamod或modbus4j&#xff09;来实现。以下是一个基本的步骤指南&#xff0c;帮助你在Spring Boot项目中集成Modbus。 1. 添加依赖 首先&#xff0c;…...

CSS_复合选择器

目录 7. 复合选择器 7.1 交集选择器 7.2 并集选择器 7.3 后代选择器 7.4 子代选择器 7.5 兄弟选择器 7.6 属性选择器 7.7 伪类选择器 7.7.1动态伪类 7.7.2结构伪类 7.7.3否定伪类 7.7.4 UI伪类 7.7.5 目标选择器 7. 复合选择器 7.1 交集选择器 作用&#xff1a;…...

QT-信号与槽

1.在注册登录的练习里面&#xff0c;追加一个QListWidget项目列表 要求:点击注册之后&#xff0c;将账号显示到列表窗口小部件上面去 以及&#xff0c;在列表窗口小部件中双击某个账号的时候&#xff0c;将该账号删除 头文件 #ifndef WIDGET_H #define WIDGET_H #include <…...

在python语言中,请详细介绍一下比较运算符中等于符号(==)的情况?

李升伟 整理 一、有关思考 嗯&#xff0c;我现在要详细了解一下Python中的等于运算符&#xff08;&#xff09;。首先&#xff0c;我得回忆一下自己之前学过的知识&#xff0c;可能有些地方不太确定&#xff0c;需要仔细思考或者查阅资料。 首先&#xff0c;等于运算符&#…...

halcon学习笔记1

环境的搭建就不说了&#xff0c;主要是作者在入职后的实际学习与实践。 打开应用程序 这里作者的个人理解是1号区域主要是可以观察到读取的图像以及后续对图像进行何种操作&#xff0c;2的算子类似于Opencv中的API&#xff0c;可以在上面进行参数的调整&#xff0c;例如read_I…...

解决寻找两个正序数组中位数问题:C语言实现与解析

在算法学习和实际编程应用中&#xff0c;处理数组相关的问题是很常见的。其中&#xff0c;寻找两个正序数组的中位数就是一个经典的题目&#xff0c;不仅考验对数组操作的熟悉程度&#xff0c;还涉及到对算法效率的考量。今天&#xff0c;我们就来深入探讨如何使用C语言解决这一…...

在 ArcGIS Pro 中描绘和绘制流域

查找数字高程模型 (DEM) 对于 DEM&#xff0c;我使用了USGS Lidar Explorer 地图。该地区有 10m 分辨率的 DEM。 设置坐标系 将坐标系设置为 UTM&#xff0c;以尽量减少失真&#xff0c;并使工具在后续过程中进行更精确的计算。对于俄勒冈州&#xff0c;这是 UTM 区域 10。 …...

在华为统信UOS中安装Anaconda,并配置PyCharm

这里写目录标题 1. 下载Anaconda安装包2. 打开终端3. 安装Anaconda4.下载安装PyCharm 1. 下载Anaconda安装包 首先打开 Anaconda官网 : https://www.anaconda.com/products/distribution&#xff0c;接受或拒绝网站投喂的饼干 然后输入自己的邮箱后&#xff0c;进入下载页面…...

谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?

一、HTTPS 核心机制&#xff1a;非对称加密 对称加密 HTTPS HTTP over TLS/SSL&#xff0c;通过 ​混合加密体系​ 解决三大问题&#xff1a; ​防窃听​ - 对称加密传输内容&#xff08;如 AES&#xff09;​防篡改​ - 数字签名验证数据完整性​防冒充​ - 数字证书验证服…...

Linux虚拟机网络配置-桥接网络配置

简介 本文档旨在指导用户如何在虚拟环境中配置Linux系统的桥接网络&#xff0c;以实现虚拟机与物理主机以及外部网络的直接通信。桥接网络允许虚拟机如同一台独立的物理机一样直接连接到物理网络&#xff0c;从而可以被分配一个独立的IP地址&#xff0c;并能够与网络中的其他设…...

‌Transformer架构

‌核心原理‌ ‌自注意力机制‌ 通过计算输入序列中每个位置与其他位置的关联权重&#xff08;Query-Key匹配&#xff09;&#xff0c;动态聚合全局信息&#xff0c;解决了传统RNN/CNN的长距离依赖问题‌。 实现公式&#xff1a;Attention(Q,K,V)softmax(QKTdk)VAttention(…...

Sat- nerf深度损失

首先损失函数定义在metrics.py,代码如下: class DepthLoss(torch.nn.Module):def __init__(self, lambda_ds1.0):super().__init__()# 初始化lambda_ds参数&#xff0c;用于调节深度损失的权重&#xff0c;并且将其缩小为原来的1/3self.lambda_ds lambda_ds / 3.# 初始化均方…...

c++的多态

1.多态的概念 多态&#xff0c;通俗来说&#xff0c;就是多种形态 多态分为编译时多态(静态多态)和运⾏时多 态(动态多态) 静态多态主要是函数重载和函数模板&#xff0c;它们传不同类型的参数就可以调⽤不同的函数&#xff0c;通过参数不同达到多种形态&#xff0c;之所以叫…...

基于 Rust 与 GBT32960 规范构建高并发、高可用、高扩展服务端程序

一、需求背景 如今&#xff0c;数字化发展特别快&#xff0c;各种设备和系统之间要频繁地交换数据&#xff0c;而且这个过程变得越来越复杂。很多行业都有难题&#xff0c;既要处理大量的数据&#xff0c;又得快速响应各种命令。比如说在智能交通这一块&#xff0c;路上跑的车…...

《宝塔 Nginx SSL 端口管理实战指南:域名解析、端口冲突与后端代理解析》

&#x1f4e2; Nginx & SSL 端口管理分析 1️⃣ 域名解析与 SSL 申请失败分析 在使用宝塔申请 www.mywebsite.test 的 SSL 证书时&#xff0c;遇到了解析失败的问题。最初&#xff0c;我认为 www 只是一个附加的前缀&#xff0c;不属于域名的关键部分&#xff0c;因此只为…...

iOS 实现UIButton自动化点击埋点

思路&#xff1a;我们HOOK UIControl的 addtarget:action:forControlEvents方法&#xff0c;交换UIControl的 addtarget:action:forControlEvents 方法的实现&#xff0c; 在交换的方法中添加原来响应的同时&#xff0c;再添加一个埋点响应&#xff0c;该响应方法实现了点击埋点…...

Java 并行流(Parallel Stream)详解

并行流是Java 8引入的高效处理集合数据的工具&#xff0c;通过多线程加速计算。以下是其核心概念、使用方法及注意事项的详细指南&#xff1a; 1. 核心概念与原理 并行处理机制&#xff1a;将数据分割为多个块&#xff0c;利用Fork/Join框架在多个线程上并行处理&#xff0c;…...

开源软件的版权保护措施

开源软件的版权保护措施主要有以下几方面&#xff1a; 著作权保护 明确版权归属与许可使用&#xff1a;开源软件的源代码是著作权法保护的对象&#xff0c;作者享有复制权、发行权、改编权等专有权益。通过开源协议&#xff0c;作者明确授权用户使用、复制和修改软件&#xf…...

11.24 SpringMVC(1)@RequestMapping、@RestController、@RequestParam

一.RequestMapping("/user")//HTTP 请求方法既支持get也支持post&#xff0c;可表示为类路径与方法路径 二.RequestMapping(value "/m7", method {RequestMethod.POST, RequestMethod.GET}) value这个参数指定了请求的 URL 路径。method 参数指定了允许…...

杰和科技GDSM-C数字化信息发布管理系统,信息触达无死角,更全面

在数字化时代&#xff0c;信息的高效传递与精准管理成为商业、教育、公共服务等领域的核心需求。传统信息发布模式常面临设备分散难管控、内容更新滞后、多屏协同效率低等问题。 杰和科技为此开发了一套数字化信息发布管理系统GDSM-C&#xff08;简称 GDSM-C&#xff09;系统&a…...

如何停止Oracle expdp/impdp job

一、停止 expdp job举例 1.执行 expdp 命令 $ expdp rui/rui DIRECTORYdmp_dir dumpfilestudyfull_expdp.dmp FULLy logfilestudyfullexpdp.log job_nameexpdp_job2.查看在运行的作业名称 SQL> select job_name,state from dba_datapump_jobs; JOB_NAME …...

Java 8 中,可以使用 Stream API 和 Comparator 对 List 按照元素对象的时间字段进行倒序排序

文章目录 引言I 示例对象II List 按时间字段倒序排序: 使用 `Stream` 和 `Comparator` 排序方法 1:使用 `Comparator.comparing`方法 2:使用 `Comparator.reversed`方法 3:自定义 `Comparator`输出结果III 注意事项**时间字段类型**:**空值处理**:IV 总结引言 案例:在线用…...

MySQL零基础教程14—子查询

子查询比较简单&#xff0c;我们还是通过案例引入。 有时候我们查询的时候&#xff0c;需要用到的不止一个表的数据&#xff0c;比如下面的场景&#xff1a; 查询名字叫李晓红同学的班主任姓名 我们提供三个表的基础信息如下&#xff1a; 从三张表的结构&#xff0c;我们不难…...

考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)

一、线性表基础概念 1.1 定义与分类 定义&#xff1a;线性表是由n&#xff08;n≥0&#xff09;个相同类型数据元素构成的有限序列&#xff0c;元素间呈线性关系。 分类&#xff1a; 顺序表&#xff1a;元素按逻辑顺序存储在一段连续的物理空间中&#xff08;数组实现&…...

Microk8s Ingress实现七层负载均衡

Microk8s Ingress是什么 Ingress是k8s的一种资源对象&#xff0c;用于管理外部对集群内服务的访问, 它通过提供一个统一的入口点&#xff0c;将外部流量路由到集群内部的不同服务。 Microk8s Ingress用于解决什么问题 k8s集群中服务默认只能在集群内访问。 如果需要从外部访…...

部署Windows Server自带“工作文件夹”实现企业网盘功能完整步骤

前文已经讲解过Windows Server自带的“工作文件夹”功能&#xff0c;现以Windows Server 2025为例介绍部署工作文件夹的完整步骤&#xff1a; 为了确保您能够顺利部署和充分利用工作文件夹的功能&#xff0c;我将按照以下步骤进行讲解。 请注意&#xff0c;在域环境中部署工作…...

前缀和算法 算法4

算法题中帮助复习的知识 vector<int > dp( n ,k); n为数组大小 ,k为初始化 哈希表unordered_map<int ,int > hash; hash.find(k)返回值是迭代器 ,找到k返回其迭代器 没找到返回hash.end() hash.count(k)返回值是数字 ,找到k返回1 ,没找到返回0. C和java中 负数…...

Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误

XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值&#xff0c;那么为啥还会返回 #VALUE! 呢&#xff1f; 可能还有别的原因&#xff0c;但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列&#xff0c;是 4-21&…...

ZK Rollup

ZK Rollup 通过生成零知识证明来确保所有提交的交易都是有效的。生成零知识证明的过程涉及复杂的密码学运算&#xff0c;通常使用的是 zk-SNARK&#xff08;零知识简洁非互动知识论证&#xff09;或 zk-STARK&#xff08;零知识可扩展透明知识论证&#xff09;。以下是 ZK Roll…...

UI设计——新拟态手机主题锁屏设计分享

新拟态手机主题锁屏设计分享 给大家展示一款新式手机主题锁屏设计作品。 整体设计采用简洁的灰白主色调&#xff0c;搭配亮眼的橙色元素&#xff0c;形成鲜明对比&#xff0c;视觉效果清爽又不失活力。 上方显示大数字时钟 “20:36”&#xff0c;日期 “04/11 星期一” 以及天…...

Kafka面试题及原理

1. 消息可靠性&#xff08;不丢失&#xff09; 使用Kafka在消息的收发过程都会出现消息丢失&#xff0c;Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案&#xff1a;【分布式锁、数据库锁&#xff08;悲观锁、乐观锁…...

leetcode 238. 除自身以外数组的乘积

题目如下 数据范围 使用两个辅助数组分别存从前乘到后面和从后到前后面再计算就行。 &#xff08;f数组没处理好还包含了本不能乘于的数所以要向后移动一位&#xff09;。通过代码 class Solution { public:vector<int> productExceptSelf(vector<int>& n…...

DeepSeek 与 ChatGPT 终极对决:谁才是 AI 语言之王?

我的个人主页 我的专栏&#xff1a;人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞&#x1f44d;收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;人工智能已然成为推动各领域变革的核心力量&#xff…...

python爬虫:pyspider的详细使用

文章目录 一、pyspider介绍1.1 核心概念1.2 与其他爬虫框架的比较二、 安装 pyspider三、编写爬虫脚本四、运行和监控爬虫4.1 启动爬虫4.2 监控任务状态4.3 任务管理五、高级功能5.1 分布式爬取5.2 JavaScript 渲染5.3 数据存储5.4 定时任务5.5 错误处理和重试机制六、示例:采…...

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…...

宝塔webhooks与码云实现自动部署

1. 宝塔面板配置Webhook 登录宝塔面板&#xff0c;进入「软件商店」→ 搜索「Webhook」并安装。添加Webhook&#xff1a; 名称&#xff1a;自定义&#xff08;如 Gitee自动部署&#xff09;脚本&#xff1a;编写部署脚本&#xff0c;示例如下&#xff1a;#!/bin/bash# 项目路径…...

迷你世界脚本聊天接口:Chat

聊天接口&#xff1a;Chat 彼得兔 更新时间: 2023-04-26 10:18:43 具体函数名及描述如下: 序号 函数名 函数描述 1 sendChat(...) 发送聊天消息(默认全部玩家) 2 sendSystemMsg(...) 发送系统消息(默认全部玩家) sendChat 参数及类型&#xff1a; content:s…...

Yocto + 树莓派摄像头驱动完整指南

—— 从驱动配置、Yocto 构建&#xff0c;到 OpenCV 实战 在树莓派上运行摄像头&#xff0c;在官方的 Raspberry Pi OS 可能很简单&#xff0c;但在 Yocto 项目中&#xff0c;需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置、Yocto 关键…...

多镜头视频生成、机器人抓取、扩散模型个性化 | Big Model weekly第58期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 GLM-4-Voice: Towards Intelligent and Human-Like End-to-End Spoken Chatbot 本文介绍了一种名为GLM-4-Voice的智能且类人化的端到端语音聊天机器人。它支持中文和英文&#xff0c;能够进行实时语音对话&a…...

Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度?

Llama 2中的Margin Loss&#xff1a;为何更高的Margin导致更大的Loss和梯度&#xff1f; 在《Llama 2: Open Foundation and Fine-Tuned Chat Models》论文中&#xff0c;作者在强化学习与人类反馈&#xff08;RLHF&#xff09;的Reward Model训练中引入了Margin Loss的概念&a…...