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

1 HDFS

1 HDFS

  • 1. HDFS概述
  • 2. HDFS架构
  • 3. HDFS的特性
  • 4. HDFS 的命令行使用
  • 5. hdfs的高级使用命令
  • 6. HDFS 的 block 块和副本机制
    • 6.1 抽象为block块的好处
    • 6.2 块缓存
    • 6.3 hdfs的文件权限验证
    • 6.4 hdfs的副本因子
  • 7. HDFS 文件写入过程(非常重要)
    • 7.1 网络拓扑概念
    • 7.2 机架感知(副本节点选择)
  • 8.HDFS 文件读取过程(非常重要)
  • 9. NameNode 工作机制以及元数据管理(重要)
    • 9.1 namenode 与 datanode 启动
    • 9.2 FSImage与edits详解
    • 9.3 FSimage文件当中的文件信息查看
    • 9.4 edits当中的文件信息查看
    • 9.5 secondarynameNode如何辅助管理FSImage与Edits文件
    • 9.6 namenode元数据信息多目录配置
    • 9.7 namenode故障恢复
  • 10. datanode工作机制以及数据存储
    • 10.1 服役新数据节点
    • 10.2 退役旧数据
  • 11. block块手动拼接成为完整数据
  • 12. HDFS其他重要功能
    • 1. 多个集群之间的数据拷贝
    • 2. hadoop归档文件archive
    • 3. hdfs快照snapShot管理
    • 4. hdfs回收站

1. HDFS概述

Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪一种,需要看我们具体的实现类,在我们实际工作中,用到的最多的就是HDFS(分布式文件系统)以及LocalFileSystem(本地文件系统)了。
在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称为分布式文件系统。
HDFS(Hadoop Distributed File System)是 Hadoop 项目的一个子项目。是 Hadoop 的核心组件之一, Hadoop 非常适于存储大型数据 (比如 TB 和 PB),其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件,并且提供统一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。
在这里插入图片描述
HDFS文件系统

2. HDFS架构

HDFS架构
HDFS是一个主/从(Mater/Slave)体系结构,由三部分组成: NameNode 和 DataNode 以及 SecondaryNamenode:
NameNode 负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。
DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个 DataNode 上存储多个副本,默认为3个。
Secondary NameNode 用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。最主要作用是辅助 NameNode 管理元数据信息。
在这里插入图片描述

3. HDFS的特性

首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

  1. master/slave 架构(主从架构)
    HDFS 采用 master/slave 架构。一般一个 HDFS 集群是有一个 Namenode 和一定数目的 Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
  2. 分块存储
    HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,默认大小在 hadoop2.x 版本中是 128M。
  3. 名字空间(NameSpace)
    HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
    Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
    HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
  4. NameNode 元数据管理
    我们把目录结构及文件分块位置信息叫做元数据。NameNode 负责维护整个 HDFS 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的 id,及所在的 DataNode 服务器)。
  5. DataNode 数据存储
    文件的各个 block 的具体存储管理由 DataNode 节点承担。每一个 block 都可以在多个 DataNode 上。DataNode 需要定时向 NameNode 汇报自己持有的 block 信息。 存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)
  6. 副本机制
    为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
  7. 一次写入,多次读出
    HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。 正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为修改不方便,延迟大,网络开销大,成本太高。

4. HDFS 的命令行使用

如果没有配置 hadoop 的环境变量,则在 hadoop 的安装目录下的bin目录中执行以下命令,如已配置 hadoop 环境变量,则可在任意目录下执行
help

格式:  hdfs dfs -help 操作命令
作用: 查看某一个操作命令的参数信息

ls

格式:hdfs dfs -ls  URI
作用:类似于Linux的ls命令,显示文件列表

lsr

格式  :   hdfs  dfs -lsr URI
作用  : 在整个目录下递归执行ls, 与UNIX中的ls-R类似

mkdir

格式 : hdfs  dfs  -mkdir [-p] <paths>
作用 :   以<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录

put

格式   : hdfs dfs -put <localsrc >  ... <dst>
作用 :  将单个的源文件src或者多个源文件srcs从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中
hdfs dfs -put  /rooot/bigdata.txt  /dir1

moveFromLocal

格式: hdfs  dfs -moveFromLocal  <localsrc>   <dst>
作用:  和put命令类似,但是源文件localsrc拷贝之后自身被删除
hdfs  dfs -moveFromLocal  /root/bigdata.txt  /

copyFromLocal

格式:  hdfs dfs -copyFromLocal <localsrc> ... <dst>
作用: 从本地文件系统中拷贝文件到hdfs路径去

appendToFile

格式: hdfs dfs -appendToFile <localsrc> ... <dst>
作用: 追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入.hdfs dfs -appendToFile  a.xml b.xml  /big.xml

moveToLocal

在 hadoop 2.6.4 版本测试还未未实现此方法
格式:hadoop  dfs  -moveToLocal [-crc] <src> <dst>
作用:将本地文件剪切到 HDFS

get

格式   hdfs dfs  -get [-ignorecrc ]  [-crc]  <src> <localdst>作用:将文件拷贝到本地文件系统。 CRC 校验失败的文件通过-ignorecrc选项拷贝。 文件和CRC校验可以通过-CRC选项拷贝
hdfs dfs  -get   /bigdata.txt  /export/servers

getmerge

格式: hdfs dfs -getmerge <src> <localdst>
作用: 合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...

copyToLocal

格式:  hdfs dfs -copyToLocal <src> ... <localdst>
作用:  从hdfs拷贝到本地

mv

格式  : hdfs  dfs -mv URI   <dest>
作用: 将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统
hdfs  dfs  -mv  /dir1/bigdata.txt   /dir2

rm

格式: hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 。。。】
作用: 删除参数指定的文件,参数可以有多个。  此命令只删除文件和非空目录。
如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;
否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中。
hdfs  dfs  -rm  -r  /dir1

cp

格式: hdfs  dfs  -cp URI [URI ...] <dest>
作用: 将文件拷贝到目标路径中。如果<dest>  为目录的话,可以将多个文件拷贝到该目录下。

-f

选项将覆盖目标,如果它已经存在。

-p

选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)。
hdfs dfs -cp /dir1/a.txt  /dir2/bigdata.txt

cat

hdfs dfs  -cat  URI [uri  ...]
作用:将参数所指示的文件内容输出到stdout
hdfs dfs  -cat /bigdata.txt

tail

格式: hdfs dfs -tail path
作用: 显示一个文件的末尾

text

格式:hdfs dfs -text path
作用: 以字符形式打印一个文件的内容

chmod

格式:hdfs  dfs  -chmod  [-R]  URI[URI  ...]
作用:改变文件权限。如果使用  -R 选项,则对整个目录有效递归执行。使用这一命令的用户必须是文件的所属用户,或者超级用户。
hdfs dfs -chmod -R 777 /bigdata.txt

chown

格式:  hdfs  dfs  -chmod  [-R]  URI[URI ...]
作用:  改变文件的所属用户和用户组。如果使用  -R 选项,则对整个目录有效递归执行。使用这一命令的用户必须是文件的所属用户,或者超级用户。
hdfs  dfs  -chown  -R hadoop:hadoop  /bigdata.txt

df

格式: hdfs dfs  -df  -h  path
作用: 统计文件系统的可用空间信息

du

格式: hdfs dfs -du -s -h path
作用: 统计文件夹的大小信息

count

格式: hdfs dfs -count path
作用: 统计一个指定目录下的文件节点数量

setrep

格式:  hdfs dfs -setrep num filePath
作用: 设置hdfs中文件的副本数量
注意: 即使设置的超过了datanode的数量,副本的数量也最多只能和datanode的数量是一致的

expunge (慎用)

格式:  hdfs dfs  -expunge
作用: 清空hdfs垃圾桶 

5. hdfs的高级使用命令

5.1 HDFS文件限额配置
在多人共用HDFS的环境下,配置设置非常重要。特别是在 Hadoop 处理大量资料的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取。HDFS 的配额设定是针对目录而不是针对账号,可以让每个账号仅操作某一个目录,然后对目录设置配置。
HDFS 文件的限额配置允许我们以文件个数,或者文件大小来限制我们在某个目录下上传的文件数量或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量。

 hdfs dfs -count -q -h /user/root/dir1  #查看配额信息

结果:
在这里插入图片描述

5.1.1 数量限额

hdfs dfs  -mkdir -p /user/root/dir    #创建hdfs文件夹
hdfs dfsadmin -setQuota 2  dir      # 给该文件夹下面设置最多上传两个文件,发现只能上传一个文件hdfs dfsadmin -clrQuota /user/root/dir  # 清除文件数量限制

5.1.2 空间大小限额
在设置空间配额时,设置的空间至少是 block_size * 3 大小

hdfs dfsadmin -setSpaceQuota 4k /user/root/dir   # 限制空间大小4KB
hdfs dfs -put  /root/a.txt  /user/root/dir 

生成任意大小文件的命令:

dd if=/dev/zero of=1.txt  bs=1M count=2     #生成2M的文件

清除空间配额限制

hdfs dfsadmin -clrSpaceQuota /user/root/dir

5.2 HDFS 的安全模式
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。
假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存在,假设只存在2个副本,那么比例就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。
在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在,当整个系统达到安全标准时,HDFS自动离开安全模式。30s
安全模式操作命令

    hdfs  dfsadmin  -safemode  get #查看安全模式状态hdfs  dfsadmin  -safemode  enter #进入安全模式hdfs  dfsadmin  -safemode  leave #离开安全模式

6. HDFS 的 block 块和副本机制

HDFS 将所有的文件全部抽象成为 block 块来进行存储,不管文件大小,全部一视同仁都是以 block 块的统一大小和形式进行存储,方便我们的分布式文件系统对文件的管理。
所有的文件都是以 block 块的方式存放在 hdfs 文件系统当中,在 Hadoop 1 版本当中,文件的 block 块默认大小是 64M,Hadoop 2 版本当中,文件的 block 块大小默认是128M,block块的大小可以通过 hdfs-site.xml 当中的配置文件进行指定。

<property><name>dfs.block.size</name><value>块大小 以字节为单位</value> //只写数值就可以
</property>

6.1 抽象为block块的好处

1.一个文件有可能大于集群中任意一个磁盘 10T*3/128 = xxx块 2T,2T,2T 文件方式存—–>多个block块,这些block块属于一个文件
2.使用块抽象而不是文件可以简化存储子系统
3.块非常适合用于数据备份进而提供数据容错能力和可用性

6.2 块缓存

通常 DataNode 从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在 DataNode 的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。
例如: 连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。 用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组。
例如:
一个文件 130M,会被切分成2个block块,保存在两个block块里面,实际占用磁盘130M空间,而不是占用256M的磁盘空间

6.3 hdfs的文件权限验证

hdfs的文件权限机制与linux系统的文件权限机制类似
r:read w:write x:execute
权限x对于文件表示忽略,对于文件夹表示是否有权限访问其内容
如果linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsan
HDFS文件权限的目的,防止好人做错事,而不是阻止坏人做坏事。HDFS相信你告诉我你是谁,你就是谁

6.4 hdfs的副本因子

为了保证block块的安全性,也就是数据的安全性,在hadoop2当中,文件默认保存三个副本,我们可以更改副本数以提高数据的安全性
在hdfs-site.xml当中修改以下配置属性,即可更改文件的副本数

<property><name>dfs.replication</name><value>3</value>
</property>

7. HDFS 文件写入过程(非常重要)

在这里插入图片描述
HDFS 文件写入过程
1.Client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
2.Client 请求第一个 block 该传输到哪些 DataNode 服务器上;
3.NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配, 返回可用的 DataNode 的地址如:A, B, C;
Hadoop 在设计时考虑到数据的安全与高效, 数据文件默认在 HDFS 上存放三份, 存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。
4.Client 请求 3 台 DataNode 中的一台 A 上传数据(本质上是一个 RPC 调用,建立 pipeline ),A 收到请求会继续调用 B,然后 B 调用 C,将整个 pipeline 建立完成, 后逐级返回 client;
5.Client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位(默认64K),A 收到一个 packet 就会传给 B,B 传给 C。A 每传一个 packet 会放入一个应答队列等待应答;
6.数据被分割成一个个 packet 数据包在 pipeline 上依次传输,在 pipeline 反方向上, 逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client;
7.当一个 block 传输完成之后,Client 再次请求 NameNode 上传第二个 block,重复步骤 2;

7.1 网络拓扑概念

在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,其主要限制因素是节点之间数据的传输速率——带宽很稀缺。这里的想法是将两个节点间的带宽作为距离的衡量标准。
节点距离:两个节点到达最近的共同祖先的距离总和。
例如,假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述。
Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)
Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)
Distance(/d1/r1/n1, /d1/r3/n2)=4(同一数据中心不同机架上的节点)
Distance(/d1/r1/n1, /d2/r4/n2)=6(不同数据中心的节点)
在这里插入图片描述
机架

7.2 机架感知(副本节点选择)

1.低版本Hadoop副本节点选择
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于不相同机架的随机节点上。
第三个副本和第二个副本位于相同机架,节点随机。
在这里插入图片描述
机架感知

2.Hadoop2.7.2 副本节点选择
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于相同机架,随机节点。
第三个副本位于不同机架,随机节点。
在这里插入图片描述
机架感知

8.HDFS 文件读取过程(非常重要)

在这里插入图片描述
HDFS 文件读取过程
1.Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
2.NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
3.Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
4.底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
5.当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
6.读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
7.read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
8.最终读取来所有的 block 会合并成一个完整的最终文件。

从 HDFS 文件读写过程中,可以看出,HDFS 文件写入时是串行写入的,数据包先发送给节点A,然后节点A发送给B,B在给C;而HDFS文件读取是并行的, 客户端 Client 直接并行读取block所在的节点。

9. NameNode 工作机制以及元数据管理(重要)

在这里插入图片描述
NameNode 工作机制

9.1 namenode 与 datanode 启动

-namenode工作机制
1.第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2.客户端对元数据进行增删改的请求。
3.namenode记录操作日志,更新滚动日志。
4.namenode在内存中对数据进行增删改查。

-secondary namenode
1.secondary namenode询问 namenode 是否需要 checkpoint。直接带回 namenode 是否检查结果。
2.secondary namenode 请求执行 checkpoint。
3.namenode 滚动正在写的edits日志。
4.将滚动前的编辑日志和镜像文件拷贝到 secondary namenode。
5.secondary namenode 加载编辑日志和镜像文件到内存,并合并。
6.生成新的镜像文件 fsimage.chkpoint。
7.拷贝 fsimage.chkpoint 到 namenode。
8.namenode将 fsimage.chkpoint 重新命名成fsimage。

9.2 FSImage与edits详解

所有的元数据信息都保存在了FsImage与Eidts文件当中,这两个文件就记录了所有的数据的元数据信息,元数据信息的保存目录配置在了 hdfs-site.xml 当中

  <!--fsimage文件存储的路径--><property><name>dfs.namenode.name.dir</name><value>file:///opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas</value></property><!-- edits文件存储的路径 --><property><name>dfs.namenode.edits.dir</name><value>file:///opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits</value></property>

客户端对hdfs进行写文件时会首先被记录在edits文件中。
edits修改时元数据也会更新。
每次hdfs更新时edits先更新后客户端才会看到最新信息。
fsimage:是namenode中关于元数据的镜像,一般称为检查点。
一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?
因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。
fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。随着edits内容增大,就需要在一定时间点和fsimage合并。

9.3 FSimage文件当中的文件信息查看

使用命令 hdfs oiv

cd  /opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas/current
hdfs oiv -i fsimage_0000000000000000112 -p XML -o hello.xml

9.4 edits当中的文件信息查看

查看命令 hdfs oev

cd  /opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits
hdfs oev -i  edits_0000000000000000112-0000000000000000113 -o myedit.xml -p XML

9.5 secondarynameNode如何辅助管理FSImage与Edits文件

1.secnonaryNN通知NameNode切换editlog。
2.secondaryNN从NameNode中获得FSImage和editlog(通过http方式)。
3.secondaryNN将FSImage载入内存,然后开始合并editlog,合并之后成为新的fsimage。
4.secondaryNN将新的fsimage发回给NameNode。
5.NameNode用新的fsimage替换旧的fsimage。
在这里插入图片描述
完成合并的是 secondarynamenode,会请求namenode停止使用edits,暂时将新写操作放入一个新的文件中(edits.new)。
secondarynamenode从namenode中通过http get获得edits,因为要和fsimage合并,所以也是通过http get 的方式把fsimage加载到内存,然后逐一执行具体对文件系统的操作,与fsimage合并,生成新的fsimage,然后把fsimage发送给namenode,通过http post的方式。
namenode从secondarynamenode获得了fsimage后会把原有的fsimage替换为新的fsimage,把edits.new变成edits。同时会更新fsimage。
hadoop进入安全模式时需要管理员使用dfsadmin的save namespace来创建新的检查点。
secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的机器上。
fsimage与edits的合并时机取决于两个参数,第一个参数是默认1小时fsimage与edits合并一次。

第一个参数:时间达到一个小时fsimage与edits就会进行合并

dfs.namenode.checkpoint.period     3600

第二个参数:hdfs操作达到1000000次也会进行合并

dfs.namenode.checkpoint.txns       1000000

第三个参数:每隔多长时间检查一次hdfs的操作次数

dfs.namenode.checkpoint.check.period   60

9.6 namenode元数据信息多目录配置

为了保证元数据的安全性,我们一般都是先确定好我们的磁盘挂载目录,将元数据的磁盘做RAID1
namenode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。
具体配置方案:
hdfs-site.xml

 <property><name>dfs.namenode.name.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas</value></property>

9.7 namenode故障恢复

在我们的secondaryNamenode对namenode当中的fsimage和edits进行合并的时候,每次都会先将namenode的fsimage与edits文件拷贝一份过来,所以fsimage与edits文件在secondarNamendoe当中也会保存有一份,如果namenode的fsimage与edits文件损坏,那么我们可以将secondaryNamenode当中的fsimage与edits拷贝过去给namenode继续使用,只不过有可能会丢失一部分数据。这里涉及到几个配置选项
namenode保存fsimage的配置路径

<!--  namenode元数据存储路径,实际工作当中一般使用SSD固态硬盘,并使用多个固态硬盘隔开,冗余元数据 --><property><name>dfs.namenode.name.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas</value></property>

namenode保存edits文件的配置路径

<property><name>dfs.namenode.edits.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits</value>
</property>

secondaryNamenode保存fsimage文件的配置路径

<property><name>dfs.namenode.checkpoint.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/snn/name</value>
</property>

secondaryNamenode保存edits文件的配置路径

<property><name>dfs.namenode.checkpoint.edits.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/snn/edits</value>
</property>

接下来我们来模拟namenode的故障恢复功能
1.杀死namenode进程: 使用jps查看namenode的进程号 , kill -9 直接杀死。
2.删除namenode的fsimage文件和edits文件。
根据上述配置, 找到namenode放置fsimage和edits路径. 直接全部rm -rf 删除。
3.拷贝secondaryNamenode的fsimage与edits文件到namenode的fsimage与edits文件夹下面去。
根据上述配置, 找到secondaryNamenode的fsimage和edits路径, 将内容 使用cp -r 全部复制到namenode对应的目录下即可。
4.重新启动namenode, 观察数据是否存在。

10. datanode工作机制以及数据存储

datanode工作机制
1.一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2.DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。(dfs.blockreport.intervalMsec)。
3.心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
4.集群运行中可以安全加入和退出一些机器。

数据完整性
1.当DataNode读取block的时候,它会计算checksum。
2.如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
3.client读取其他DataNode上的block。
4.datanode在其文件创建后周期验证checksum。

掉线时限参数设置
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。
而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。

<property><name>dfs.namenode.heartbeat.recheck-interval</name><value>300000</value>
</property>
<property><name>dfs.heartbeat.interval </name><value>3</value>
</property>

DataNode的目录结构
和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需要额外格式化。
在/opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current这个目录下查看版本号

    cat VERSION #Thu Mar 14 07:58:46 CST 2019storageID=DS-47bcc6d5-c9b7-4c88-9cc8-6154b8a2bf39clusterID=CID-dac2e9fa-65d2-4963-a7b5-bb4d0280d3f4cTime=0datanodeUuid=c44514a0-9ed6-4642-b3a8-5af79f03d7a4storageType=DATA_NODElayoutVersion=-56

具体解释:
storageID:存储id号。
clusterID集群id,全局唯一。
cTime属性标记了datanode存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为0;但是在文件系统升级之后,该值会更新到新的时间戳。
datanodeUuid:datanode的唯一识别码。
storageType:存储类型。
layoutVersion是一个负整数。通常只有HDFS增加新特性时才会更新这个版本号。

datanode多目录配置
datanode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。具体配置如下: - 只需要在value中使用逗号分隔出多个存储目录即可

  cd /opt/hadoop-2.6.0-cdh5.14.0/etc/hadoop<!--  定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割  --><property><name>dfs.datanode.data.dir</name><value>file:///opt/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas</value></property>

10.1 服役新数据节点

需求说明:
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
10.1.1 环境准备
1.复制一台新的虚拟机出来
将我们纯净的虚拟机复制一台出来,作为我们新的节点
2.修改mac地址以及IP地址

修改mac地址命令vim /etc/udev/rules.d/70-persistent-net.rules
修改ip地址命令vim /etc/sysconfig/network-scripts/ifcfg-eth0

3.关闭防火墙,关闭selinux

关闭防火墙service iptables stop
关闭selinuxvim /etc/selinux/config

4.更改主机名

更改主机名命令,将node04主机名更改为node04.hadoop.com
vim /etc/sysconfig/network

5.四台机器更改主机名与IP地址映射

四台机器都要添加hosts文件
vim /etc/hosts192.168.52.100 node01.hadoop.com  node01
192.168.52.110 node02.hadoop.com  node02
192.168.52.120 node03.hadoop.com  node03
192.168.52.130 node04.hadoop.com  node04

6.node04服务器关机重启

node04执行以下命令关机重启reboot -h now

7.node04安装jdk

node04统一两个路径mkdir -p /export/softwares/mkdir -p /export/servers/

然后解压jdk安装包,配置环境变量
8.解压hadoop安装包

在node04服务器上面解压hadoop安装包到/export/servers , node01执行以下命令将hadoop安装包拷贝到node04服务器cd /export/softwares/scp hadoop-2.6.0-cdh5.14.0-自己编译后的版本.tar.gz node04:$PWDnode04解压安装包tar -zxf hadoop-2.6.0-cdh5.14.0-自己编译后的版本.tar.gz -C /export/servers/

9.将node01关于hadoop的配置文件全部拷贝到node04

node01执行以下命令,将hadoop的配置文件全部拷贝到node04服务器上面cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/scp ./* node04:$PWD

10.1.2 服役新节点具体步骤
1.创建dfs.hosts文件

在node01也就是namenode所在的机器的/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop目录下创建dfs.hosts文件[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
[root@node01 hadoop]# touch dfs.hosts
[root@node01 hadoop]# vim dfs.hosts添加如下主机名称(包含新服役的节点)
node01
node02
node03
node04

2.node01编辑hdfs-site.xml添加以下配置
在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性

node01执行以下命令 :cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim hdfs-site.xml# 添加一下内容<property><name>dfs.hosts</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value></property><!--动态上下线配置: 如果配置文件中有, 就不需要配置--><property><name>dfs.hosts</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/accept_host</value></property><property><name>dfs.hosts.exclude</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/deny_host</value></property>

3.刷新namenode
node01执行以下命令刷新namenode

[root@node01 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful

4.更新resourceManager节点
node01执行以下命令刷新resourceManager

[root@node01 hadoop]# yarn rmadmin -refreshNodes
19/03/16 11:19:47 INFO client.RMProxy: Connecting to ResourceManager at node01/192.168.52.100:8033

5.namenode的slaves文件增加新服务节点主机名称
node01编辑slaves文件,并添加新增节点的主机,更改完后,slaves文件不需要分发到其他机器上面去

node01执行以下命令编辑slaves文件 :cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoopvim slaves添加一下内容:  
node01
node02
node03
node04

6.单独启动新增节点

node04服务器执行以下命令,启动datanode和nodemanager : cd /export/servers/hadoop-2.6.0-cdh5.14.0/sbin/hadoop-daemon.sh start datanodesbin/yarn-daemon.sh start nodemanager

7.使用负载均衡命令,让数据均匀负载所有机器

node01执行以下命令 : cd /export/servers/hadoop-2.6.0-cdh5.14.0/sbin/start-balancer.sh

10.2 退役旧数据

1.创建dfs.hosts.exclude配置文件
在namenod所在服务器的/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop目录下创建dfs.hosts.exclude文件,并添加需要退役的主机名称

node01执行以下命令 : cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadooptouch dfs.hosts.excludevim dfs.hosts.exclude
添加以下内容:node04.hadoop.com特别注意:该文件当中一定要写真正的主机名或者ip地址都行,不能写node04

2.编辑namenode所在机器的hdfs-site.xml
编辑namenode所在的机器的hdfs-site.xml配置文件,添加以下配置

cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim hdfs-site.xml#添加一下内容:<property><name>dfs.hosts.exclude</name><value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts.exclude</value></property>

3.刷新namenode,刷新resourceManager

在namenode所在的机器执行以下命令,刷新namenode,刷新resourceManager : hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes

4.节点退役完成,停止该节点进程
等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役。

node04执行以下命令,停止该节点进程 : cd /export/servers/hadoop-2.6.0-cdh5.14.0sbin/hadoop-daemon.sh stop datanodesbin/yarn-daemon.sh stop nodemanager

5.从include文件中删除退役节点

namenode所在节点也就是node01执行以下命令删除退役节点 :cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoopvim dfs.hosts删除后的内容: 删除了node04
node01
node02
node03

6.node01执行一下命令刷新namenode,刷新resourceManager

hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes

7.从namenode的slave文件中删除退役节点

namenode所在机器也就是node01执行以下命令从slaves文件中删除退役节点 : cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoopvim slaves
删除后的内容: 删除了 node04 
node01
node02
node03

8.如果数据负载不均衡,执行以下命令进行均衡负载

node01执行以下命令进行均衡负载cd /export/servers/hadoop-2.6.0-cdh5.14.0/sbin/start-balancer.sh

11. block块手动拼接成为完整数据

所有的数据都是以一个个的block块存储的,只要我们能够将文件的所有block块全部找出来,拼接到一起,又会成为一个完整的文件,接下来我们就来通过命令将文件进行拼接:

1.上传一个大于128M的文件到hdfs上面去
我们选择一个大于128M的文件上传到hdfs上面去,只有一个大于128M的文件才会有多个block块。
这里我们选择将我们的jdk安装包上传到hdfs上面去。
node01执行以下命令上传jdk安装包

cd /export/softwares/
hdfs dfs -put jdk-8u141-linux-x64.tar.gz  /

2.web浏览器界面查看jdk的两个block块id
这里我们看到两个block块id分别为
1073742699和1073742700
那么我们就可以通过blockid将我们两个block块进行手动拼接了。

3.根据我们的配置文件找到block块所在的路径

根据我们hdfs-site.xml的配置,找到datanode所在的路径
<!--  定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割  --><property><name>dfs.datanode.data.dir</name><value>file:///export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas</value></property>进入到以下路径 : 此基础路径为 上述配置中value的路径
cd /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current/BP-557466926-192.168.52.100-1549868683602/current/finalized/subdir0/subdir3

4.执行block块的拼接

将不同的各个block块按照顺序进行拼接起来,成为一个完整的文件
cat blk_1073742699 >> jdk8u141.tar.gz
cat blk_1073742700 >> jdk8u141.tar.gz
移动我们的jdk到/export路径,然后进行解压
mv  jdk8u141.tar.gz /export/
cd /export/
tar -zxf jdk8u141.tar.gz
正常解压,没有问题,说明我们的程序按照block块存储没有问题

12. HDFS其他重要功能

1. 多个集群之间的数据拷贝

在我们实际工作当中,极有可能会遇到将测试集群的数据拷贝到生产环境集群,或者将生产环境集群的数据拷贝到测试集群,那么就需要我们在多个集群之间进行数据的远程拷贝,hadoop自带也有命令可以帮我们实现这个功能
1.本地文件拷贝scp

cd /export/softwares/scp -r jdk-8u141-linux-x64.tar.gz root@node02:/export/

2.集群之间的数据拷贝distcp

cd /export/servers/hadoop-2.6.0-cdh5.14.0/bin/hadoop distcp hdfs://node01:8020/jdk-8u141-linux-x64.tar.gz  hdfs://cluster2:8020/

2. hadoop归档文件archive

每个文件均按块存储,每个块的元数据存储在namenode的内存中,因此hadoop存储小文件会非常低效。因为大量的小文件会耗尽namenode中的大部分内存。但注意,存储小文件所需要的磁盘容量和存储这些文件原始内容所需要的磁盘空间相比也不会增多。例如,一个1MB的文件以大小为128MB的块存储,使用的是1MB的磁盘空间,而不是128MB。
Hadoop存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少namenode内存使用的同时,允许对文件进行透明的访问。具体说来,Hadoop存档文件可以用作MapReduce的输入。
创建归档文件
第一步:创建归档文件
注意:归档文件一定要保证yarn集群启动

cd /export/servers/hadoop-2.6.0-cdh5.14.0bin/hadoop archive -archiveName myhar.har -p /user/root /user

第二步:查看归档文件内容

hdfs dfs -lsr /user/myhar.harhdfs dfs -lsr har:///user/myhar.har

第三步:解压归档文件

hdfs dfs -mkdir -p /user/har
hdfs dfs -cp har:///user/myhar.har/* /user/har/

3. hdfs快照snapShot管理

快照顾名思义,就是相当于对我们的hdfs文件系统做一个备份,我们可以通过快照对我们指定的文件夹设置备份,但是添加快照之后,并不会立即复制所有文件,而是指向同一个文件。当写入发生时,才会产生新文件
1.快照使用基本语法
1、 开启指定目录的快照功能

 hdfs dfsadmin  -allowSnapshot  路径 

2、禁用指定目录的快照功能(默认就是禁用状态)

 hdfs dfsadmin  -disallowSnapshot  路径

3、给某个路径创建快照snapshot

 hdfs dfs -createSnapshot  路径

4、指定快照名称进行创建快照snapshot

 hdfs dfs  -createSanpshot 路径 名称    

5、给快照重新命名

 hdfs dfs  -renameSnapshot  路径 旧名称  新名称

6、列出当前用户所有可快照目录

 hdfs lsSnapshottableDir  

7、比较两个快照的目录不同之处

 hdfs snapshotDiff  路径1  路径2

8、删除快照snapshot

 hdfs dfs -deleteSnapshot <path> <snapshotName> 

2.快照操作实际案例
1、开启与禁用指定目录的快照

[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfsadmin -allowSnapshot /userAllowing snaphot on /user succeeded[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfsadmin -disallowSnapshot /userDisallowing snaphot on /user succeeded

2、对指定目录创建快照

注意:创建快照之前,先要允许该目录创建快照

[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfsadmin -allowSnapshot /userAllowing snaphot on /user succeeded[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfs -createSnapshot /user    Created snapshot /user/.snapshot/s20190317-210906.549通过web浏览器访问快照http://node01:50070/explorer.html#/user/.snapshot/s20190317-210906.549

3、指定名称创建快照

[root@node01 hadoop-2.6.0-cdh5.14.0]# hdfs dfs -createSnapshot /user mysnap1Created snapshot /user/.snapshot/mysnap1

4、重命名快照

hdfs dfs -renameSnapshot /user mysnap1 mysnap2

5、列出当前用户所有可以快照的目录

hdfs lsSnapshottableDir

6、比较两个快照不同之处

hdfs dfs -createSnapshot /user snap1hdfs dfs -createSnapshot /user snap2hdfs snapshotDiff  snap1 snap2

7、删除快照

 hdfs dfs -deleteSnapshot /user snap1

4. hdfs回收站

任何一个文件系统,基本上都会有垃圾桶机制,也就是删除的文件,不会直接彻底清掉,我们一把都是将文件放置到垃圾桶当中去,过一段时间之后,自动清空垃圾桶当中的文件,这样对于文件的安全删除比较有保证,避免我们一些误操作,导致误删除文件或者数据
1.回收站配置两个参数
默认值fs.trash.interval=0,0表示禁用回收站,可以设置删除文件的存活时间。
默认值fs.trash.checkpoint.interval=0,检查回收站的间隔时间。
要求fs.trash.checkpoint.interval<=fs.trash.interval。
2.启用回收站
修改所有服务器的core-site.xml配置文件

<!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 --><property><name>fs.trash.interval</name><value>10080</value></property>

3.查看回收站
回收站在集群的 /user/root/.Trash/ 这个路径下
4.通过javaAPI删除的数据,不会进入回收站,需要调用moveToTrash()才会进入回收站

//使用回收站的方式: 删除数据@Testpublic void  deleteFile() throws Exception{//1. 获取FileSystem对象Configuration configuration = new Configuration();FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), configuration, "root");//2. 执行删除操作// fileSystem.delete();  这种操作会直接将数据删除, 不会进入垃圾桶Trash trash = new Trash(fileSystem,configuration);boolean flag = trash.isEnabled(); // 是否已经开启了垃圾桶机制System.out.println(flag);trash.moveToTrash(new Path("/quota"));//3. 释放资源fileSystem.close();}

5.恢复回收站数据

hdfs dfs -mv trashFileDir hdfsdir
trashFileDir :回收站的文件路径
hdfsdir :将文件移动到hdfs的哪个路径下

6.清空回收站

hdfs dfs -expunge

相关文章:

1 HDFS

1 HDFS 1. HDFS概述2. HDFS架构3. HDFS的特性4. HDFS 的命令行使用5. hdfs的高级使用命令6. HDFS 的 block 块和副本机制6.1 抽象为block块的好处6.2 块缓存6.3 hdfs的文件权限验证6.4 hdfs的副本因子 7. HDFS 文件写入过程&#xff08;非常重要&#xff09;7.1 网络拓扑概念7.…...

14-6-3C++STL的list

&#xff08;一&#xff09;list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…...

GESP2023年12月认证C++六级( 第三部分编程题(2)工作沟通)

参考程序1代码&#xff1a; #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <map> #include <iostream> #include <cmath> #include <vector> using name…...

深度学习的应用

目录 一、机器视觉 1.1 应用场景 1.2 常见的计算机视觉任务 1.2.1 图像分类 1.2.2 目标检测 1.2.3 图像分割 二、自然语言处理 三、推荐系统 3.1 常用的推荐系统算法实现方案 四、图像分类实验补充 4.1 CIFAR-100 数据集实验 实验代码 4.2 CIFAR-10 实验代码 深…...

【自学笔记】MySQL的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MySQL重点知识点MySQL知识点总结一、数据库基础二、MySQL的基本使用三、数据类型四、触发器&#xff08;Trigger&#xff09;五、存储引擎六、索引七、事务处理八、…...

计算机网络之物理层通信基础(信道、信号、带宽、码元、波特、速率、信源与信宿等基本概念)

一、信道 信道是信号的传输媒介&#xff0c;一般用来表示向某一个方向传送信息的介质。信道可以按照不同标准进行分类&#xff1a; 按传输信号分类&#xff1a;可分为模拟信道和数字信道。 按传输介质分类&#xff1a;可分为无线信道和有线信道。无线信道以电磁波为传输介质&…...

C++初阶 -- 初识STL和string类详细使用接口的教程(万字大章)

目录 一、STL 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 二、string类 2.1 string类的基本介绍 2.2 string类的默认成员函数 2.2.1 构造函数 2.2.2 析构函数 2.2.3 赋值运算符重载 2.3 string类对象的容量操作 2.3.1 size和length 2.3.2 capacity 2.3.3 r…...

Cursor 背后的技术栈:从 VS Code 到 AI 集成

引言 在当今快速发展的软件开发领域&#xff0c;开发者工具正在经历一场由人工智能&#xff08;AI&#xff09;驱动的革命。Cursor 作为一款新兴的智能编程助手&#xff0c;凭借其强大的 AI 能力和高效的开发体验&#xff0c;迅速吸引了大量开发者的关注。Cursor 不仅继承了 V…...

ESP32和STM32在处理中断方面的区别

为了通俗地讲解ESP32和STM32在处理中断方面的区别&#xff0c;我们可以把它们想象成两个不同的“智能管家”系统&#xff0c;各自负责管理一个家庭&#xff08;即嵌入式项目&#xff09;的各种任务。我们将重点放在如何处理突发事件&#xff08;即中断&#xff09;上。 ESP32 …...

99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)

目录 0. 承前1. 简述&#xff1a;价格指数对比2. 比喻&#xff1a;两大指数对比2.1 简单对比2.2 生动比喻 3. 实际应用3.1 价格传导现象 4. 总结5. 有趣的对比6. 数据获取实现代码7. 数据可视化实现代码 0. 承前 本文主旨&#xff1a; 本文使用小卖部比喻PPI和CPI&#xff0c;…...

计算机网络概述

1. 计算机网络的定义 计算机网络是指由多个通过物理介质或无线方式互相连接的计算设备组成的系统。其主要目的是实现数据的传输和资源共享。网络中的计算设备可以包括台式机、笔记本电脑、服务器、手机、打印机、智能设备等。 网络的广义定义 首先要理解“网络”的广义含义。网…...

169 多数元素

给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 class Solution { public int majorityElement(int[] nums) { // 存储每个数字的…...

线程配置经验

工作时&#xff0c;时常会遇到&#xff0c;线程相关的问题与解法&#xff0c;本人会持续对开发过程中遇到的关于线程相关的问题及解决记录更新记录在此篇博客中。 目录 一、线程基本知识 1. 线程和进程 二、问题与解法 1. 避免乘法级别数量线程并行 1&#xff09;使用线程池…...

算法随笔_34: 最后一个单词的长度

上一篇:算法随笔_33: 132模式-CSDN博客 题目描述如下: 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&am…...

java 正则表达式匹配Matcher 类

Matcher 类 用法 在 Java 中&#xff0c;Matcher 类是用于匹配正则表达式的工具&#xff0c;而 group() 方法是 Matcher 类中的一个重要方法&#xff0c;用于提取匹配结果中的捕获组&#xff08;captured groups&#xff09;。以下是对 group() 方法的详细解释&#xff1a; 1.…...

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University&#xff0c;然后实际内容不完全基于它&#xff0c;因为它的例子还是基于.NET Core 3.1做的&#xff0c;距离现在很遥远了。 截至本文撰写的时间&#xff0c;2025年&#xff0c;最新的.NET是.NET9了都&#xff0c;可能1…...

python 使用Whisper模型进行语音翻译

目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…...

pytorch实现循环神经网络

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 PyTorch 提供三种主要的 RNN 变体&#xff1a; nn.RNN&#xff1a;最基本的循环神经网络&#xff0c;适用于短时依赖任务。nn.LSTM&#xff1a;长短时记忆网络&#xff0c;适用于长序列数据&#xff0c;能有效解决…...

侯捷 C++ 课程学习笔记:深入理解 C++ 核心技术与实战应用

目录 引言 第一章&#xff1a;C 基础回顾 1.1 C 的历史与发展 1.2 C 的核心特性 1.3 C 的编译与执行 第二章&#xff1a;面向对象编程 2.1 类与对象 2.2 构造函数与析构函数 2.3 继承与多态 第三章&#xff1a;泛型编程与模板 3.1 函数模板 3.2 类模板 3.3 STL 容器…...

大厂面试题备份20250131

20250131 模型压缩怎么做&#xff1f;除了知识蒸馏 模型压缩是为了减少深度学习模型的计算和存储需求&#xff0c;提高推理效率。除了知识蒸馏&#xff0c;常见的模型压缩方法包括&#xff1a; 1. 剪枝&#xff08;Pruning&#xff09; 非结构化剪枝&#xff08;Unstructur…...

(三)QT——信号与槽机制——计数器程序

目录 前言 信号&#xff08;Signal&#xff09;与槽&#xff08;Slot&#xff09;的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制&#xff0c;用于不同对象之间的事件响…...

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

从0开始,来看看怎么去linux排查Java程序故障

一&#xff0c;前提准备 最基本前提&#xff1a;你需要有liunx环境&#xff0c;如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后&#xff0c;你还需要安装jdk和配置环境变量 1. 安装JDK&#xff08;以OpenJDK 17为例&#xff09; 下载JDK…...

Java实现LFU缓存策略实战

LFU算法原理在Java中示例实现集成Caffeine的W-TinyLFU策略缓存实战总结LFU与LRU稍有不同,LFU是根据数据被访问的频率来决定去留。尽管它考虑了数据的近期使用,但它不会区分数据的首次访问和后续访问,淘汰那些访问次数最少的数据。 这种缓存策略主要用来处理以下场景: 数据…...

LeetCode--84. 柱状图中最大的矩形【单调栈】

84. 柱状图中最大的矩形 正文 题目如下 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 这道题暴力很简单&#xff0c;但是时间复杂度是O(N^2)&#xf…...

感悟人生路

匆匆复匆匆&#xff0c;新春时光沙漏里&#xff0c;过了又来&#xff0c;只是那时和此时。累了&#xff0c;行过百公里&#xff0c;灯光交汇处&#xff0c;都是向往幸福之所。一路长虹&#xff0c;速度跟上节奏&#xff0c;福祉盈门&#xff0c;出入平安。​ 跨越时空&#xff…...

Autogen_core源码:_agent_instantiation.py

目录 _agent_instantiation.py代码代码解释代码示例示例 1&#xff1a;使用 populate_context 正确设置上下文示例 2&#xff1a;尝试在上下文之外调用 current_runtime 和 current_agent_id示例 3&#xff1a;模拟 AgentRuntime 使用 AgentInstantiationContext _agent_instan…...

开源智慧园区管理系统如何重塑企业管理模式与运营效率

内容概要 在如今快速发展的商业环境中&#xff0c;企业面临着日益复杂的管理挑战。开源智慧园区管理系统应运而生&#xff0c;旨在通过技术创新来应对这些挑战。它不仅是一个简单的软件工具&#xff0c;而是一个全面整合大数据、物联网和智能化功能的综合平台&#xff0c;为企…...

网络工程师 (9)文件管理

一、树形目录结构 &#xff08;一&#xff09;定义与构成 树形目录结构由一个根目录和若干层子文件夹&#xff08;或称为子目录&#xff09;组成&#xff0c;它像一棵倒置的树。这棵树的根称为根文件夹&#xff08;也叫根目录&#xff09;&#xff0c;从根向下&#xff0c;每一…...

Java小白入门教程:内置数据类型(四类八种)和引用数据类型

目录 一、内置数据类型&#xff08;四类八种&#xff09; 1. 整数类型&#xff08;四种子类型&#xff09; 2. 浮点类型&#xff08;两种子类型&#xff09; 3. 字符类型&#xff08;一种子类型&#xff09; 4. 布尔类型&#xff08;一种子类型&#xff09; 二、引用数据类…...

pytorch图神经网络处理图结构数据

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一类能够处理图结构数据的深度学习模型。图结构数据由节点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&a…...

CRC校验详解

CRC校验即循环冗余校验(Cyclic Redundancy Check),是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。首先看两个概念,后续会用到。 模2除法:也叫模2运算,就是结果除以2后取余数。模2除法每一位除的结果不影响其它位,即不向上一位借位,所以实际…...

使用where子句筛选记录

默认情况下,SearchCursor将返回一个表或要素类的所有行.然而在很多情况下,常常需要某些条件来限制返回行数. 操作方法: 1.打开IDLE,加载先前编写的SearchCursor.py脚本 2.添加where子句,更新SearchCursor()函数,查找记录中有<>文本的<>字段 with arcpy.da.Searc…...

人工智能导论--第1章-知识点与学习笔记

请根据教材内容&#xff0c;完成进行下面的作业任务。必须包含有教材的具体内容&#xff0c;不能是生成式AI系统的生成内容。 参考教材1.1节的内容介绍&#xff0c;谈谈你对“智能”的认识。思维能力是智能的重要特征之一&#xff0c;结合教材1.1.2节内容&#xff0c;从思维的…...

半导体SAP管理系统:数字化转型的驱动力

在当今全球科技竞争日益激烈的背景下&#xff0c;半导体行业作为信息技术的基石&#xff0c;其生产效率、质量控制和成本优化直接关系到企业的市场竞争力和可持续发展。随着数字化转型的深入&#xff0c;半导体企业纷纷寻求高效、智能的管理系统以提升运营效率。SAP管理系统&am…...

Cursor 简介:AI 如何改变编程体验

在软件开发领域&#xff0c;效率和质量始终是开发者们追求的目标。随着人工智能技术的飞速发展&#xff0c;编程工具也在不断进化&#xff0c;Cursor 便是这一趋势下的产物。它不仅仅是一个代码编辑器&#xff0c;更是一个集成了 AI 能力的智能编程助手&#xff0c;旨在通过 AI…...

苯乙醇苷类化合物的从头生物合成-文献精读108

Complete pathway elucidation of echinacoside in Cistanche tubulosa and de novo biosynthesis of phenylethanoid glycosides 管花肉苁蓉中松果菊苷全生物合成途径解析及苯乙醇苷类化合物的从头生物合成 摘要 松果菊苷&#xff08;ECH&#xff09;是最具代表性的苯乙醇苷…...

CSS:跑马灯

<div class"swiper-container"><div class"swiper-wrapper"><!-- 第一组 --><div class"item" v-for"item in cardList" :key"first-item.id"><img :src"item.image" alt""…...

简单的爱心跳动表白网页(附源码)

一&#xff1a;准备工作 在开始之前&#xff0c;确保已经具备基础的 HTML、CSS 和 JavaScript 知识。同时&#xff0c;也要准备好一个代码编辑器&#xff0c;比如 VS Code 或 Sublime Text。接下来&#xff0c;我们需要创建三个文件&#xff1a;index.html、styles.css 和 scr…...

遗传算法【Genetic Algorithm(GA)】求解函数最大值(MATLAB and Python实现)

一、遗传算法基础知识 来自B站视频的笔记&#xff1a; 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程&#xff08;结合理论基础&#xff09;_哔哩哔哩_bilibili 1、遗传算法 使用“适者生存”的原则&#xff0c;在遗传算法的每一代中&#xff0c;…...

HTB:Administrator[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...

正则表达式中常见的贪婪词

1. * 含义&#xff1a;匹配前面的元素零次或者多次。示例&#xff1a;对于正则表达式 a*&#xff0c;在字符串 "aaaa" 中&#xff0c;它会匹配整个 "aaaa"&#xff0c;因为它会尽可能多地匹配 a 字符。代码示例&#xff08;Python&#xff09;&#xff1a…...

高阶C语言|深入理解字符串函数和内存函数

文章目录 前言1.求字符串长度1.1 字符串长度函数&#xff1a;strlen模拟实现 2.长度不受限制的字符串函数2.1 字符串拷贝函数&#xff1a;strcpy模拟实现 2.2 字符串连接函数&#xff1a;strcat模拟实现 2.3 字符串比较函数&#xff1a;strcmp模拟实现 3.长度受限制的字符串函数…...

grpc 和 http 的区别---二进制vsJSON编码

gRPC 和 HTTP 是两种广泛使用的通信协议&#xff0c;各自适用于不同的场景。以下是它们的详细对比与优势分析&#xff1a; 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf&#xff08;二进制&#xff09;通常使用 JSON/…...

基于 RAG 的聊天机器人的追踪、日志和指标:结合 Elastic 的 OpenTelemetry 分发

作者&#xff1a;来自 Elastic Bahubali Shetti 如何使用 Elasticsearch 观察基于 OpenAI RAG 的应用程序。使用 OpenTelemetry 对应用程序进行检测&#xff0c;收集日志、跟踪、指标&#xff0c;并了解 LLM 在 Kubernetes 和 Docker 上使用 OpenTelemetry 的 Elastic 分发的表…...

6.二分算法

二分 二分算法&#xff0c;也称为二分查找或折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。以下是 C 中二分算法的相关内容&#xff1a; 算法原理 二分算法的基本思想是将有序数组分成两部分&#xff0c;然后将目标值与中间元素进行比较。如果目标值等于中…...

Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年

Android Studio 1.0 宣发于 2014 年 12 月&#xff0c;而现在时间来到 2025 &#xff0c;不知不觉间 Android Studio 已经陪伴 Androider 走过十年历程。 Android Studio 10 周年&#xff0c;也代表着了我的职业生涯也超十年&#xff0c;现在回想起来依然觉得「唏嘘」&#xff…...

“LoRA技术中参数初始化策略:为何A参数采用正态分布而B参数初始化为0”

在LoRA&#xff08;Low-Rank Adaptation&#xff09;中&#xff0c;参数A和B的初始化策略是经过精心设计的&#xff0c;以确保模型训练的稳定性和有效性。具体来说&#xff0c;参数A通常被初始化为正态分布&#xff0c;而参数B则初始化为0。这样的设计有以下几个优点&#xff1…...

PyTorch中的movedim、transpose与permute

在PyTorch中&#xff0c;movedim、transpose 和 permute这三个操作都可以用来重新排列张量&#xff08;tensor&#xff09;的维度&#xff0c;它们功能相似却又有所不同。 movedim &#x1f517; torch.movedim 用途&#xff1a;将张量的一个或多个维度移动到新的位置。参数&…...

灰色预测模型

特点&#xff1a; 利用少量、不完全的信息 预测的是指数型的数值 预测的是比较近的数据 灰色生成数列原理&#xff1a; 累加生成&#xff1a; 累减生成&#xff1a;通过累减生成还原成原始数列。 加权相邻生成&#xff1a;&#xff08;会更接近每月中旬&#xff0c;更推荐…...