分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

系列文章目录

分布式集群——jdk配置与zookeeper环境搭建

分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

文章目录

前言

一 hadoop的相关概念

1.1 Hadoop概念

补充:块的存储

1.2 HDFS是什么

1.3 三种节点的功能

I、NameNode节点

II、fsimage与edits文件存放的内容介绍

III、DataNode节点

IV、SecondaryNameNode节点【辅助管理员信息】

1.4 HDFS的读写流程

1、读操作

2、写操作

1.5 HDFS元数据管理机制

1、如何持久化存储数据?

fsimage(镜像文件)

edits log(编辑日志)

2、SeconderyNameNode辅助管理元数据的流程

第一阶段:启动NameNode

第二阶段:SecondaryNameNode开始工作

3. 小细节

二 HDFS的五大机制

1、切片机制

2、汇报机制

3、心跳检测机制

4、负载均衡

5、副本机制

三 Hadoop安装

3.1 集群规划列表

3.2 上传压缩包

3.3 配置相关的文件

(1)修改core-site.xml配置文件

(2)修改hdfs-site.xml

(3)配置hadoop-env.sh

(4)配置mapred-site.xml

(5)配置yarn-site.xml文件

(6)修改mapred-env.sh

(7)修改slaves(配置我们的从机)

(8)前面配置好后,我们需要自己创建目录

(9)分发安装内容

(10)三台机器配置hadoop环境变量

(11)启动集群


前言

本文主要介绍hadoop的相关概念以及在Linux上面配置Hadoop的具体操作。

一 hadoop的相关概念

1.1 Hadoop概念

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,HDFS、MR、Yarn三个重要的组件组 成。HDFS是GFS的实现(论文必须会),Hadoop的MR是MR的实现(论文稍微了解一下)。

分片是客户端做的,专门的机器来接受请求,真正存节点的是客户端和datanode。

客户端建立通道上传,一次64k上传。存在缓存区。

切片是客户端负责切片,物理上分块,2.0以上为128M以上

目录信息在专门的机器上面,有两处存放位置【硬盘+内存】

读写文件时客户端与机器之间操作

文件需要嵌套缓冲流,

补充:块的存储

通过机架感知原理 + 网络拓扑结构实现副本摆放

  • 第1个副本:优先本机存放,否则就近随机

  • 第2个副本:放在与第1个副本就近不同机架上的某一个服务器

  • 第3个副本:与第2个副本相同机架的不同服务器。

  • 如果还有更多的副本:随机放在各机架的服务器中。

1.2 HDFS是什么

分布式文件系统,适合一次写入,多次查询的情况。不支持并发写,不适用于小文件存储【小文件内容1M,但是存放的时候依旧为128M】。低时延的数据访问。

重要的三个节点

  • NameNode节点

  • DataNode节点

  • SecondaryNameNode节点【辅助源操作信息】

1.3 三种节点的功能

I、NameNode节点

NameNode节点:

  • NameNode负责存储数据文件的元数据

  • NameNode负责管理文件系统目录结构接受客户端的文件操作请求

NameNode维护两套数据:

  • 一套是文件目录与数据块之间的对应关系【静态

  • 一套是数据块与存储节点之间的对应关系【动态

前一套数据是静态的,存放在磁盘上,通过fsimage和edits【编辑日志文件】文件来维护;

后一套是动态的,在集群重启时会在内存自动建立这些信息

  • 其中fsimage存储的是某一时段NameNode内存元数据信息(配置时通过hdfs-default.xml中的dfs.name.dir选项设置);【整个文件系统的目录结构以及文件相关信息】

  • edits记录操作日志文件(配置时通过hdfs-default.xml的dfs.name.edits.dir选项设置);fstime保存最近一次checkpoint的时间。

II、fsimage与edits文件存放的内容介绍

  • fsimage:镜像文件实际是存放的目录结构、文件属性等相关信息,是NameNode中关于 元数据的镜像。它是在NameNode启动时对整个文件系统的快照。

  • edits:编辑日志文件,记录对文件或者目录的修改信息,比如删除目录,修改文件等信 息。编辑日志一般命名规则是“edits_*”,它在NameNode启动后,记录对文件系统的改动 序列。

edits文件存放的是hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。

fsimage和edits文件都是经过序列化的,在NameNode启动的时候,它会将fsimage文件中的所有内容加载到内存中,之后再执行edits文件中的各项操作。使得内存中的元数据和实际的数据同步,存在内存中的元数据支持客户端的读操作。

III、DataNode节点

DataNode负责按Block存储数据文件。每一个数据文件都会按照Block大小进行划分。每个Block都会进行多副本备份(一般为三份),通常多个副本会按照一定的策略(机架感知策略)放在不同的DataNode节点上。

IV、SecondaryNameNode节点【辅助管理员信息】

SecondaryNameNode作为NameNode的冷备份。负责合并NameNode上的fsimage和edits文件。集群启动会交给namenode存到内存里面。

SecondaryNameNode的本质作用是辅助NameNode进行fsimage和editlogs的合并操作。

  1. 首先,它定时到NameNode去获取edit logs,并更新到fsimage上。[注:Secondary NameNode自己的fsimage]

  2. 一旦它有了新的fsimage文件,它将其拷贝回NameNode中。

  3. NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。

1.4 HDFS的读写流程

1、读操作

① 客户端向NameNode请求读取文件

② NameNode检查该文件是否存在以及该客户端是否具有读权限,有一个不满足则返回报错信息 两者都有则根据“机架感知原理”和“网络拓补图”,返回存储该文件的块地址(存储该文件的DataNode列表)

③ 客户端拿到返回的块地址后,并行的读取DataNode列表中对应的块信息 如果之前读取的是部分块的信息,则在这些块数据读取完毕后会重新请求NameNode 获取 剩下的块地址重新读取,直至所有数据块的信息读取完毕

⑤ 最后拼接块信息得到最终的文件

至此,读取文件操作完成

2、写操作

① 客户端向NameNode请求上传文件

② NameNode检查是否已存在要上传的文件,如果已有则拒绝请求 如文件不存在则继续检查该客户端在待上传的目录下是否有写权限,如果无权限则返回报错信息,有权限则给客户端返回可以上传的信息

③ 客户端接收可以上传的信息后,对文件进行切块

④ 客户端重新请求NameNode,询问第一个数据块的上传位置

⑤ NameNode接收到客户端的请求后,根据副本机制、负载均衡、机架感知原理和网络拓补图,找到存储第一个数据块的DataNode列表(例如node1、node2、node3)后告知客户端

⑥ 客户端根据接收到的DataNode列表,连接就近的节点(例如node1)

⑦ 第一个节点收到请求后会与DataNode列表中的其他节点进行连接,形成“传输管道”,然后客户端通过数据报包(对数据块再进行切分)的方法开始给节点传输第一个数据块

⑧ 节点接收到数据块后,需要告知客户端块信息已上传成功 所以node3接收到信息后会反馈给node2已接收,node2再反馈给node1已接收,最后node1告知客户端已上传成功 这一步也称为【构建反向应答机制】

⑨ 第一个数据块上传完成后,客户端继续请求NameNode询问第二个数据块的上传位置,重复第四到第八步的操作,直至所有的数据块上传成功

至此,写文件操作完成

1.5 HDFS元数据管理机制

HDFS元数据按类型划分为两部分

持久化存储:

  • 文件、目录自身的属性信息,例如文件名,目录名,修改信息

  • 文件存储的相关信息,例如存储块信息,分块情况,副本个数

非持久化存储: DataNode节点中的数据块信息

1、如何持久化存储数据?

答:通过fsimage和edits log

fsimage(镜像文件)

保存Hadoop文件系统中的所有目录和元数据信息,但不保存文件块位置的信息 文件块位置信息只存储在内存中,是Namenode在DataNode加入集群时询问得到,并且间断的更新

edits log(编辑日志)

保存客户端对Hadoop集群的事务性操作记录(增、删、改)

2、SeconderyNameNode辅助管理元数据的流程

图解

原理

第一阶段:启动NameNode

  • ① 如果是首次启动namenode格式化,则新建fsimage(镜像文件)和edits log(编辑日志) 如果是非首次启动,则直接加载fsimage和edits log到内存中

  • ② 客户端对元数据的增删改操作会实时的写入到edits log

第二阶段:SecondaryNameNode开始工作

  • ③ SecondaryNameNode会实时检查edits log的状态,只要满足一定阈值时(1小时或修改达到100W次)后就通知NameNode重新生成一个新的edits log文件,后续将操作记录写入新文件中

  • ④ SecondaryNameNode通过HTTP协议拉取NameNode中的fsimage和edits log到本地

  • ⑤ 对拉取过来的edits log和fsimage加载到内存中进行合并操作(这个过程也成为Checkpoint),形成新的fsimage文件

  • ⑥ 把新的fsimage推送给NameNode,替换旧fsimage

3. 小细节

  • ① 产生的edits log和fsiamge不会被立即删除,而是在集群重启或者这些文件达到一定量级后才会删除

  • ② 对edits log和fsimage的合并操作实在SecondaryNameNode实现的,整个过程NameNode不参与

  • ③ 实际开发中,NameNode和SecondaryNameNode一般部署在不同的服务器上,两者的配置几乎一样,只是SecondaryNameNode内存要稍微大点

  • ④ 紧急情况下,SecondaryNameNode可以用来恢复NameNode的元数据

二 HDFS的五大机制

1、切片机制

HDFS中的文件在物理上是分块(block)存储的,块的大小可以通过配置参数来规定,在hadoop2.x版本中默认大小是128M

2、汇报机制

① HDFS集群重新启动的时候,所有的DataNode都要向NameNode汇报自己的块信息 ② 当集群在正常工作的时,间隔一定时间(6小时)后DataNode也要向NameNode汇报一次自己的块信息

3、心跳检测机制

NameNode与DataNode依靠心跳检测机制进行通信

① DataNode每3秒给NameNode发送自己的心跳信息 ② 如果NameNode没有收到心跳信息,则认为DataNode进入“假死”状态。DataNode在此阶段还会再尝试发送10次(30s)心跳信息 ③ 如果NameNode超过最大间隙时间(10分钟)还未接收到DataNode的信息,则认为该DataNode进入“宕机”状态 ④ 当检测到某个DataNode宕机后,NameNode会将该DataNode存储的所有数据重新找台活跃的新机器做备份

4、负载均衡

让集群中所有的节点(服务器)的利用率和副本数尽量都保持一致或在同一个水平线上

5、副本机制

① 副本的默认数量为3 ② 当某个块的副本小于3份时,NameNode会新增副本 ③ 当某个块的副本大于3份时,NameNode会删除副本 ④ 当某个块的副本数小于3份且无法新增的时候,此时集群会强制进入安全模式(只能读,不能写)

三 Hadoop安装

3.1 集群规划列表

检查我们的hadoop包对本地库的支持:切换到hadoop安装目录下,执行bin/hadoopchecknative回车即可。

3.2 上传压缩包

上传我们编译好的apache hadoop包并解压缩(下图红色标记的)

解压hadoop的压缩包

修改配置文件 /etc/profile ,后使用source命令使其生效。

3.3 配置相关的文件

(1)修改core-site.xml配置文件

  vim /opt/hadoop的安装路径/etc/hadoop/core-site.xml

定义hadoop集群系统的文件类型是一个分布式文件系统

 定义hadoop集群系统的文件类型是一个分布式文件系统<property>定义hadoop集群中文件的类型,说明我们用的是分布式文件系统,该文件系统的主节点的node01节点上,分布式文件系统的服务端口号为8020。<name>fs.default.name</name><value>hdfs://node01:8020</value></property><property><name>hadoop.tmp.dir</name><value>/opt/software/hadoop-2.7.5/hadoopDatas/tempDatas</value></property>定义文件缓冲区大小,实际工作中根据服务器性能动态调整<property><name>io.file.buffer.size</name><value>4096</value></property>开启hdfs垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位:分钟删除掉的文件会先放在垃圾桶里面,而不是立刻从机器上删除掉。10080是七天,也就是说7天之后,会清理垃圾桶中超过7天的数据。一天是1440.<property><name>fs.trash.interval</name><value>10080</value></property>

(2)修改hdfs-site.xml

 设定辅助管理节点的主机和端口号<property><name>dfs.namenode.secondary.http-address</name><value>node01:50090</value></property>设定NameNode(HDFS)主节点的访问地址(即:主机和端口号)——会非常常用可以通过网页查看分布式文件系统中的数据。<property><name>dfs.namenode.http-address</name><value>node01:50070</value></property>指定namdenode存储元数据的位置,这个文件是不存在的,我们需要创建它。<property><name>dfs.namenode.name.dir</name><value>file:///export/opt/software/hadoop-2.7.5/hadoopDatas/namenodeDatas,file:///export/opt/software/hadoop-2.7.5/hadoopDatas/namenodeDatas2</value></property>定义datanode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割。<property><name>dfs.datanode.name.dir</name><value>file:///export/opt/software/hadoop-2.7.5/hadoopDatas/datanodeDatas,file:///export/opt/software/hadoop-2.7.5/hadoopDatas/datanodeDatas2</value></property>定义namenode编辑日志文件的存放目录<property><name>dfs.namenode.edits.dir</name><value>file:///export/opt/software/hadoop-2.7.5/hadoopDatas/nn/edits</value></property>定义检查点的存放位置(定期从活动的NameNode下载fsimage和editlog,在本地合并它们,并将新映像上传回活动的NameNode)<property><name>dfs.namenode.checkpoint.dir</name><value>file:///export/opt/software/hadoop-2.7.5/hadoopDatas/dfs/snn/name</value></property><property><name>dfs.namenode.checkpoint.edits.dir</name><value>file:///export/opt/software/hadoop-2.7.5/hadoopDatas/dfs/snn/edits</value></property>指定一个文件切片存储的副本个数<property><name>dfs.replication</name><value>3</value></property>设置HDFS文件权限,暂时关闭,后期需要,可以再开启<property><name>dfs.permissions</name><value>false</value></property>指定一个文件切片的大小,这里面指定的大小为128M<property><name>dfs.blocksize</name><value>134217728</value></property>

(3)配置hadoop-env.sh

 export JAVA_HOME=/opt/software/jdk1.8.0_281

(4)配置mapred-site.xml

 开启mapreduce的小任务模式,该模式是 2.x 开始引入的;以Uber模式运行 MR 作业,所
 有的 Map Tasks 和 Reduce Tasks 将会在 ApplicationMaster 所在的容器(container)中运行。如果数据量不是非常大,我们就可以开启小任务模式,这样可以提高2-3倍的效率。

<property><name>mapreduce.job.ubertask.enable</name><value>true</value></property>历史任务服务器的主机地址,通过该地址可以访问到我们曾经计算过的任务、结果及信息。<property><name>mapreduce.jobhistory.address</name><value>node01:10020</value></property>设置通过网页访问历史任务的主机和端口<property><name>mapreduce.jobhistory.webapp.address</name><value>node01:19888</value></property>

(5)配置yarn-site.xml文件

 配置yarn主节点的位置<property><name>yarn.resourcemanager.hostname</name><value>node01</value></property>NodeManager上运行的附属服务,只有我们配置为下方的值,才可以运行MR程序,默认值是””。<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>开启日志聚合功能,将各种日志汇总在一起,进行显示。<property><name>yarn.log-aggregation-enable</name><value>true</value></property>设置聚合日志保存的时间(单位:秒)<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value></property>设置yarn集群的内存分配方案表示在节点上Yarn可使用的物理内存(M)<property><name>yarn.nodemanager.resource.memory-mb</name><value>20480</value></property>单个容器可申请的最小与最大内存<property><name>yarn.scheduler.minimum-allocation-mb</name><value>2048</value></property>在物理内存不够用的情况下,如果占用了大量虚拟内存并且超过了一定阈值,那么就认为当前集群的性能比较差,直接让你的终端报个错提醒你。<property><name>yarn.nodemanager.vmem-pmem-ratio</name><value>2.1</value></property>

(6)修改mapred-env.sh

 export JAVA_HOME=/opt/software/jdk1.8.0_281

(7)修改slaves(配置我们的从机)

 node01
 node02
 node03

(8)前面配置好后,我们需要自己创建目录

目录结构如下:

 [root@node01 hadoop-2.7.5]# mkdir hadoopDatas[root@node01 hadoop-2.7.5]# cd hadoopDatas/[root@node01 hadoopDatas]# ls[root@node01 hadoopDatas]# mkdir datanodeDatas[root@node01 hadoopDatas]# mkdir datanodeDatas2[root@node01 hadoopDatas]# mkdir namenodeDatas2[root@node01 hadoopDatas]# mkdir namenodeDatas[root@node01 hadoopDatas]# mkdir -p dfs/snn[root@node01 hadoopDatas]# cd dfs/snn/[root@node01 snn]# mkdir edits[root@node01 snn]# mkdir name[root@node01 snn]# cd ..[root@node01 dfs]# cd ..[root@node01 hadoopDatas]# mkdir -p nn/edits[root@node01 hadoopDatas]# mkdir tempDatas[root@node01 hadoopDatas]# tree.├── datanodeDatas├── datanodeDatas2├── dfs│?? └── snn│??     ├── edits│??     └── name├── namenodeDatas├── namenodeDatas2├── nn│?? └── edits└── tempDatas11 directories, 0 files

PS:注意此处的文件夹在你的Hadoop安装路径下面

(9)分发安装内容

做一个文件的分发,将整个hadoop安装目录分发给node02和node03节点上去。 进入opt目录后,执行分发命令:

 scp -r hadoop-2.7.5 node02:/opt/software

此处选择需要Copy到node02节点的那个目录当中。

 scp -r hadoop-2.7.5 node03:/opt/software

(10)三台机器配置hadoop环境变量

 export JAVA_HOME=/opt/software/jdk1.8.0_281export ZOOKEEPER_HOME=/opt/software/zookeeperexport HADOOP_HOME=/opt/software/hadoop-2.7.5export PATH=:$JAVA_HOME/bin:$PATH:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

别忘记用source /etc/profile使环境变量生效。

(11)启动集群

概述:主要是启动两个模块,hdfs和yarn。一定要注意:首次启动HDFS的时候,一定要对其进行格式化操作。本质上是一些清理和准备工作(会准备一些集群必备的文件等),因为此时的HDFS在物理上还是不存在的。 第一台机器执行如下操作: 进入到hadoop的安装目录中

 cd /opt/software/hadoop-2.7.5

进行格式化

 bin/hdfs namenode -formatsbin/start-dfs.sh

停止命令只要把start换成stop即可 从节点,用jps看一下,启动成功,有一个DataNode。

 sbin/start-yarn.shsbin/mr-jobhistory-daemon.sh start historyserver

三个端口查看界面

 http://node01:50070/explorer.html# 查看hdfshttp://node01:8088/cluster 查看yarn集群http://node01:19888/jobhistory 查看历史完成的任务

windows访问不到node01,所以需要配置hosts 可以换成

 http://192.168.1.131:50070/explorer.html#/http://192.168.1.131:8088/clusterhttp://192.168.1.131:19888/jobhistory

备注:配置文件太多,所以,我们要远程修改Linux的文件,太麻烦了,所以,我们采用npp进行远程登录。

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/117888.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产工业软件的挑战与机遇:风口是否还在燃烧?

随着智能制造与数字化转型等新型工业理念的推广&#xff0c;工业软件在工业领域中的地位日益重要。在这个过程中&#xff0c;国产工业软件也迎来了新的发展机遇。然而&#xff0c;对于国产工业软件而言&#xff0c;是否存在着发展的“风口”&#xff1f;今天&#xff0c;我们将…

【C++技能树】继承概念与解析

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 继承 0. 继承概念0.1 继承访问限定符 1. 基类和派生类对象赋值兼容转换2. 继承中的作用域3. 派生类中的默认成员函数4.友元5.继承中的静态成员6.菱…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

STM32f103入门(9)编码器接口测速

TIM3 PA6 PA7 上拉输入 原理上也是PWM捕获输入 捕获两个输入 我们用中断处理读取CNT的值 读取完将CNT置0 这样我们就得到了旋转编码器的速度/s 中断配置代码 #include "stm32f10x.h" // Device headervoid Timer_Init(void) {RCC_APB1PeriphClockC…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库&#xff0c;其中包括新的集合类型&#xff08;例如 multimap 和…

Web安全——穷举爆破上篇(仅供学习)

Web安全 一、概述二、常见的服务1、burpsuite 穷举后台密码2、burpsuite 对 webshell 穷举破解密码3、有 token 防御的网站后台穷举破解密码3.1 burpsuite 设置宏获取 token 对网站后台密码破解3.2 编写脚本获取token 对网站后台密码破解 4、针对有验证码后台的穷举方法4.1 coo…

ElasticSearch安装为Win11服务

在windows的环境下操作是Elasticsearch,并且喜欢使用命令行 &#xff0c;启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch ,这样直接启动的话集群名称会默elasticsearch&#xff0c;节点名称会随机生成。 停止就直接在cmd界面按CtrlC 其实我们也可以将elasticse…

一篇文章教会你什么是二叉搜索树

二叉搜索树 二叉搜索树概念二叉搜索树操作1.二叉搜索树的查找2.二叉搜索树的插入3.二叉搜索树的删除4.二叉搜索树的遍历 二叉搜索树的实现1.二叉搜索树节点结构2.二叉搜索树类3.二叉搜索树的构造及析构4.二叉搜索树的拷贝构造及赋值重载5.二叉搜索树插入6.二叉搜索树查找7.二叉…

必读干货!独立站新手卖家常见十大问题解答

新手卖家入局跨境电商独立站&#xff0c;会考虑到很多问题&#xff0c;从网站到产品再到售卖最终的发货。而且卖家普遍对独立站存在认知不全的问题&#xff0c;门槛高、推广难、转化难是最初印象。 那独立站该怎么开始&#xff0c;如何下手&#xff1f;今天整理并解答独立站新…

数据结构--树4.2.2(二叉树--遍历)

目录 一、二叉树的建立 二、二叉树的遍历算法 一、二叉树的建立 CreateBitree(Bitree *t){char c;scanf("%c",&c);if( c){*t NULL;}else{*t(Bitnode*)malloc(sizeof(Bitnode));(*t)->data c;CreateBitree(&(*t)->lchild);CreateBitree(&(*t)-&…

Mybatis学习|注解开发、lombok

1.使用注解开发 无需再编写相应的Mapper.xml文件&#xff0c;直接将sql用注解的形式写在Mapper接口的对应方法上即可。 然后因为没有xml文件,所以要在mybatis-config.xml核心配置文件中注册这个Mapper接口&#xff0c;而不用去注册之前的Mapper.xml&#xff0c;这里其实如果用…

iOS 设置下载部分文件,如何获取完整文件的大小

在视频的需求中&#xff0c;遇到这样一个需求&#xff0c;播放一视频的时候&#xff0c;要预下载 后面10条视频&#xff0c;但是只下载后面十条视频的前面1M 实现方法 1 创建请求时设置cacheLength resource [[IdiotResource alloc] init];resource.requestURL task.request…

UE5.1 透明渲染流程框架图

相关文章&#xff1a; UE 透明物体绘制准备_sh15285118586的博客-CSDN博客 透明直接光和间接光生成_sh15285118586的博客-CSDN博客 Scene:Translucency-Translucency(AfterDOF)_sh15285118586的博客-CSDN博客 Scene:Translucency-Distortion &PostProcessing:ComposeTran…

详解vue3中ref和reactive用法和区别

vue3中ref和reactive区别 1、前言2、基本用法2.1 ref2.2 reactive 3、ref和reactive定义数组对比3.1 ref定义数组3.1 reactive定义数组 4、ref 和reactive的区别 1、前言 ref和reactive是Vue3中用来实现数据响应式的API&#xff0c;一般情况下&#xff0c;ref定义基本数据类型…

react css 污染解决方法

上代码 .m-nav-bar {background: #171a21;.content {height: 104px;margin: 0px auto;} }import React from "react"; import styles from ./css.module.scssexport default class NavBar extends React.Component<any, any> {constructor (props: any) {supe…

定位与轨迹-百度鹰眼轨迹开放平台-学习笔记

1. 百度鹰眼轨迹的主要功能接口 百度的鹰眼轨迹平台&#xff0c;根据使用场景不同&#xff0c;提供了web端、安卓端等各种类型的API与SDK&#xff0c;本文章以web端API为例&#xff0c;介绍鹰眼轨迹的使用。 2. API使用前的准备 使用鹰眼轨迹API&#xff0c;需要两把钥匙&…

分布式session的4种解决方案

分布式session的4种解决方案 1、cookie和session cookie和session都是用来跟踪用户身份信息的会话方式。 cookie存储的数据保存在本地客户端&#xff0c;用户获取容易&#xff0c;但安全性不高&#xff0c;存储数据小。 session存储的数据保存在服务器&#xff0c;用户不易获取…

Redis网络模型

目录 Redis网络模型 用户空间和内核态空间 阻塞IO(BIO) 非阻塞IO(NIO) IO多路复用 信号驱动IO 异步IO(AIO) Redis到底是单线程还是多线程&#xff1f; 为什么要使用单线程&#xff1f; Redis网络模型 进程的寻址空间会划分为两部分&#xff1a;内核空间、用户空间 用…

自然语言处理(六):词的相似性和类比任务

词的相似性和类比任务 在前面的章节中&#xff0c;我们在一个小的数据集上训练了一个word2vec模型&#xff0c;并使用它为一个输入词寻找语义相似的词。实际上&#xff0c;在大型语料库上预先训练的词向量可以应用于下游的自然语言处理任务&#xff0c;为了直观地演示大型语料…