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

Hadoop简明教程

文章目录

    • 关于Hadoop
    • Hadoop拓扑结构
      • Namenode 和 Datanode
    • 基本管理
      • 启动Hadoop
      • 启动YARN
      • 验证Hadoop服务
      • 停止Hadoop
      • 停止HDFS
    • Hadoop集群搭建步骤
      • 准备阶段
      • Java环境配置
      • Hadoop安装与配置
      • HDFS格式化与启动服务
      • 测试集群
      • 安装额外组件
      • 监控与维护:
    • 使用Docker搭建集群
    • 使用Hadoop读写数据
      • 写入数据到HDFS
      • 读数据
    • 使用Hadoop进行分布式计算

本文帮助大家快速上手Hadoop。

关于Hadoop

Google通过三篇重量级论文为大数据时代提供了三项革命性技术:GFS、MapReduce和BigTable,即所谓的Google大数据的“三驾马车”。

  • GFS(Google File System)是Google面向大规模数据密集型应用的、可伸缩的分布式文件系统,可在廉价的硬件上运行,并具有可靠的容错能力。
  • MapReduce是一种并行编程模式,可以在超大分布式集群上并行运算,对超大规模数据集进行处理。
  • BigTable是在GFS上构建的处理结构化数据的分布式数据库,可以用于处理海量数据的更新和随机查询。
    Hadoop和Hbase是基于这三项技术发展出的开源实现。在大数据分析和处理领域,Hadoop兼容体系已经成为一个非常成熟的生态圈,涵盖了很多大数据相关的基础组件,包括Hadoop、Hbase、Hive、Spark、Flink、Storm、Presto、Impala等。

Hadoop拓扑结构

Namenode 和 Datanode

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

在这里插入图片描述
Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。

集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
在这里插入图片描述

基本管理

Hadoop集群的启动和停止涉及到其多个服务的管理,主要包括HDFS(Hadoop Distributed File System)和YARN(Yet Another Resource Negotiator)。这些服务通常通过位于Hadoop安装目录下的脚本来控制。

启动Hadoop

启动HDFS,打开终端并切换到Hadoop的sbin目录。 运行start-dfs.sh脚本来启动HDFS。这将依次启动NameNode、Secondary NameNode和所有DataNodes(如果是在集群模式下)。

  cd $HADOOP_HOME/sbin./start-dfs.sh

启动YARN

在同一个sbin目录下,运行start-yarn.sh脚本来启动YARN。这将启动ResourceManager和所有NodeManagers。

./start-yarn.sh

验证Hadoop服务

使用jps命令来验证Hadoop服务是否已经启动。

jps

你应该能看到NameNode, DataNode, SecondaryNameNode, ResourceManager, 和 NodeManager 进程。

停止Hadoop

停止YARN,在Hadoop的sbin目录下运行stop-yarn.sh脚本来停止YARN服务。

./stop-yarn.sh

停止HDFS

接着运行stop-dfs.sh脚本来停止HDFS服务。

./stop-dfs.sh

这将依次停止所有DataNodes、Secondary NameNode和NameNode。
全部停止

如果你想一次性停止所有Hadoop服务,可以运行stop-all.sh脚本。

./stop-all.sh

同样地,如果你想一次性启动所有Hadoop服务,可以运行start-all.sh脚本。

./start-all.sh

请注意,这些脚本可能会根据你的Hadoop版本和配置略有不同。在某些情况下,你可能需要使用完整的路径来引用这些脚本,例如$HADOOP_HOME/sbin/start-dfs.sh。

另外,如果你使用的是Hadoop 2.x或更高版本,YARN的启动和停止脚本名可能与上面提到的不同。例如,在Hadoop 2.x中,YARN的启动脚本可能是start-yarn.sh而不是start-mapred.sh。在使用这些脚本之前,请确保你查阅了你的Hadoop版本的官方文档。

Hadoop集群搭建步骤

搭建Hadoop集群涉及多个步骤,具体取决于你的硬件环境、操作系统选择以及Hadoop的版本。以下是一个基于Linux系统的Hadoop集群搭建的基本流程:

准备阶段

环境规划:确定Hadoop集群的规模,包括Master节点和Slave节点的数量,以及它们之间的网络拓扑结构。
硬件准备:确保所有服务器满足Hadoop的要求,如足够的CPU、内存和磁盘空间。
操作系统安装:在所有服务器上安装相同版本的Linux发行版。
SSH无密码登录:配置Master节点到所有其他节点的SSH无密码登录,便于远程管理。
时钟同步:使用NTP或其他工具同步所有节点的系统时间。
关闭防火墙:暂时关闭防火墙以避免网络问题。

Java环境配置

安装Java:在所有节点上安装Java SE Development Kit (JDK),并配置JAVA_HOME环境变量。

Hadoop安装与配置

上传Hadoop:将Hadoop的tar.gz压缩包上传至所有节点的指定目录。
解压Hadoop:在每个节点上解压Hadoop压缩包。
配置Hadoop:编辑Hadoop的核心配置文件,如core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml等,确保它们指向正确的存储目录和网络配置。
环境变量设置:在所有节点上设置HADOOP_HOME环境变量,并更新.bashrc或.profile以包含Hadoop的bin目录。

HDFS格式化与启动服务

格式化HDFS:在Master节点上执行HDFS格式化命令。
启动Hadoop服务:在Master节点上启动HDFS和YARN服务。

测试集群

测试HDFS:上传一些数据到HDFS并检查是否能够正确读取。
测试MapReduce或YARN:运行一个简单的MapReduce任务或Spark作业,确保集群正常工作。

安装额外组件

安装Hive:如果需要SQL-like查询能力,可以在Hadoop集群上安装Hive。
安装HBase:如果需要NoSQL数据库功能,可以安装HBase。

监控与维护:

安装监控工具:例如使用Ganglia或Nagios监控集群健康状态。
定期维护:包括数据平衡、日志分析和软件升级等。

请注意,具体的配置细节会根据Hadoop的版本和你的具体需求有所不同。如果你正在使用Hadoop 2.x或3.x,某些配置文件的名称可能略有不同,比如mapred-site.xml在Hadoop 2.x中被mapreduce-site.xml所取代。

在实际操作中,你可能需要参考Hadoop官方文档和相关的社区指南来获得最新的配置建议和解决潜在的问题

使用Docker搭建集群

使用Docker搭建Hadoop集群可以简化部署过程,同时提供更好的隔离性和可移植性。以下是一个使用Docker和Docker Compose搭建Hadoop伪分布式环境的步骤:
步骤1: 准备Docker镜像

首先,你需要获取Hadoop的Docker镜像。你可以在Docker Hub上找到预构建的Hadoop镜像,或者自己构建一个。这里假设你使用的是bde2020/hadoop-distrubuted镜像。
步骤2: 编写Docker Compose文件

创建一个docker-compose.yml文件,定义你的Hadoop集群。以下是一个示例文件,用于创建一个包含NameNode、DataNode和JobTracker的伪分布式集群:

version: '3'services:namenode:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_namenoderestart: alwaysvolumes:- ./hadoop/namenode:/hadoop/dfs/namenodeenvironment:SERVICE_PRECONDITION: "datanode:9866 jobtracker:9001"ports:- "50070:50070"datanode:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_datanoderestart: alwaysvolumes:- ./hadoop/datanode:/hadoop/dfs/datanodeports:- "9866:9866"jobtracker:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_jobtrackerrestart: alwaysports:- "9001:9001"secondarynamenode:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_secondarynamenoderestart: alwaysvolumes:- ./hadoop/secondarynamenode:/hadoop/dfs/secondarynamenodeports:- "50090:50090"

步骤3: 格式化HDFS并启动集群

在你的Docker Compose文件所在的目录下,运行以下命令来格式化HDFS并启动集群:

# 格式化HDFS
docker-compose run --rm namenode /usr/local/bin/hadoop namenode -format# 启动集群
docker-compose up -d

步骤4: 验证集群

你可以通过访问各个服务的Web UI来验证集群是否正常运行。例如,NameNode的Web UI通常可以通过http://localhost:50070/访问。
步骤5: 使用Hadoop集群

现在,你可以在容器内部或外部运行Hadoop命令,例如上传文件到HDFS或提交MapReduce作业。为了在宿主机上运行Hadoop命令并连接到Docker中的集群,你可能需要配置/.bashrc或/.profile来包含Docker容器中的Hadoop bin目录。

以上步骤描述了一个基础的Hadoop伪分布式集群的搭建过程。对于全分布式集群,你可能需要在多台物理机器上运行Docker,并调整Docker Compose文件以反映你的网络配置。

使用Hadoop读写数据

在Hadoop中,我们通常使用HDFS(Hadoop Distributed File System)进行数据存储,以及MapReduce或Spark进行数据处理。以下是一个使用Java API进行HDFS数据读写的简单示例:

写入数据到HDFS

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;public class HDFSWritter {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();FileSystem fs = FileSystem.get(URI.create("hdfs://namenode:9000"), conf, "hdfs");String file = "/path/to/your/file";OutputStream out = fs.create(new Path(file));IOUtils.copyBytes("This is some text", 0, 15, out, conf);IOUtils.closeStream(out);fs.close();}
}

读数据

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;import java.io.InputStream;
import java.net.URI;public class HDFSReader {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();FileSystem fs = FileSystem.get(URI.create("hdfs://namenode:9000"), conf, "hdfs");String file = "/path/to/your/file";InputStream in = fs.open(new Path(file));IOUtils.copyBytes(in, System.out, 4096, false);IOUtils.closeStream(in);fs.close();}
}

注意:在上述代码中,“namenode:9000”应替换为你的Hadoop集群的namenode地址和端口,“hdfs”应替换为你的Hadoop集群的用户名,“/path/to/your/file”应替换为你想要读写文件的实际路径。

此外,你还需要在你的项目中添加Hadoop的依赖,例如在Maven的pom.xml中添加:

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.2.1</version></dependency>
</dependencies>

使用Hadoop进行分布式计算

在Hadoop中,主要通过MapReduce框架来进行分布式计算。下面是一个使用Java编写的简单WordCount程序的例子,它展示了如何使用Hadoop MapReduce进行分布式计算。
步骤1: 创建Mapper类

import java.io.IOException;
import java.util.StringTokenizer;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();StringTokenizer tokenizer = new StringTokenizer(line);while (tokenizer.hasMoreTokens()) {word.set(tokenizer.nextToken());context.write(word, one);}}
}

步骤2: 创建Reducer类

import java.io.IOException;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}
}

步骤3: 创建Driver类

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCountDriver {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setCombinerClass(WordCountReducer.class);job.setReducerClass(WordCountReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

运行程序

首先,你需要将输入文本文件放到HDFS上,然后运行你的MapReduce程序。假设你的输入文件在HDFS上的路径是/user/input,输出路径是/user/output,那么你可以在命令行中使用以下命令运行你的程序:

hadoop jar your-jar-file.jar WordCountDriver /user/input /user/output

相关文章:

Hadoop简明教程

文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护&#xff1a; 使用Docker搭建集群使用Hado…...

基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184)

基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】整体需求总结【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】华为云IOT手机APP界面开发思路1.3 项目开发背景【1】选题的意义【2…...

SpringBoot源码阅读(10)——后处理器

后处理器是在监听器EnvironmentPostProcessorApplicationListener中被加载。 入口在SpringApplication实例方法prepareEnvironment&#xff0c;第343行。 listeners.environmentPrepared(bootstrapContext, environment);这里触发了事件ApplicationEnvironmentPreparedEvent 相…...

【源码开源】C#桌面应用开发:串口调试助手

c#桌面应用开发 1、环境搭建和工程创建&#xff1a;参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 &#xff08;1&#xff09;端口扫描&#xff1a; private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…...

malloc与free函数的用法(精简全面 · 一看即懂)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;今天为大家带来malloc函数与free函数的用法&#xff0c;我们一起来看看吧&#xff01; 目录 一、malloc函数 &#x1f4ab; 1、⭐️malloc函数对应的头文件⭐️ 2、⭐️malloc函数的作用⭐️ 3…...

强制升级最新系统,微软全面淘汰Win10和部分11用户

说出来可能不信&#xff0c;距离 Windows 11 正式发布已过去整整三年时间&#xff0c;按理说现在怎么也得人均 Win 11 水平了吧&#xff1f; 然而事实却是&#xff0c;三年时间过去 Win 11 占有率仅仅突破到 29%&#xff0c;也就跳起来摸 Win 10 屁股的程度。 2024 年 6 月 Wi…...

java-命令行连接 mysql

在 Java 中&#xff0c;通过命令行连接 MySQL 可以使用以下步骤。假设您已经安装并配置了 MySQL 5.7。 ### 一、通过命令行连接 MySQL #### 1. 打开命令行终端 在不同的操作系统上打开命令行终端的方式&#xff1a; - **Windows**&#xff1a;按 Win R 键&#xff0c;输入…...

RK3588部署YOLOV8-seg的问题

在使用YOLOV8-seg训练出来的pt模型转为onnx的时候&#xff0c;利用以下仓库地址转。 git clone https://github.com/airockchip/ultralytics_yolov8.git 在修改ultralytics/cfg/default.yaml中的task&#xff0c;mode为model为自己需要的内容后&#xff0c; 执行以下语句 cd …...

Python Linux下编译

注意 本教程针对较新Linux系统&#xff0c;没有升级依赖、处理旧版本Linux的openssl等步骤&#xff0c;如有需要可以查看往期文章&#xff0c;例如&#xff1a;在Centos7.6镜像中安装Python3.9 教程中没有使用默认位置、默认可执行文件名&#xff0c;请注意甄别 安装路径&#…...

SpringMVC(3)——SpringMVC注解实战

前言 SpringMVC&#xff08;2&#xff09;——controller方法参数与html表单对应&#xff08;请求参数的绑定&#xff09; 上篇博客我们提到了controller方法的参数与html表单之间的对应关系 但是这种对应关系有很多缺点&#xff1a; 传递参数只能放在request的body当中&am…...

统信UOS上批量安装惠普打印驱动后启动器没有图标的解决方法

原文链接&#xff1a;统信UOS上批量安装惠普打印驱动后启动器没有图标的解决方法 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在统信UOS上批量安装惠普打印驱动后启动器没有设置图标的解决方法的文章。批量安装打印驱动是企业和个人用户常见的操作&#xff0…...

Python UDP编程之实时聊天与网络监控详解

概要 UDP(User Datagram Protocol,用户数据报协议)是网络协议中的一种,主要用于快速、简单的通信场景。与TCP相比,UDP没有连接、确认、重传等机制,因此传输效率高,但也不保证数据的可靠性和顺序。本文将详细介绍Python中如何使用UDP协议进行网络通信,并包含相应的示例…...

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索 1、用户管理1.1、添加用户1.2、关联通道1.3、重置密码1.4、编辑1.5、删除1.6、过滤搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、用户管理 1.1、添加用户 点击用户管理…...

SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目

前述&#xff1a; 本篇教程将略过很多docker下载环境配置的基础步骤&#xff0c;如果您对docker不太熟悉请参考我的上一个教程&#xff1a;SpringBoot新手快速入门系列教程九&#xff1a;基于docker容器&#xff0c;部署一个简单的项目 使用 Docker Compose 支持部署 Docker 项…...

websocket中的STOMP 协议:sockjs-client 和 stompjs

文章目录 一、简介二、安装三、创建 webSocket.ts四、页面中使用一、简介 使用 WebSockets 进行实时通信时,一种常见的实现方式是使用 STOMP 协议。STOMP(Simple Text Oriented Messaging Protocol)是一种轻量级的协议,通常用于客户端和消息代理之间的通信,如 WebSockets…...

阿里云API安全2.0全新发布

阿里云安全发布API防护产品已将近三年&#xff0c;为客户提供API资产全生命周期监控管理&#xff0c;发现和管理业务中存在的全量API接口资产&#xff0c;并提升API接口在数据流转过程中的安全性&#xff0c;现已全面覆盖OWASP提出的API TOP 10安全风险。 近期&#xff0c;阿里…...

学习网络的第一步:全面解析OSI与TCP/IP模型

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…...

鸿蒙语言基础类库:【@ohos.util (util工具函数)】

util工具函数 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…...

CVPR`24 | 又快又好!渲染速度比ENeRF快30倍!4K4D:实时4K分辨率4D视图合成

文章链接&#xff1a;https://arxiv.org/pdf/2310.11448 git链接&#xff1a; https://zju3dv.github.io/4k4d/ 本文旨在实现动态3D场景在4K分辨率下的高保真和实时视图合成。最近&#xff0c;一些动态视图合成方法在渲染质量方面表现出色。然而&#xff0c;在渲染高分辨率图像…...

中关村软件园发布“数据合规与出境评估服务平台”

在2024中关村论坛年会期间&#xff0c;中关村软件园发布“数据合规与出境评估服务平台”。该平台是中关村软件园结合北京市“两区”建设&#xff0c;立足软件园国家数字服务出口基地和数字贸易港建设&#xff0c;围绕园区内外部企业用户的业务合作、科研创新、跨国运营等场景需…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...