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中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...
【2025信息安全软考重点考点归纳】实时更新
重点页:第14章 恶意代码防范技术原理 页码:271 病毒载体及其对应案例 病毒隐秘载体病毒案例Word文档Melissa照片库尔尼科娃电子邮件“求职信”病毒网页NIMDA病毒 重点页:第6章 认证技术原理与应用 页码:125 Kerberos 认证技术 Kerberos是…...
在生产环境中部署和管理 PostgreSQL:实战经验与最佳实践
在生产环境中部署和管理 PostgreSQL:实战经验与最佳实践 大家好,我是Echo_Wish。今天我们来聊一聊如何在生产环境中部署和管理 PostgreSQL。作为一种广泛使用的开源数据库,PostgreSQL 因其强大的功能和灵活性,成为许多开发者和运维人员的首选数据库。无论是在小型应用还是…...

使用OpenCV实现帧间变化检测:基于轮廓的动态区域标注
在计算机视觉中,帧间差异检测(frame differencing)是一种常用的技术,用于检测视频流中的动态变化区域。这种方法尤其适用于监控、运动分析、目标追踪等场景。在这篇博客中,我们将通过分析一个基于OpenCV的简单帧间差异…...
rabbitmq单向ssl认证配置与最佳实践(适用于各大云厂商)
背景 这里后补直接上代码 最佳实践 主要从两个方面保证消息不丢失 RabbitMQ方面 创建队列时开启持久化创建交换器时开启持久化创建镜像队列(可选)开启延迟队列(可选) 代码层面 开启生产者到交换器回调参数开启交换器到队列…...
解决 Tkinter 在 Linux 上 Combobox 组件导致焦点丢失问题
在使用 Tkinter 开发 GUI 应用程序时,我们经常会遇到一些棘手的问题,尤其是在 Linux 系统上。最近,我在开发一个项目时就遇到了一个非常有趣且令人困惑的问题:当我在一个弹出窗口中使用 grab_set() 方法锁定窗口以避免用户操作底层…...
JVM 简单内存结构及例子
Java虚拟机(JVM)内存结构是Java程序运行时内存分配和管理的方式。JVM内存结构通常分为以下几个主要部分: 方法区(Method Area): 存储类信息、常量、静态变量以及即时编译后的代码等数据。 这部分内存在JVM启…...

前端项目配置初始化
creat-vue 安装 https://cn.vuejs.org/guide/quick-start.html 官网复制npm安装语句 cmd窗口创建文件夹 npm create vue3.12.2安装webstorm启动vue项目 https://www.jetbrains.com/webstorm/download/other.html 2024.3.2.1 安装依赖 下载包node_modules package 运行服…...
如何让 Git 管理本地项目
如何让 Git 管理本地项目:详细步骤指南 Git 是最流行的分布式版本控制系统,能够高效管理项目的代码变更历史。以下是将本地项目交给 Git 管理的完整流程,适用于首次使用 Git 的开发者。 一、前置条件 安装 Git 二、初始化 Git 仓库 进入项目…...

浅谈新能源汽车充电桩建设问题分析及解决方案
摘要: 在全球倡导低碳减排的大背景下,新能源成为热门行业在全球范围内得以开展。汽车尾气排放会在一定程度上加重温室效应,并且化石能源的日渐紧缺也迫切对新能源汽车发展提出新要求。现阶段的新能源汽车以电力汽车为主,与燃油汽…...

《Effective Objective-C》阅读笔记(中)
目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...
LSM-Tree (日志结构合并树)
LSM-Tree(日志结构合并树)是一种高效处理写操作的存储结构,广泛应用于NoSQL数据库如LevelDB和RocksDB。其核心思想是将随机写入转换为顺序写入,提升吞吐量。以下是其原理及Java实现示例: ### **LSM-Tree 原理** 1. **…...

【深入理解JWT】从认证授权到网关安全
最近的项目学习中,在进行登陆模块的用户信息验证这一部分又用到了JWT的一些概念和相关知识,特在此写了这篇文章、方便各位笔者理解JWT相关概念 目录 先来理解JWT是什么? 区分有状态认证和无状态认证 有状态认证 VS 无状态认证 JWT令牌的…...

利用 Open3D 保存并载入相机视角的简单示例
1. 前言 在使用 Open3D 进行三维可视化和点云处理时,有时需要将当前的视角(Camera Viewpoint)保存下来,以便下次再次打开时能够还原到同样的视角。本文将演示如何在最新的 Open3D GUI 界面(o3d.visualization.gui / o…...

智绘教:Windows平台上的高效悬浮窗画笔工具深度解析
在Windows平台上,一款高效、实用的悬浮窗画笔工具对于提升工作效率和演示效果至关重要。今天,我要为大家介绍一款备受好评的悬浮窗画笔程序——智绘教。这款软件以其丰富的功能和便捷的操作,成为了众多用户心中的首选。接下来,让我们一起深入了解智绘教的各项特性。 一、体…...
从“Switch-case“到“智能模式“:C#模式匹配的终极进化指南
当代码开始"思考" 你是否厌倦了层层嵌套的if-else地狱?是否想过让代码像侦探推理一样优雅地解构数据?C#的模式匹配正是这样一把瑞士军刀,从C# 7.0到C# 12,它已悄然进化成改变编程范式的利器。 一、模式匹配的三重境界…...

【Linux】进程优先级 | 进程调度(三)
目录 前言: 一、进程优先级: 1.通过nice值修改优先级: 二、进程切换: 三、上下文数据 四、Linux真实调度算法: 五、bitmap位图: 六、命令总结: 总结: 前言: 我…...
wordpress按不同页调用不同的标题3种形式
在WordPress中,可以通过多种方式根据不同的页面调用不同的标题。这通常用于实现SEO优化、自定义页面标题或根据页面类型显示不同的标题内容。 使用wp_title函数 wp_title函数用于在HTML的title标签中输出页面标题。你可以通过修改主题的header.php文件来实现自定义…...

音频进阶学习十六——LTI系统的差分方程与频域分析一(频率响应)
文章目录 前言一、差分方程的有理式1.差分方程的有理分式2.因果系统和ROC3.稳定性与ROC 二、频率响应1.定义2.幅频响应3.相频响应4.群延迟 总结 前言 本篇文章会先复习Z变换的有理分式,这是之前文章中提过的内容,这里会将差分方程和有理分式进行结合来看…...
css实现左右切换平滑效果
2025.02.25今天我学习了如何用css实现平滑效果 一、html相关代码 (1)设置往左、往右的动画属性,样式可以放在同一级。 (2)必须设置唯一key进行刷新数据,使用v-show来展示每次渲染的组件数量。 <tran…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...