HDFS的架构优势与基本操作
目录
- 写在前面
- 一、 HDFS概述
-
- 1.1 HDFS简介
- 1.2 HDFS优缺点
-
- 1.2.1 优点
- 1.2.2 缺点
- 1.3 HDFS组成架构
- 1.4 HDFS文件块大小
- 二、HDFS的Shell操作(开发重点)
-
- 2.1 基本语法
- 2.2 命令大全
- 2.3 常用命令实操
-
- 2.3.1 上传
- 2.3.2 下载
- 2.3.3 HDFS直接操作
- 三、HDFS的API操作
-
- 3.1 配置Windows
- 3.2 HDFS的API案例实操
-
- 3.2.1 HDFS文件上传
- 3.2.2 HDFS文件下载
- 3.2.3 HDFS文件更名和移动
- 3.2.4 HDFS删除文件和目录
- 3.2.5 HDFS文件详情查看
- 3.2.6 HDFS文件和文件夹判断
- 写在最后
写在前面
如今,数据正以指数级增长,各行各业都在追求更多的数据存储、高效的数据处理和可靠的数据基础来驱动业务的发展。Hadoop Distributed File System(HDFS)作为Hadoop生态系统的核心组件之一,成为构建可靠的大数据基础的不二选择之一。本文将深入剖析HDFS的架构与优势。
一、 HDFS概述
1.1 HDFS简介
HDFS(Hadoop分布式文件系统)是Apache Hadoop框架的一部分,设计用于存储和处理大规模数据集的分布式文件系统。HDFS产生的背景主要是为了满足处理大规模数据的需求。
在过去,传统的文件系统难以处理大规模数据集,因为它们通常只能在单个服务器上存储和操作数据。随着大数据时代的到来,企业和组织面临着巨大的数据规模和复杂性。为了应对这个挑战,HDFS被开发出来作为一个高度可靠和高容量的分布式文件系统。
HDFS的设计目标是能够在廉价的硬件上运行,并且能够容纳上千台机器的集群。它通过将数据切分成多个块并将其分散存储在不同的计算节点上,实现了高吞吐量的数据访问和处理能力。此外,HDFS还提供了故障容错功能,能够自动处理存储节点的故障。
简而言之,HDFS是为了解决大规模数据处理问题而设计的,它提供了高可靠性、高扩展性和高吞吐量的分布式文件系统解决方案。
1.2 HDFS优缺点
1.2.1 优点
- 高容错、高可用、高扩展
- 数据冗余多副本、副本丢失后自动恢复
- NameNode HA、安全模式
- 10K节点规模,通过横向扩展来增加存储容量和处理能力。
- 海量数据存储(高容量)
- 典型文件大小GB~TB,百万以上文件数量,PB甚至EB以上数据规模
- 构建成本低、安全可靠
- 构建在廉价的商用服务器上,降低了存储成本和维护成本。
- 通过多副本机制,提高可靠性
- 提供了容错和恢复机制
- 适合大规模离线批处理
- 流式数据访问
- 数据位置暴露给计算框架
1.2.2 缺点
- 不适合低延迟数据访问
- 对于实时数据访问和低延迟要求较高的场景,HDFS的性能可能不够理想
- 不适合大量小文件存储
- 元数据会占用NameNode大量存储空间
- 磁盘寻道时间超过读取时间
- 不支持并发写入
- 一个文件同时只能有一个写,不允许多个线程同时写
- 不支持文件随机修改
- 仅支持数据追加
1.3 HDFS组成架构
-
NameNode(nn):
NameNode是HDFS的主节点(Master),负责管理整个文件系统的命名空间和数据块的元数据信息。它维护文件系统的目录结构、文件的安全权限信息和数据块的位置信息等。NameNode还处理客户端的文件系统操作请求,如文件的读写和块的创建、复制和删除等。 -
DataNode(dn):
DataNode是HDFS的工作节点(Slave),负责实际存储文件数据和执行文件系统操作的任务。每个DataNode负责管理一定数量的数据块,并定期向NameNode报告数据块的存储信息。DataNode还处理来自客户端和其他DataNode的读取和写入请求,以及数据块的复制和恢复等。 -
客户端(Client):
客户端是使用HDFS的应用程序。它们通过与Namenode和DataNode进行通信来读取和写入文件。客户端向NameNode请求文件的元数据信息,根据元数据信息确定所需数据块的位置,并从DataNode获取数据。客户端还负责处理文件系统的操作,如创建、删除、重命名和移动文件等。
1.4 HDFS文件块大小
HDFS中的文件在物理上是分成一个个数据块(Block)存储的,块的大小可以通过配置参数(dfs.blocksize)来规定,文件块默认大小是128M。
HDFS文件块的大小选择是根据以下考虑因素:
-
吞吐量:较大的文件块大小在处理大文件时可以提供更高的吞吐量。这是因为较大的文件块减少了磁盘寻道和网络传输的开销,使得数据读取和写入能够更加高效。
-
空间利用:较大的文件块可以减少存储元数据的开销。在HDFS中,每个文件块都有一条元数据记录,较小的文件块可能会导致元数据记录数量增加,增加了存储的开销。
-
并行性:较大的文件块可以提高数据的并行处理能力。在HDFS中,数据块是独立存储和处理的,较大的文件块能够在不同的计算节点上并行处理,从而减少整个作业的执行时间。
较大的文件块适合存储大型文件和批量处理任务,但对于小型文件和实时数据处理,较小的文件块可能更加适合。
Q:为什么HDFS文件块的大小不能太大,也不能设置太小呢?
A: 文件块设置太小,会增加寻址的时间;设置太大,会导致数据处理非常慢。
HDFS文件块的大小设置取决于磁盘的传输速率
二、HDFS的Shell操作(开发重点)
2.1 基本语法
hadoop fs 具体命令
或者 hdfs dfs 具体命令
2.2 命令大全
[amo@hadoop102 hadoop-3.2.4]$ bin/hadoop fs
Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...][-chown [-R] [OWNER][:[GROUP]] PATH...][-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>][-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>][-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...][-cp [-f] [-p | -p[topax]] [-d] [-t <thread count>] [-q <thread pool queue size>] <src> ... <dst>][-createSnapshot <snapshotDir> [<snapshotName>]][-deleteSnapshot <snapshotDir> <snapshotName>][-df [-h] [<path> ...]][-du [-s] [-h] [-v] [-x] <path> ...][-expunge [-immediate]][-find <path> ... <expression> ...][-get [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>][-getfacl [-R] <path>][-getfattr [-R] {-n name | -d} [-e en] <path>][-getmerge [-nl] [-skip-empty-file] <src> <localdst>][-head <file>][-help [cmd ...]][-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]][-mkdir [-p] <path> ...][-moveFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>][-moveToLocal <src> <localdst>][-mv <src> ... <dst>][-put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>][-renameSnapshot <snapshotDir> <oldName> <newName>][-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...][-rmdir [--ignore-fail-on-non-empty] <dir> ...][-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]][-setfattr {-n name [-v value] | -x name} <path>][-setrep [-R] [-w] <rep> <path> ...][-stat [format] <path> ...][-tail [-f] [-s <sleep interval>] <file>][-test -[defswrz] <path>][-text [-ignoreCrc] <src> ...][-touch [-a] [-m] [-t TIMESTAMP (yyyyMMdd:HHmmss) ] [-c] <path> ...][-touchz <path> ...][-truncate [-w] <length> <path> ...][-usage [cmd ...]]Generic options supported are:
-conf <configuration file> specify an application configuration file
-D <property=value> define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port> specify a ResourceManager
-files <file1,...> specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...> specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...> specify a comma-separated list of archives to be unarchived on the compute machinesThe general command line syntax is:
command [genericOptions] [commandOptions]
2.3 常用命令实操
-
创建一个文件夹,用来操作命令
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mkdir /amoxilin
-
help:输出这个命令参数
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -help rm
2.3.1 上传
-
-moveFromLocal:从本地剪切粘贴到HDFS
创建一个测试文件 test.txt,并输入一些内容
[amo@hadoop102 hadoop-3.2.4]$ vim test.txt
使用 moveFromLocal 命令将test.txt文件移动到 HDFS
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -moveFromLocal ./test.txt /amoxilin
-
-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[amo@hadoop102 hadoop-3.2.4]$ vim test1.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -copyFromLocal test1.txt /amoxilin -
-put:等同于copyFromLocal,生产环境更习惯用put
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -put test1.txt /amoxilin
-
-appendToFile:追加一个文件到已经存在的文件末尾
创建一个文件test2.txt 并输入内容: 123
[amo@hadoop102 hadoop-3.2.4]$ vim test2.txt
将文件 test2.txt 追加到test.txt文件末尾
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -appendToFile test2.txt /amoxilin/test.txt
2.3.2 下载
-
-copyToLocal: 从HDFS拷贝到本地
将 HDFS 中的test.txt文件copy下来
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -copyToLocal /amoxilin/test.txt ./
[amo@hadoop102 hadoop-3.2.4]$ ls # 查看文件是否拷贝成功 文件夹中有 test.txt,拷贝成功
bin etc lib LICENSE.txt NOTICE.txt sbin test1.txt test.txt wcoutput
data include libexec logs README.txt share test2.txt wcinput
[amo@hadoop102 hadoop-3.2.4]$ -
-get: 等同于copyToLocal,生产环境更习惯用get
将 HDFS 中的test.txt文件copy下来,并起一个其他的名字比如123.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -get /amoxilin/test.txt ./123.txt
[amo@hadoop102 hadoop-3.2.4]$ ls
123.txt etc libexec NOTICE.txt share test.txt
bin include LICENSE.txt README.txt test1.txt wcinput
data lib logs sbin test2.txt wcoutput
[amo@hadoop102 hadoop-3.2.4]$
2.3.3 HDFS直接操作
-
-ls: 显示目录信息
查看 HDFS 里amoxilin文件夹的目录结构
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
Found 2 items
-rw-r–r-- 3 amo supergroup 9 2024-03-07 23:33 /amoxilin/test.txt
-rw-r–r-- 3 amo supergroup 49 2024-03-07 23:29 /amoxilin/test1.txt -
-cat: 显示文件内容
查看某个文件的详细信息
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -cat /amoxilin/test.txt
test
123 -
-chgrp、-chmod、-chown: Linux文件系统中的用法一样,修改文件所属权限
修改文件的权限
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -chmod 666 /amoxilin/test.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
Found 2 items
-rw-rw-rw- 3 amo supergroup 9 2024-03-07 23:33 /amoxilin/test.txt
-rw-r–r-- 3 amo supergroup 49 2024-03-07 23:29 /amoxilin/test1.txt修改文件的group
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -chown amo:amo/amoxilin/test.txt
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -ls /amoxilin
Found 2 items
-rw-rw-rw- 3 amo amo 9 2024-03-07 23:33 /amoxilin/test.txt
-rw-r–r-- 3 amo supergroup 49 2024-03-07 23:29 /amoxilin/test1.txt -
-mkdir: 创建路径
创建文件夹
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mkdir /csdn
-
-cp: 从HDFS的一个路径拷贝到HDFS的另一个路径
复制文件
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -cp /amoxilin/test1.txt /csdn
-
-mv: 在HDFS目录中移动文件
移动文件
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -mv /amoxilin/test.txt /csdn
-
-tail: 显示一个文件的末尾1kb的数据
查看文件末尾内容
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -tail /amoxilin/test1.txt
欲买桂花同载酒,终不似,少年游!
[amo@hadoop102 hadoop-3.2.4]$ -
-rm: 删除文件或文件夹
删除
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -rm /amoxilin/test1.txt
Deleted /amoxilin/test1.txt -
-rm -r: 递归删除目录及目录里面内容
递归删除
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -rm -r /amoxilin
Deleted /amoxilin -
-u: 统计文件夹的大小信息
统计文件夹的大小
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -du -s -h /csdn
58 174 /csdn # 58 是文件大小 文件有三个副本就是58*3=174统计文件夹内各文件的大小
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -du -h /csdn
9 27 /csdn/test.txt
49 147 /csdn/test1.txt -
-setrep: 设置HDFS中文件的副本数量
设置hdfs副本数量
[amo@hadoop102 hadoop-3.2.4]$ hadoop fs -setrep 5 /csdn/test1.txt
Replication 5 set: /csdn/test1.txt
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到5台时,副本数才能达到5。
三、HDFS的API操作
3.1 配置Windows
- 解压Hadoop安装包到Windows系统
D:hadoop-3.2.4
- 设置$HADOOP_HOME环境变量指向
D:hadoop-3.2.4
- 配置Path环境变量
%HADOOP_HOME%in
- 下载
- hadoop.dll 下载地址
- winutils.exe 下载地址
- 将 hadoop.dll 和 winutils.exe 放入$HADOOP_HOME/bin 文件夹中
3.2 HDFS的API案例实操
-
在IDEA中创建一个Maven工程,并导入相应的依赖坐标以及日志
org.apache.hadoop hadoop-client 3.2.4 junit junit 4.12 org.slf4j slf4j-log4j12 1.7.30 -
创建HdfsClient类
public class HdfsClient {
@Test public void test() throws IOException, URISyntaxException, InterruptedException {// 1 获取一个客户端实例// 参数1:hdfs文件系统地址// 参数2:配置文件// 参数3:用户FileSystem fs= FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 创建目录fs.mkdirs(new Path("/amxl"));// 3 关闭资源fs.close(); }
}
-
执行程序
3.2.1 HDFS文件上传
-
编写源代码
// 文件上传
@Test
public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {// 1 获取一个客户端实例 // 参数1:hdfs文件系统路径 // 参数2:配置信息 // 参数3:用户名 FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 使用客户端对象操作HDFS // copyFromLocalFile(是否删除源数据,是否覆盖目标数据,源数据路径,目标数据路径) fs.copyFromLocalFile(false, true, new Path("D:
ote.txt"),new Path(“/amxl”));
// 3 关闭资源fs.close();
}
文件默认的副本为3
-
将hdfs-site.xml拷贝到项目的resources资源目录下,重新上传文件
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> dfs.replication 1
在resources目录下自定义配置文件并设置文件副本数为1,发现此处配置文件参数的优先级是高于默认配置的文件的
-
代码中修改配置
@Test
public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {Configuration configuration = new Configuration(); // 设置文件副本数为 2 configuration.set("dfs.replication","2"); FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "amo"); fs.copyFromLocalFile(false, true, new Path("D:
ote.txt"),new Path(“/amxl”));
fs.close();
}
重新上传文件,发现文件的副本数为2
- 小结
参数优先级排序:客户端代码中设置的值 > resources下的用户自定义配置文件 >然后是服务器的自定义配置 >服务器的默认配置
3.2.2 HDFS文件下载
// 文件下载
@Test
public void testCopyToLocal() throws URISyntaxException, IOException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 使用客户端对象操作 HDFS 将 note.txt文件下载到本地 D 盘// copyToLocalFile(是否删除源文件,下载的文件路径,文件下载的目标路径,是否开启文件校验)fs.copyToLocalFile(false,new Path("/amxl/note.txt"),new Path("D:\"),true);// 3 关闭资源fs.close();
}
3.2.3 HDFS文件更名和移动
// 文件移动和重命名
@Test
public void testRename() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 文件重命名// rename(源文件名,目标文件名)fs.rename(new Path("/amxl/note.txt"), new Path("/amxl/note1.txt"));// 文件移动// rename(源文件路径,目标文件路径)fs.rename(new Path("/csdn/test1.txt"), new Path("/amxl/test.txt"));// 3 关闭资源fs.close();
}
移动前:
移动后:
3.2.4 HDFS删除文件和目录
// 删除文件和文件夹
@Test
public void testDelete() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 文件删除// delete(路径)// delete(路径,是否递归)fs.delete(new Path("/amxl/note1.txt"), false);fs.delete(new Path("/csdn"), true);// 3 关闭资源fs.close();
}
删除前:
删除后:
3.2.5 HDFS文件详情查看
查看文件名称、权限、长度、块信息
// 查看文件详细信息
@Test
public void testGetFileStatus() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "amo");// 2 文件详细信息// listStatus(路径)// listStatus(路径,是否递归)RemoteIterator<LocatedFileStatus> listedFiles = fs.listFiles(new Path("/amxl"), true);while (listedFiles.hasNext()) {LocatedFileStatus next = listedFiles.next();System.out.println(next.getPath());System.out.println(next.getPermission());System.out.println(next.getOwner());System.out.println(next.getGroup());System.out.println(next.getLen());System.out.println(next.getModificationTime());System.out.println(next.getReplication());System.out.println(next.getBlockSize());// 获取块信息BlockLocation[] blockLocations = next.getBlockLocations();System.out.println(Arrays.toString(blockLocations));}// 3 关闭资源fs.close();
}// -----------------------------------------------------------------------------------------// 输出
hdfs://hadoop102:8020/amxl/test.txt
rw-r--r--
amo
supergroup
49
1709910523258
5
134217728
[0,49,hadoop104,hadoop103,hadoop102]
3.2.6 HDFS文件和文件夹判断
// 判断文件夹和文件
@Test
public void testListFiles() throws IOException, URISyntaxException, InterruptedException {// 1 获取配置信息以及加载配置 并获取一个客户端实例FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), new Configuration(), "guo");// 2 判断文件夹和文件// listStatus(路径)FileStatus[] fileStatuses = fs.listStatus(new Path("/"));for (FileStatus fileStatus : fileStatuses) {// 判断是否是文件if(fileStatus.isFile()) {System.out.println("文件:" + fileStatus.getPath().getName());}else {System.out.println("文件夹:" + fileStatus.getPath().getName());}}
// FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
//
// for (FileStatus fileStatus : fileStatuses) {
// // 判断是否是文件夹
// if (fileStatus.isFile()) {
// System.out.println("文件:" + fileStatus.getPath().getName());
// }
// if (fileStatus.isDirectory()) {
// System.out.println("文件夹:" + fileStatus.getPath().getName());
// }
// }// 3 关闭资源fs.close();
}
写在最后
总的来说,HDFS架构的优势和基本操作使其成为构建可靠的大数据基础的理想选择。它的高可靠性、高扩展性和高效的数据访问方式,为处理大规模数据提供了强大的支持,并通过Shell操作和API操作,方便用户管理和操作存储在HDFS中的数据。
相关文章:
HDFS的架构优势与基本操作
目录 写在前面一、 HDFS概述 1.1 HDFS简介1.2 HDFS优缺点 1.2.1 优点1.2.2 缺点 1.3 HDFS组成架构1.4 HDFS文件块大小 二、HDFS的Shell操作(开发重点) 2.1 基本语法2.2 命令大全2.3 常用命令实操 2.3.1 上传2.3.2 下载2.3.3 HDFS直接操作 三、HDFS的AP…...
hive表修改字段类型没有级连导致历史分区报错
一:问题背景 修改hive的分区表时有级连概念,指字段的最新状态,默认只对往后的分区数据生效,而之前的分区保留历史元数据状态。好处就是修改语句的效率很快,坏处就是如果历史分区的数据还有用,那就回发生分…...
023:到底什么是感受野?
本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请查看这里。 在前面介绍卷积算法时,一直在强调一个内容,那就是卷积算法的运算过程是—— 卷积核在输入图像上滑动扫描的过程。 在每一次扫描时,可以…...
GoFrame g.* 方法和数据类型
GoFrame g.* 方法和数据类型 GoFrame 框架通过 g.* 方法提供了一系列常用的数据类型和对象获取方法。这个模块采用强耦合设计,目的是为开发者提供便捷的类型和对象调用方式。 使用方式 import "github.com/gogf/gf/v2/frame/g"数据类型 基础类型别名 …...
分苹果,若a ^ b ^ c = 0意味着:a 和 (b ^ c) 的值相等,或者 b 和 (a ^ c) 的值相等,以及 c 和 (a ^ b) 的值相等。
若a ^ b ^ c faultSum,那么faultSum 0时,即可产生上面的平分方案。说明可以满足二进制平分 #include<bits/stdc.h> using namespace std; int main() { int n; cin>>n; vector<int> weight(n); for(int i0;i<n;i) {…...
深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化
目录 什么是协同过滤算法核心原理基本步骤相似度计算代码实现详解1.流程图2.创建基础的数据结构存储用户评分数据3.计算用户相似度4.获取相似用户5.推荐方法 算法优化建议1. 数据预处理优化去除异常值和噪声数据进行数据标准化使用稀疏矩阵优化存储 2. 相似度计算优化使用局部敏…...
电梯系统的UML文档04
这个版本的类图是直接从4.2节中用例图的描述得来的,这个视图中的类覆盖了系统所有的功能。我们用电梯类和电梯控制器类(ElevatorControl)移动或停止电梯;用门类开门或关门;用指示器类让乘客知道电梯的位置和方向&#…...
《自动驾驶与机器人中的SLAM技术》ch4:预积分学
目录 1 预积分的定义 2 预积分的测量模型 ( 预积分的测量值可由 IMU 的测量值积分得到 ) 2.1 旋转部分 2.2 速度部分 2.3 平移部分 2.4 将预积分测量和误差式代回最初的定义式 3 预积分的噪声模型和协方差矩阵 3.1 旋转部分 3.2 速度部分 3.3 平移部分 3.4 噪声项合并 4 零偏的…...
海量数据的处理
一般来说都是针对数据量特别大,内存有限制的。 第一类:topk问题 比如,在海量数据中找前50大的数据怎么办? 方法一:使用小顶堆,用小顶堆维护这50个元素,当有新元素到来时,直接与堆…...
Python人脸识别库DeepFace使用教程及源码解析
目录 一、DeepFace介绍 1、人脸库设计 2、DeepFace.find 3、DeepFace.verify 4、DeepFace.analyze 5、DeepFace.extract_faces 6、DeepFace.represent 7、DeepFace.stream 二、DeepFace二次开发 1、开发活体检测API 2、模型权重持久化 三、总结 一、DeepFace介绍 …...
Nacos:使用PgSQL数据源
数据源插件开源仓库地址:nacos-datasource-extend-plugins 一、PostgreSQL数据库安装 1、本文使用Docker进行数据库的安装,使用docker命令拉取的PG14版本的数据库: docker pull postgres:14.6 2、创建PG容器并启动,映射了5432…...
基于Python的多元医疗知识图谱构建与应用研究(下)
五、基于医疗知识图谱的医疗知识图谱程序构建 5.1 数据层构建 5.1.1 数据源选择与获取 在构建基于医疗知识图谱的医疗知识图谱数据层时,数据源的选择与获取至关重要。数据源的质量和丰富度直接决定了知识图谱的可靠性和实用性。医学文献是重要的数据源之一,包括学术期刊论…...
JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南
1、简述 在复杂的业务系统中,订单流程往往需要一系列的操作,比如验证订单、检查库存、处理支付、更新订单状态等。责任链模式(Chain of Responsibility)可以帮助我们将这些处理步骤分开,并且以链式方式处理每一个操作…...
SpringBoot多级配置文件
1.问题先导 有这样的场景,我们开发完毕后需要测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运 行我们的工程时需要临时修改很多配置,如下 java –jar springboot.jar –-spring.profiles.activete…...
阿里云安装mikrotik7配置内网互通
阿里云近期推出了200M不限量机器,对于没有公网接入的中小企业可以借助这个机器对多地分支机构进行内网互通。目前已经有很多机构用这个搞跨云k8s,跨云集群了。 mikrotik作为一个商用的软件,操作性比一些开源的软件好用不少。 本文使用的网段为172.16.1…...
std::forward实现原理与应用场景
std::forward 是 C11 引入的一个函数模板,用于实现完美转发(Perfect Forwarding)。它的核心作用是根据传入的参数,决定将参数以左值引用还是右值引用的方式进行转发,从而保持参数的原始值类别。 实现原理 template&l…...
TiDB 在市面上的热门应用领域
TiDB 在市面上的热门应用领域 TiDB 作为一款分布式数据库,凭借其高可扩展性和强一致性,逐渐成为多个行业和领域的热门选择。那么,TiDB 在市面上主要应用在哪些领域呢?今天我们来看看 TiDB 在几个热门领域的应用场景。 1. 互联网…...
“深入浅出”系列之C++:(11)推荐一些C++的开源项目
1. SQLiteCpp - 简单易用的Sqlite C封装库 仓库地址:https://github.com/SRombauts/SQLiteCpp 简介:SQLiteCpp是一个对Sqlite数据库进行C封装的开源库,代码行数约2,500行。它提供了简洁易用的接口,使得在C项目中操作Sqlite数据库…...
高等数学学习笔记 ☞ 定积分的积分方法
1. 定积分的换元积分法 1. 换元积分公式:设函数在闭区间上连续,令,若满足: ①:当时,;当时,。 此时的大小关系不一定,但与最好对应着写,否则就要留意变号的问…...
KVA教程-插件开发
“如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 KVA 技术教程 * 插件开发 简介 插件开发是KVA&a…...
AI守护煤矿安全生产:基于视频智能的煤矿管理系统架构解析
前言 本文我将介绍我和我的团队自主研发设计的一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。 这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的…...
AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发
AI编程工具横向评测–Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发 数据分析类应用的开发,指的是首先进行数据分析,比如统计学分析、机器学习模型的构建等,然后将分析的流程开发成数据分析类的工具,或者将数据分…...
04JavaWeb——Maven-SpringBootWeb入门
Maven 课程内容 初识Maven Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 IDEA集成Maven 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后,我们即将开始学习后端Web开发技术。做为一名Java开发工程师,后端Web开发…...
ThreeJS能力演示——界面点选交互能力
1、支持界面点选 点选模型整体思路是:根据camera位置作为起始点,叠加鼠标相对位置作为偏置,摄像头方向作为射线方向。 根据射线方向中的遇到的3D物体列表,第一个遇到的物体作为被点选的物体。 // 鼠标事件处理let selectedObjec…...
Linux:常用命令--文件与目录操作
ls命令 功能:(list)列出当前目录的文件信息 语法:ls [-l -h -a] [参数] 参数:被查看的文件夹,不提供参数,表示查看当前工作目录-l,以列表形式查看每个文件的属性,包含…...
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南 node-gyp Node.js native addon build tool [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/no/node-gyp 项目基础介绍及主要编程语言 Node.js NativeAddon 构建工具(node-gyp…...
docker运行Java项目,Kaptcha因为字体缺失没法显示验证码图片
2015工作至今,10年资深全栈工程师,CTO,擅长带团队、攻克各种技术难题、研发各类软件产品,我的代码态度:代码虐我千百遍,我待代码如初恋,我的工作态度:极致,责任ÿ…...
C++otlv4连接sql serveer使用记录(注意点)
C使用otlv4在做插入时,有一些设计的坑需要注意 插入数据: 当要给表中插入单个字符时,数据库表设计使用varchar(1)是合理的,但是otlv4一直报错char。 后续查很久才知道,otlv4所写的绑定的字符数组的长度应该实际数组…...
[思考记录]认知和思考
在以前,具备一定的技能和经验就能轻易找到自己的一席之地。但在AI时代下,这些东西很容易就被抹平,那么我们的竞争力又在哪里?“认知和思考”是一个方向,帮助我们能去应对复杂情境、帮我们更容易去看到真相。 1.很多时…...
前端开发Web
Ajax 概念:Asynchronous JavaScriptAnd XML,异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的…...
【C++提高篇】—— C++泛型编程之模板基本语法和使用的详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、模板的概念二、函数模板2.1 函数模板的使用2.2 函数模板注意事项2.3 普通函数与函数模板的区别2.4 普通函数与函数模板的调用规则2.5 模板的局限性 三、类模…...
WPS计算机二级•高效操作技巧
听说这里是目录哦 斜线表头 展示项目名称🍋🟩横排转竖排🍐批量删除表格空白行🍈方法一方法二建辅助列找空值 能量站😚 斜线表头 展示项目名称🍋🟩 选中单元格,单击右键➡️“设…...
【Maui】视图界面与数据模型绑定
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&…...
vue3-sfc-loader 加载远程.vue文件(sfc)案例
注意事项 style标签如果增加了lang比如:lang“scss”,需要提供scss-loader的处理器,这个暂时没研究,我的处理方式是将动态模版的css放在了全局打包暂时还没有测试,后面测试了会同步更新 安装vue3-sfc-loader npm inst…...
Hadoop美食推荐系统 爬虫1.8w+数据 协同过滤余弦函数推荐美食 Springboot Vue Element-UI前后端分离
Hadoop美食推荐系统 爬虫1.8w数据 协同过滤余弦函数推荐美食 Springboot Vue Element-UI前后端分离 【Hadoop项目】 1. data.csv上传到hadoop集群环境 2. data.csv数据清洗 3.MapReducer数据汇总处理, 将Reducer的结果数据保存到本地Mysql数据库中 4. SpringbootEchartsMySQL 显…...
使用Linux驱动程序的fasync(文件异步通知机制)向用户空间发送SIGIO信号的学习记录
前言 本文学习使用Linux驱动程序的fasync(文件异步通知机制)向用户空间发送SIGIO信号。 fasync(文件异步通知机制)名字的来历 fasync 是 “file asynchronous” 的缩写,意思是 文件异步通知。 这里的文件是指文件结构体struct file *file ,关于文件结…...
面试经验分享-回忆版某小公司
说说你项目中数据仓库是怎么分层的,为什么要分层? 首先是ODS层,连接数据源和数据仓库,数据会进行简单的ETL操作,数据来源通常是业务数据库,用户日志文件或者来自消息队列的数据等 中间是核心的数据仓库层&a…...
【算法学习笔记】35:扩展欧几里得算法求解线性同余方程
线性同余方程问题 线程同余方程问题是指 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m),给定 a a a、 b b b和 m m m,找到一个整数 x x x使得该方程成立,即使得 a x m o d m b ax~mod~mb ax mod mb,随便返回任何一个…...
ent.SetDatabaseDefaults()
在 AutoCAD 的 .NET API 中,ent.SetDatabaseDefaults() 这句代码通常用于将一个实体(Entity)对象的属性设置为与其所在的数据库(Database)的默认设置相匹配。这意味着,该实体将采用数据库级别的默认颜色、图…...
使用docker部署tomcat服务器和mysql数据库
使用docker部署tomcat服务器 1、拉去tomcat镜像 [rootlocalhost yum.repos.d]# sudo docker pull docker.io/tomcat:9 9: Pulling from library/tomcat de44b265507a: Pull complete 4c2afd91a87d: Pull complete 89e9bbcfa697: Pull complete 11be3e613582: Pull complet…...
Jenkins 启动
废话 这一阵子感觉空虚,心里空捞捞的,总想找点事情做,即使这是一件微小的事情,空余时间除了骑车、打球,偶尔朋友聚会 … 还能干什么呢? 当独自一人时,究竟可以做点什么,填补这空虚…...
Elasticsearch(ES)基础查询语法的使用
1. Match Query (全文检索查询) 用于执行全文检索,适合搜索文本字段。 { “query”: { “match”: { “field”: “value” } } } match_phrase:精确匹配短语,适合用于短语搜索。 { “query”: { “match_phrase”: { “field”: “text” }…...
SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
前言 在微服务架构中,API 网关扮演着至关重要的角色,负责路由请求、执行安全验证、流量控制等任务。Spring Cloud Gateway 作为一个强大的网关解决方案,提供了灵活的方式来实现这些功能。 本篇博客将重点介绍如何在 Spring Cloud Gateway 中…...
Android Studio:Linux环境下安装与配置
更多内容:XiaoJ的知识星球 Android Studio:Linux环境下安装与配置 1.安装JDK2.安装Android Studio2.1 获取安装包2.2 安装(1)配置环境变量:(2)运行安装:(3)配…...
使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比
“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址:https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题,限制了深度学习在…...
【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:product.kylinos.cn 开发者专区:developer.kylinos.cn 文档中心:document.kylinos.cn 交流论坛:forum.kylinos.cn 服务器环境以及配置 【内核版本…...
如何将数据库字符集改为中文,让今后所有的数据库都支持中文
最后一行有我自己的my.ini文件 数据库输入中文数据时会变为乱码, 这个时候,我们为每个数据库设置字符集,太过于麻烦,为数据库单独设置重启后又会消失 Set character_set_database’utf8’; Set character_set_server’utf8’; …...
Linux-C/C++--深入探究文件 I/O (下)(文件共享、原子操作与竞争冒险、系统调用、截断文件)
经过上一章内容的学习,了解了 Linux 下空洞文件的概念;open 函数的 O_APPEND 和 O_TRUNC 标志;多次打开同一文件;复制文件描述符;等内容 本章将会接着探究文件IO,讨论如下主题内容。 文件共享介绍&…...
Linux Bash 中使用重定向运算符的 5 种方法
注:机翻,未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…...
opengrok_windows_环境搭建
目录 软件列表 软件安装 工程索引 编辑 工程部署 问题列表 软件列表 软件名下载地址用途JDKhttps://download.java.net/openjdk/jdk16/ri/openjdk-1636_windows-x64_bin.zipindex 使用java工具tomcathttps://dlcdn.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tom…...