HDFS扩缩容及数据迁移
1.黑白名单机制
在HDFS中可以通过黑名单、白名单机制进行节点管理,决定数据可以复制/不可以复制到哪些节点。
黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一个节点被加入黑名单时,HDFS会避免将新的数据块复制到该节点上,同时也会尝试移动现有的数据块副本到其他可用节点上,以确保数据的可靠性和可用性。
白名单通常是指HDFS中被标记为首选节点的列表。这些节点通常是性能较好、可靠性高、网络连接优良的节点,HDFS会尽可能地将数据块复制到这些节点上。白名单中的节点可能会被优先用于数据复制和块的放置,以提高系统的性能和可用性。
综上,黑名单用于标记HDFS不可用的节点,而白名单用于标记HDFS首选的节点。可以按照如下步骤配置HDFS中的黑白名单。
1) 创建黑白名单
在node1节点$HADOOP_HOME/etc/hadoop目录下创建blacklist和whitelist黑白名单文件,两个文件中分别配置黑名单和白名单如下:
blacklist:
node5
whitelist:
node3
node4
将以上blacklist和whitelist分发到其他Hadoop节点:
[root@node1 hadoop]# scp ./whitelist ./blacklist node2:`pwd`
[root@node1 hadoop]# scp ./whitelist ./blacklist node3:`pwd`
[root@node1 hadoop]# scp ./whitelist ./blacklist node4:`pwd`
[root@node1 hadoop]# scp ./whitelist ./blacklist node5:`pwd`
2) 配置hdfs-site.xml文件
在node1、node2节点配置hdfs-site.xml文件,追加如下配置项:
<!-- 白名单 --><property><name>dfs.hosts</name><value>/software/hadoop-3.3.6/etc/hadoop/whitelist</value></property><!-- 黑名单 --><property><name>dfs.hosts.exclude</name><value>/software/hadoop-3.3.6/etc/hadoop/blacklist</value>
</property>
注意:由于前面设置了HDFS异构存储,每个节点的额hdfs-site.xml配置不同,需要手动配置node3~node5节点的hdfs-site.xml加入以上配置。不能统一分发。
3) 重启HDFS集群
以上配置完成后,重启HDFS集群:
[root@node1 hadoop]# stop-all.sh
[root@node1 hadoop]# start-all.sh
注意:首次配置黑白名单需要重启集群,后续修改黑白名单只需要执行“hdfs dfsadmin -refreshNodes”命令即可,不需重新启动集群。
4) 观察WebUI及操作HDFS
重启集群后,通过HDFS WerUI我们可以看到DataNode信息不再有node5节点信息,如下:
并且HDFS中目前磁盘文件每个只有2个副本,node5节点不能存储block数据。
虽然node5节点不能存储block数据,但是不影响在node5节点作为HDFS客户端操作HDFS。在node5节点创建目录 /test 并将data.txt上传到该目录下:
#创建/test目录
[root@node5 ~]# hdfs dfs -mkdir /test#上传data.txt到/test目录下
[root@node5 ~]# hdfs dfs -put ./data.txt /test/
通过WebUI我们发现刚上传的data.txt 也只有2个副本:
5) 将node5节点加入白名单
修改所有hadoop节点 $HADOOP_HOME/etc/hadoop下的blacklist,将node5节点从blacklist中去掉,并加入到whitelist。最终blacklist中没有指定节点,whitelist中指定了node3、node4、node5节点。最后在任意NameNode节点执行如下命令重新刷新HDFS 节点:
#在任意NameNode节点执行如下命令,最好保证所有NameNode进程存在
[root@node1 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful for node1/192.168.179.4:8020
Refresh nodes successful for node2/192.168.179.5:8020
Refresh nodes successful for node3/192.168.179.6:8020
执行如上命令后,可以通过HDFS WebUI看到node5节点重新加入了集群中:
上传的/test/data.txt也会有3个block块信息:
2.HDFS动态扩容
HDFS集群已有DataNode节点不能满足数据存储需求,支持在原有集群基础上动态添加新的DataNode节点,这就是HDFS动态扩容。
这里准备node6节点,节点ip为192.168.197.9,该节点基于base快照进行搭建,按照如下步骤准备node6节点即可。
1) 基于快照创建node6节点
可以基于centos7 已有的虚拟机快照进行链接克隆创建新的节点,这里创建好节点后,节点相当于是一台新的机器。
2) 修改node6节点ip
启动该节点,在对应的节点路径“/etc/sysconfig/network-scripts”下配置ifg-ens33文件配置IP(注意,不同机器可能此文件名称不同,一般以ifcfg-xxx命名),以配置ip为192.168.179.9,ifcfg-ens33配置内容如下:
TYPE=Ethernet
BOOTPROTO=static #使用static配置
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
ONBOOT=yes #开机启用本配置
IPADDR=192.168.179.9 #静态IP
GATEWAY=192.168.179.2 #默认网关
NETMASK=255.255.255.0 #子网掩码
DNS1=192.168.179.2 #DNS配置 可以与默认网关相同
以上只需要修改对应的ip即可,配置完成后,在每个节点上执行如下命令重启网络服务:
systemctl restart network.service
检查该节点ip执行如下命令:
ip addr
3) 配置主机名
在该节点上修改/etc/hostname,配置对应的主机名称为node6。配置完成后需要重启节点,才能正常显示各个主机名。
4) 关闭防火墙
执行如下命令确定节点上的防火墙开启情况,需要将节点上的防火墙关闭:
#检查防火墙状态
firewall-cmd --state#临时关闭防火墙(重新开机后又会自动启动)
systemctl stop firewalld 或者systemctl stop firewalld.service#设置开机不启动防火墙
systemctl disable firewalld
5) 关闭selinx
在节点/etc/selinux/config中将SELINUX=enforcing改成SELINUX=disabled即可。
6) 设置自动更新时间
后续基于该节点搭建HDFS时,需要各节点的时间同步,可以通过设置各个节点自动更新时间来保证各个节点时间一致,具体按照以下操作来执行。
a. 修改本地时区及ntp服务
yum -y install ntp
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
/usr/sbin/ntpdate -u pool.ntp.org
b. 自动同步时间
设置定时任务,每10分钟同步一次,配置/etc/crontab文件,实现自动执行任务。建议直接crontab -e 来写入定时任务。使用crontab -l 查看当前用户定时任务。
#各个节点执行 crontab -e 写入以下内容
*/10 * * * * /usr/sbin/ntpdate -u pool.ntp.org >/dev/null 2>&1#重启定时任务
service crond restart#查看日期
date
7) 设置节点ip映射
在node1~node6节点的/etc/hosts文件中加入node6节点的映射,配置所有节点IP映射信息。进入每台节点的/etc/hosts下,修改hosts文件,vim /etc/hosts:
192.168.179.4 node1
192.168.179.5 node2
192.168.179.6 node3
192.168.179.7 node4
192.168.179.8 node5
192.168.179.9 node6
8) 配置各个节点之间免密
目前node1~node5节点进行了互相免密,只需要操作node6节点与其他节点进行免密即可。
a. 创建.ssh目录
node6节点上执行如下命令,在节点的“~”目录下,创建.ssh目录,注意,不要手动创建这个目录,因为有权限问题。
cd ~
ssh localhost
#这里会需要输入节点密码#
exit
b. 创建公钥和私钥
在node6节点上执行如下命令,给当前节点创建公钥和私钥:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
node6节点执行如下命令做到node6节点与其他节点免密:
[root@node6 ~]# ssh-copy-id node1
[root@node6 ~]# ssh-copy-id node2
[root@node6 ~]# ssh-copy-id node3
[root@node6 ~]# ssh-copy-id node4
[root@node6 ~]# ssh-copy-id node5
[root@node6 ~]# ssh-copy-id node6
分别在node1~node5节点执行如下命令做到各个节点到node6免密:
[root@node1 ~]# ssh-copy-id node6
[root@node2 ~]# ssh-copy-id node6
[root@node3 ~]# ssh-copy-id node6
[root@node4 ~]# ssh-copy-id node6
[root@node5 ~]# ssh-copy-id node6
9) node6节点安装jdk
在node6节点上安装JDK8。
a. 在node6节点创建/software目录,上传并安装jdk8 rpm包
rpm -ivh /software/jdk-8u181-linux-x64.rpm
以上命令执行完成后,会在每台节点的/user/java下安装jdk8。
b. 配置jdk环境变量
在node6节点上配置jdk的环境变量:
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
以上配置完成后,最后执行“source /etc/profile”使配置生效。
2.1 动态扩容DataNode
按照如下步骤操作即可。
1) 将node1节点配置好的hadoop 安装包发送到node6节点
[root@node1 ~]# cd /software/
[root@node1 software]# scp -r ./hadoop-3.3.6 node6:`pwd`
2) node6节点配置Hadoop环境变量
[root@node6 software]# vim /etc/profile
export HADOOP_HOME=/software/hadoop-3.3.6/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:#使配置生效
source /etc/profile
3) node6节点启动DataNode
在node6节点执行如下命令启动DataNode:
[root@node6 ~]# hdfs --daemon start datanode
4) 在各个节点白名单中加入node6
在node1~node6各个节点 $HADOOP_HOME/etc/whitelist白名单中加入node6。
各个节点whitelist 内容如下:
node3
node4
node5
node6
5) 刷新NameNode
在任意NameNode节点执行如下命令重新刷新HDFS 节点:
#在任意NameNode节点执行如下命令,最好保证所有NameNode进程存在
[root@node1 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful for node1/192.168.179.4:8020
Refresh nodes successful for node2/192.168.179.5:8020
Refresh nodes successful for node3/192.168.179.6:8020
执行如上命令后,可以通过HDFS WebUI看到node6 DataNode节点加入了集群中:
测试数据上传
在node6节点创建HDFS目录 /test2 并将data.txt上传到该目录下:
#创建/test目录
[root@node6 ~]# hdfs dfs -mkdir /test2#上传data.txt到/test目录下
[root@node6 ~]# hdfs dfs -put ./data.txt /test2/
通过WebUI我们发现刚上传的data.txt 副本分布如下,优先将数据副本存储在HDFS客户端node6上,集群DataNode动态扩容完成。
2.1.1DataNode负载均衡
向HDFS集群中加入新的DataNode后,可能会导致新DataNode节点上数据分布少,其他DataNode节点数据分布多,这样导致集群整体负载不均衡,我们可以通过命令脚本对HDFS中数据进行负载均衡操作。
#启动HDFS负载均衡操作,-threadshold 表示各个节点磁盘使用空间相差不超过5%
[root@node6 ~]# hdfs balancer -threshold 5
注意:建议在负载不高的一台节点上执行数据负载均衡操作。
2.2HDFS动态缩容
我们希望将一个DataNode节点在HDFS中“退役”下线,HDFS也同样支持动态将DataNode下线,这就是HDFS动态缩容。
这里将node6 DataNode进行下线演示,可以按照如下步骤操作即可。
1) 配置各个节点的黑白名单
在各个Hadoop节点上$HADOOP_HOME/etc/hadoop路径下配置blacklist和whitelist,将node6节点从whitelist中删除,加入到blacklist中。
blacklist:
node6
whitelist:
node3
node4
node5
将以上blacklist和whitelist分发到其他Hadoop节点上。
2) 刷新NameNode
在任意NameNode节点执行如下命令重新刷新HDFS 节点:
#在任意NameNode节点执行如下命令,最好保证所有NameNode进程存在
[root@node1 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful for node1/192.168.179.4:8020
Refresh nodes successful for node2/192.168.179.5:8020
Refresh nodes successful for node3/192.168.179.6:8020
执行如上命令后,可以通过HDFS WebUI看到node6 DataNode节点在集群中下线:
3.HDFS数据迁移
HDFS数据迁移是指将Hadoop分布式文件系统(HDFS)中的数据从一个位置或一个集群移动到另一个位置或另一个集群的过程。数据迁移通常是一种大规模的操作,可能涉及跨机房、跨集群,并且需要考虑到数据迁移规模的不同,导致整个数据迁移的周期也会有所不同。
在HDFS中,数据迁移通常用于以下几种场景:
- 冷热集群数据同步、分类存储:将冷热数据从一个集群移动到另一个集群,以便更有效地管理和存储不同类型的数据。例如,将不经常访问的冷数据移动到成本更低的存储层,而将热数据保留在性能更高的存储层上。
- 集群数据整体搬迁:当公司的业务发展导致当前服务器资源紧张时,可能需要将整个HDFS集群的数据迁移到另一个机房或集群,以利用更多资源或降低成本。
- 数据的准实时同步:确保数据的双备份可用性,即将数据实时同步到另一个集群,以便在主集群发生故障时能够无缝切换到备份集群。
进行HDFS 数据迁移时我们可以使用DistCp工具,DistCp(分布式拷贝)是Apache Hadoop生态系统中的一个工具,用于在Hadoop分布式文件系统(HDFS)之间或者同一HDFS集群内部进行数据复制和迁移。DistCp底层使用MapReduce进行数据文件复制迁移,所以执行DistCp命令后会在对应集群中生成MR Job。
搭建HDFS伪分布式集群做迁移的机器
下面在node6节点上搭建HDFS 伪分布式集群,与现有的HDFS集群进行数据迁移同步来进行HDFS数据迁移测试。
1) 下载安装包并解压
我们安装Hadoop3.3.6版本,搭建HDFS集群前,首先需要在官网下载安装包,地址如下:Apache Hadoop。下载完成安装包后,上传到node6节点的/software目录下并解压到opt目录下。
#将下载好的hadoop安装包上传到node6节点上
[root@node6 ~]# ls /software/
hadoop-3.3.6.tar.gz#将安装包解压到/opt目录下
[root@node6 ~]# cd /software/
[root@node6 software]# tar -zxvf ./hadoop-3.3.6.tar.gz -C /opt
2) 在node6节点上配置Hadoop的环境变量
[root@node6 software]# vim /etc/profile
export HADOOP_HOME=/software/hadoop-3.3.6/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:#使配置生效
source /etc/profile
3) 配置hadoop-env.sh
启动伪分布式HDFS集群时会判断$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件中是否配置JAVA_HOME,所以需要在hadoop-env.sh文件加入以下配置(大概在54行有默认注释配置的JAVA_HOME):
#vim /opt/hadoop-3.3.6/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/
4) 配置core-site.xml
进入 $HADOOP_HOME/etc/hadoop路径下,修改core-site.xml文件,指定HDFS集群数据访问地址及集群数据存放路径。
#vim /opt/hadoop-3.3.6/etc/hadoop/core-site.xml
<configuration><!-- 指定NameNode的地址 --><property><name>fs.defaultFS</name><value>hdfs://node6:8020</value></property><!-- 指定 Hadoop 数据存放的路径 --><property><name>hadoop.tmp.dir</name><value>/opt/data/local_hadoop</value></property>
</configuration>
注意:如果node6节点配置启动过HDFS,需要将“hadoop.tmp.dir”配置的目录清空。
5) 配置hdfs-site.xml
进入 $HADOOP_HOME/etc/hadoop路径下,修改hdfs-site.xml文件,指定NameNode和SecondaryNameNode节点和端口。
#vim /opt/hadoop-3.3.6/etc/hadoop/hdfs-site.xml
<configuration><!-- 指定block副本数--><property><name>dfs.replication</name><value>1</value></property><!-- NameNode WebUI访问地址--><property><name>dfs.namenode.http-address</name><value>node6:9870</value></property><!-- SecondaryNameNode WebUI访问地址--><property><name>dfs.namenode.secondary.http-address</name><value>node6:9868</value></property>
</configuration>
6) 配置workers指定DataNode节点
进入 $HADOOP_HOME/etc/hadoop路径下,修改workers配置文件,加入以下内容:
#vim /opt/hadoop-3.3.6/etc/hadoop/workers
node6
7) 配置start-dfs.sh&stop-dfs.sh
进入 $HADOOP_HOME/sbin路径下,在start-dfs.sh和stop-dfs.sh文件顶部添加操作HDFS的用户为root,防止启动错误。
#分别在start-dfs.sh 和stop-dfs.sh文件顶部添加如下内容
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
8) 格式化并启动HDFS集群
HDFS完全分布式集群搭建完成后,首次使用需要进行格式化,在NameNode节点(node6)上执行如下命令:
#在node6节点上格式化集群
[root@node6 ~]# hdfs namenode -format
格式化集群完成后就可以在node6节点上执行如下命令启动集群:
#在node6节点上启动集群
[root@node6 ~]# start-dfs.sh
至此,Hadoop完全分布式搭建完成,可以浏览器访问HDFS WebUI界面,NameNode WebUI访问地址为:https://node6:9870,需要在window中配置hosts。
3.1DistCp集群间数据迁移
DistCp命令的基本用法如下:
$ hadoop distcp OPTIONS [source_path...] <target_path>
其中OPTIONS主要参数有如下:
- -update:拷贝数据时,只拷贝相对于源端,目标端不存在的文件数据或源端修改的数据。
- -delete:删除相对于源端,目标端多出来的文件。
下面对hdfs://node1:8020集群(A集群)中的数据迁移到hdfs://node6:8020集群(B集群)中进行测试。
1) 将A集群中 test目录下的数据迁移到B集群
#在A集群中执行迁移命令
[root@node1 ~]# hadoop distcp hdfs://node1:8020/test/ hdfs://node6:8020/test#在B集群中查询数据
[root@node6 ~]# hdfs dfs -cat /test/data.txt
1,zs
2,ls
3,ww
4,ml
5,tq
2) 测试distcp -update参数
替换A集群中/test/data.txt文件,向data.txt文件写入新的数据如下:
1,zs
2,ls
3,ww
4,ml
5,tq
6,x1
7,x2
A集群中替换HDFS中/test/data.txt文件,并通过distcp 命令将追加的数据同步到B集群
[root@node6 sbin]# hdfs dfs -rm /test/data.txt#再次上传
[root@node1 ~]# hdfs dfs -put ./data.txt /test/data.txt#同步新的文件数据
[root@node1 ~]# hadoop distcp -update hdfs://node1:8020/test/ hdfs://node6:8020/test
3) 测试distcp -delete参数
向B集群HDFS集群/test目录下上传a.txt 文件,内容随意,如下:
[root@node6 ~]# hdfs dfs -put ./a.txt /test/
[root@node6 ~]# hdfs dfs -ls /test
/test/a.txt
/test/data.txt
使用distcp命令指定-delete参数删除B集群指定目录与源端A集群相应目录中相比多出的数据文件,delete参数需要结合update参数一起使用:
[root@node1 ~]# hadoop distcp -update -delete hdfs://node1:8020/test/ hdfs://node6:8020/test
以上命令执行后,B集群中创建的/test/a.txt文件被删除。
4) 如果在同一个集群中使用distcp命令,相当于集群内数据复制备份
#在A集群中执行如下命令,可以将test目录下数据备份到back目录下
[root@node1 ~]# hadoop distcp /test/ /back#检查数据
[root@node1 ~]# hdfs dfs -ls /back
/back/data.txt
相关文章:
HDFS扩缩容及数据迁移
1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理,决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...
设计模式-(状态模式,策略模式,代理模式,责任链模式)
状态模式 概念: 用于管理一个对象在不同状态下的行为变化。它允许对象在内部状态改变时改变其行为,从而让对象看起来像是改变了其类。状态模式的核心思想是将状态封装到独立的类中,每个状态类都定义了在该状态下对象的行为 状态模式主要涉…...
二、IDE集成DeepSeek保姆级教学(使用篇)
各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…...
通义灵码插件安装入门教学 - IDEA(安装篇)
在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…...
每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理
引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…...
qt-C++笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试
qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试 code review! 文章目录 qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试1.Application(Qt):Qt Widgets Application1.1.qmake版本1.2.cmake版本 2.Application(Qt):Qt Console Applicati…...
【NestJS系列】安装官方nestjs CLI 工具
环境搭建指南:从零开始创建 NestJS 项目 一、工具准备 1. 安装 Node.js 环境 推荐使用 LTS 版本(目前 20.x 以上)验证安装:终端执行 node -v 和 npm -vNode.js 官网下载2. 包管理器选择 这里选用更高效的 pnpm,你也可选择 npm 或 yarn # 安装 pnpm npm install -g pnp…...
【Springboot知识】Logback从1.2.x升级到1.3.x需要注意哪些点?
文章目录 **1. 确认依赖版本**示例依赖配置(Maven): **2. 处理 StaticLoggerBinder 的移除**解决方案: **3. 修改日志配置文件**示例 logback.xml 配置: **4. 检查兼容性问题**Spring Boot 2.x 的兼容性解决方案&#…...
【Linux C | 时间】localtime 的介绍、死机、死锁问题以及 localtime_r 函数的时区问题
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
每日一题——LRU缓存机制的C语言实现详解
LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...
虚函数表和虚函数表指针
1.虚函数表什么时候生成? 编译器编译的时候生成 2.虚函数表存放在哪里? 讨论两种情况:在磁盘(可执行程序)、在内存(运行状态) 3.虚函数表与虚函数表指针的关系 每个类只有一个虚函数&#x…...
计算机毕业设计SpringBoot+Vue.js图书进销存管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具,就好像是一个大管家,帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…...
【学写LibreCAD】1 LibreCAD主程序
一、源码 头文件: #ifndef MAIN_H #define MAIN_H#include<QStringList>#define STR(x) #x #define XSTR(x) STR(x)/*** brief handleArgs* param argc cli argument counter from main()* param argv cli arguments from main()* param argClean a list…...
CentOS7最小化安装中使用curl安装yum和wget
在 CentOS 7 最小化安装中,如果已经有curl工具,可以按照以下步骤使用它来安装yum和wget: 1. 备份原有的 yum 源配置文件 为了避免配置冲突或后续需要恢复,先备份原有的yum源配置文件。 mv /etc/yum.repos.d/CentOS-Base.repo /…...
【Linux】learning notes(3)make、copy、move、remove
文章目录 1、mkdir (make directory)2、rmdir (remove directory)3、rm(remove)4、>5、touch 新建文件6、mv(move)7、cp(copy) 1、mkdir (make…...
P10108 [GESP202312 六级] 闯关游戏
题目大意 如题 分析 设最佳通关方案为 { s 1 , s 2 , . . . , s k } \{s_1,s_2,...,s_k\} {s1,s2,...,sk},其中 s i s_i si 代表第 i i i 次到达的关卡( ≥ N \ge N ≥N 的不算)。 当 a k N − 1 a_kN-1 akN−1 时&#…...
Dubbo RPC 原理
一、Dubbo 简介 Apache Dubbo 是一款高性能、轻量级的开源 RPC 框架,支持服务治理、协议扩展、负载均衡、容错机制等核心功能,广泛应用于微服务架构。其核心目标是解决分布式服务之间的高效通信与服务治理问题。 二、Dubbo 架构设计 1. 核心组件 Prov…...
网络安全 机器学习算法 计算机网络安全机制
(一)网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型: 自主访问控制强制访问控制 访问控制措施: 入…...
【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
确定执行机器和自定义工作目录(忽略节点的workspace) pipeline{agent {node {label "XXXXX"customWorkspace "E:/workspace/"}}parameters {}options {}stages {}post {} }仅确定执行机器 pipeline{agent { label "XXXXX&quo…...
Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
【万字长文】开源之播对话白鲸开源CEO郭炜--乐观主义的开源精神走得更远
本文为白鲸开源科技CEO郭炜1小时深度访谈全记录 来源于:开源之播」Episode15:对话郭炜–乐观主义的开源精神走得更远 大家好,我是郭炜,开源圈的“郭大侠”。作为 Apache 基金会的成员,我曾参与并孵化了多个开源项目,如…...
Verilog 位运算符和逻辑运算符的使用
Verilog 位运算符和逻辑运算符的使用 目录 前言 一、逻辑运算符 二、位运算符 总结 前言 本文详细描述了Verilog 逻辑运算符和位运算符的使用,随着编程的熟练,有时候总是喜欢混用它们,虽然能实现同样的功能,但最好还是注意一下…...
压测报告:DeepSeek-R1-Distill-Qwen-32B模型性能评估
1. 实验背景 本实验旨在评估DeepSeek-R1-Distill-Qwen-32B模型在特定硬件配置下的性能表现。测试硬件为GPU服务器。实验主要关注模型在不同并发请求数下的峰值生成速度。 吞吐量(Throughput): 测试模型在单位时间内可以处理多少请求,通常以“每秒生成的令牌数(tokens/s)…...
【论文笔记】ClipSAM: CLIP and SAM collaboration for zero-shot anomaly segmentation
原文链接 摘要 近年来,CLIP 和 SAM 等基础模型在零样本异常分割 (ZSAS) 任务中展现出良好的性能。然而,无论是基于 CLIP 还是基于 SAM 的 ZSAS 方法,仍然存在不可忽视的关键缺陷:1) CLIP 主要关注不同输入之间的全局特征对齐&am…...
DeepSeek:面向效率与垂直领域的下一代大语言模型技术解析
本文将深入剖析DeepSeek模型的核心算法架构,揭示其在神经网络技术上的突破性创新,并与主流大模型进行全方位技术对比。文章涵盖模型设计理念、训练范式优化、应用场景差异等关键维度,为读者呈现大语言模型领域的最新发展图景。 一、DeepSeek…...
win32汇编环境,加速键的应用示例
;运行效果 ;win32汇编环境,加速键的应用示例 ;加速键,就是按某个键,开启某个功能。不用鼠标点来点去的东西。 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>…...
【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机
一、计算机网络分层结构 计算机网络分层结构 指将计算机网络的功能划分为多个层次,每个层次都有其特定的功能和协议,并且层次之间通过接口进行通信。 分层设计的优势: 模块化:各层独立发展(如IPv4→IPv6,…...
[Web 安全] 反序列化漏洞 - 学习笔记
关注这个专栏的其他相关笔记:[Web 安全] Web 安全攻防 - 学习手册-CSDN博客 0x01:反序列化漏洞 — 漏洞介绍 反序列化漏洞是一种常见的安全漏洞,主要出现在应用程序将 序列化数据 重新转换为对象(即反序列化)的过程中…...
每日一题——字母异位词分组
字母异位词分组 1. 问题描述示例提示 2. 解题思路具体步骤 3. 代码实现4. 代码解析(1)排序法(2)哈希表存储(3)动态内存分配(4)释放内存1. HASH_FIND_STR 的作用2. 宏的定义4. 详细解…...
力扣 807. 保持城市天际线(Java实现)
题目分析 给定一个二维数组,行列长度相等,要保持四个方向仍一观察高度不变的情况下,适当添加建筑高度,问最大高度增量和。所谓四个方向高度不变的增量,其实就是arr[i][j]与同i行最大值同j列最大值之间的最小值的差&…...
【视频2 - 4】初识操作系统,Linux,虚拟机
📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。…...
重启securecmd失败
重启securecmd失败 问题描述:KES集群部署工具中,节点管理里新增节点下一步报错无法检查securecmd端口进程情况,安装依赖包后再次下一步提示如下报错: 解决办法: [rootlocalhost cluster]# cd /home/kingbase/cluster…...
python学习四
python运算符与表达式 表达式: Python中的表达式是一种计算结果的代码片段。它可以包 含变量、运算符、常数和函数调用,用于执行各种数学、逻辑 和功能操作 算术运算符: 比较(关系)运算符: 赋值运算符: 逻辑运算符: 位运算符: 成员运算符: 身份运算符 <...
LeetCode 236.二叉树的最近公共祖先
题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
react 中,使用antd layout布局中的sider 做sider的展开和收起功能
一 话不多说,先展示效果: 展开时: 收起时: 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…...
2025-02-26 学习记录--C/C++-C语言 整数格式说明符
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 C语言 整数格式说明符 【例如 】🎀 :在 C 语言中,%ld 是 printf 或 scanf 等格式化输入输出函…...
绕过过滤order by
一、常见绕过技术 1、注释符截断 利用注释符(如 --、#)截断后续查询,消除过滤逻辑的影响。 ORDER BY 1-- 若原查询为 SELECT * FROM table ORDER BY 用户输入,注入后可能忽略后续过滤逻辑。 2、大小写混淆/编码绕过 若过滤是大…...
NLP09-加强1-对比SVM
支持向量机(SVM) (一)导入 SVM 相关库 (二) 修改模型初始化 (三) 比较 朴素贝叶斯分类器 SVM分类器 支持向量机(SVM) 代码修改基于NLP09-朴素贝叶斯问句…...
STM32——HAL库开发笔记22(定时器3—呼吸灯实验)(参考来源:b站铁头山羊)
本文利用前几节所学知识来实现一个呼吸灯实验:两颗led灯交替呼吸。 一、STM32CubeMX配置 step1:配置调试接口 step2:配置定时器 定时器1位于APB2总线上,如上图所示。 step3:配置时基单元 按照下图配置 时钟来源配置…...
Vue3+TypeScript 封装一个好用的防抖节流自定义指令
一、前言:为什么需要防抖节流? 在前端开发中,高频触发的事件(如滚动、输入、点击等)容易导致性能问题。防抖(debounce) 和 节流(throttle) 是两种常用的优化手段&#x…...
2025年中国最新安防行业数字安全现状与未来趋势:内生安全成核心共识,从零基础到精通,收藏这篇就够了!
本次,我将为大家剖析由**安奇信发布的《中国安防行业数字安全建设与发展情况白皮书**》。该报告共_37_页,涵盖了众多重要信息和核心论点。若您希望深入了解,请参阅原报告,获取方法已在文档的最后部分提供。 报告核心内容 随着数字…...
项目管理的新理念主要有哪些
随着时代的发展和市场需求的变化,项目管理的理念也在不断地创新和演变。项目管理的新理念包括敏捷管理、精益管理、知识管理、变革管理、协作式管理和项目生命周期管理等。这些新理念不仅能够提高项目的管理效率,还能帮助团队在复杂的环境中更好地应对挑…...
Spring如何解决循环依赖?
一、Spring的三级缓存 关键就是提前暴露未完全创建完毕的Bean。 三级缓存来解决循环依赖: 一级缓存:用于存储完全初始化完成的单例Bean。 二级缓存:用于存储尚未完全初始化,但已实例化的Bean,用于提前暴露对象&#x…...
vscode java环境中文乱码的问题
先说我的结论: 由于我的系统是windows的,所以vscode使用的是默认gbk的编码进行的。 但是我的目的是全部都使用utf-8,因为我的程序始终是要去linux上去运行的,总不能在本地是好的,然后到服务器上就不行了吧,…...
十、大数据资源平台功能架构
一、大数据资源平台的功能架构图总体结构 大数据资源平台功能架构图 关键组件: 1.用户(顶行) 此部分标识与平台交互的各种利益相关者。 其中包括: 市领导 各部门分析师 区政府 外部组织 公民 开发人员 运营经理 2.功能模…...
OpenEuler学习笔记(三十五):搭建代码托管服务器
以下是主流的代码托管软件分类及推荐,涵盖自托管和云端方案,您可根据团队规模、功能需求及资源情况选择: 一、自托管代码托管平台(可私有部署) 1. GitLab 简介: 功能全面的 DevOps 平台,支持代码托管、C…...
使用Spring AI调用Ollama的DeepSeek模型实现结构化输出
在 Docker 环境中部署 Ollama 并使用 Spring AI 框架实现结构化输出,你可以按照以下步骤进行操作: 1. 部署 Ollama 模型 首先,需要在 Docker 中部署 Ollama 并下载 deepseek-r1:1.5b 模型。 1.1 准备部署文件 version: 3.8services:ollam…...
微信小程序调用火山方舟(字节跳动火山引擎)中的DeepSeek大模型
微信小程序的轻量化特性与DeepSeek大模型的AI能力结合,可快速构建智能问答、内容生成等场景化服务。通过火山方舟平台提供的标准化接口,开发者无需深入算法细节即可调用模型能力。 一、注册火山引擎账号,创建API Key和model(接入…...