版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目五Zookeeper分布式协调服务操作CONTENTS目录01
项目导读02
知识目标03
技能目标04
素质(思政)目标05
任务一Zookeeper分布式集群安装部署CONTENTS目录06
任务二Zookeeper命令行操作07
任务三ZookeeperJavaAPI操作08
项目总结09
项目考核项目导读01项目导读
部署Zookeeper集群为了防止高可用平台单点故障实现,同时实现集群之间数据同步,现在需要搭建部署Zookeeper分布式协调服务集群知识目标02知识目标
了解Zookeeper特点、机制
熟悉Zookeeper应用场景
熟悉Zookeeper选举机制
熟悉Zookeeper数据结构
熟悉Zookeeper节点类型
ZooKeeperAPI常用类技能目标03技能目标
掌握ZooKeeper安装
掌握ZooKeeper命令行操作
掌握ZooKeeperJavaAPI操作素质(思政)目标04素质(思政)目标培养严谨细致的工匠精神厚植技术报国梦培养不骄不躁的工匠心态任务一Zookeeper分布式集群安装部署05任务工单
任务场景现有3台虚拟机,分别为master、hadoop1、hadoop2,需要在上面搭建高可用,为了防止高可用平台单点故障实现集群之间数据同步,现在需要搭建部署Zookeeper分布式协调服务集群
任务准备全班学生以4人左右为一组,各组选出组长。请组长组织组员查找相关资料,并组织讨论和汇总问题1:单点故障是什么问题2:selinux有什么作用必备知识技能:一、Zookeeper简介
Zookeeper:分布式协调服务Zookeeper是一个开源的分布式协调服务,主要为了解决分布式架构下数据一致性问题,它是集群的管理者,监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和高性能、功能稳定的系统提供给用户必备知识技能:二、Zookeeper工作机制Zookeeper:文件系统+通知机制
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说,Zookeeper=文件系统+通知机制必备知识技能:三、Zookeeper特点
Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群Zookeeper奇数节点优势2.Zookeeper集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器全局数据一致每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行,即先进先出数据更新原子性,一次数据更新要么成功,要么失败实时性,在一定时间范围内,Client能读到最新数据必备知识技能:四、Zookeeper应用场景01数据发布/订阅数据发布/订阅系统,需要发布者将数据发布到Zookeeper的节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新发布/订阅一般有两种设计模式:推模式和拉模式,服务端主动将数据更新发送给所有订阅的客户端称为推模式;客户端主动请求获取最新数据称为拉模式Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知后,主动到服务端获取最新的数据02命名服务命名服务是分布式系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体,在分布式环境中,上层应用仅仅需要一个全局唯一的名字,Zookeeper可以实现一套分布式全局唯一ID的分配机制。通过调用Zookeeper节点创建的API接口就可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字,利用此特性,可以生成全局ID,其步骤如下(1)客户端根据任务类型,在指定类型的任务下通过调用接口创建一个顺序节点,如"job-"(2)创建完成后,会返回一个完整的节点名,如"job-00000001"(3)客户端拼接type和返回值后,就可以作为全局唯一ID了,如"type2-job-00000001"必备知识技能:四、Zookeeper应用场景分布式协调/通知Zookeeper中特有的Watcher注册与异步通知机制,能够很好地实现分布式环境下不同机器,甚至不同系统之间的协调与通知,从而实现对数据变更的实时处理。通常的做法是不同的客户端都对Zookeeper上的同一个数据节点进行Watcher注册,监听数据节点的变化(包括节点本身和子节点),若数据节点发生变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应处理。在绝大多数分布式系统中,系统机器间的通信无外乎心跳检测、工作进度汇报和系统调度必备知识技能:四、Zookeeper应用场景3.分布式协调/通知
心跳检测不同机器间需要检测到彼此是否在正常运行,可以使用Zookeeper实现机器间的心跳检测,基于其临时节点特性(临时节点的生存周期是客户端会话,客户端会话结束以后,其临时节点将不再存在),可以让不同机器都在Zookeeper的一个指定节点下创建临时子节点,不同的机器之间可以根据这个临时子节点来判断对应的客户端机器是否存活。通过Zookeeper可以大大减少系统耦合工作进度汇报通常任务被分发到不同机器后,需要实时地将自己的任务执行进度汇报给分发系统,可以在Zookeeper上选择一个节点,每个任务客户端都在这个节点下面创建临时子节点,这样不仅可以判断机器是否存活,同时各个机器可以将自己的任务执行进度写到该临时节点中去,以便中心系统能够实时获取任务的执行进度系统调度Zookeeper能够实现如下系统调度模式:分布式系统由控制台和一些客户端系统两部分构成,控制台的职责就是需要将一些指令信息发送给所有的客户端,以控制他们进行相应的业务逻辑,后台管理人员在控制台上做一些操作,实际上就是修改Zookeeper上某些节点的数据,Zookeeper可以把数据变更以事件通知的形式发送给订阅客户端必备知识技能:四、Zookeeper应用场景
分布式锁
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要分为排他锁和共享锁。排他锁又称为写锁或独占锁,若事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作,直到T1释放了排他锁
①获取锁,在需要获取排他锁时,所有客户端通过调用接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock。Zookeeper可以保证只有一个客户端能够创建成功,没有成功的客户端需要注册/exclusive_lock节点监听
②释放锁,当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时,所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取
共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。在需要获取共享锁时,所有客户端都会到/shared_lock下面创建一个临时顺序节点必备知识技能:四、Zookeeper应用场景
分布式队列
有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己的任务再交给C团队继续做。这就有点像业务系统的工作流一样,一环一环地传下去
分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进程、跨主机、跨网络的数据共享和数据传递,这就是我们的分布式队列必备知识技能:五、Zookeeper选举机制
Zookeeper选举机制Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举必备知识技能:五、Zookeeper选举机制
服务器启动时期的Leader选举若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下(1)每个Server发出一个投票。由于是初始情况,Server1和Server2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid,ZXID)来表示,此时Server1的投票为(1,0),Server2的投票为(2,0),然后各自将这个投票发给集群中其他机器(2)接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器(3)处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:优先检查ZXID。ZXID比较大的服务器优先作为Leader,如果ZXID相同,那么就比较myid,myid较大的服务器作为Leader服务器。对于Server1而言,它的投票是(1,0),接收Server2的投票为(2,0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2的myid最大,于是更新自己的投票为(2,0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可(4)统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接收到相同的投票信息,对于Server1、Server2而言,都统计出集群中已经有两台机器接收了(2,0)的投票信息,此时便认为已经选出了Leader(5)改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING必备知识技能:五、Zookeeper选举机制服务器运行时期的Leader选举在Zookeeper运行期间,Leader与非Leader服务器各司其职,即便有非Leader服务器宕机或新加入,此时也不会影响Leader,但是一旦Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮Leader选举,其过程和启动时期的Leader选举过程基本一致任务实施:一、master上核心文件配置
步骤1把提前下载好的Zookeeper安装包zookeeper-3.4.10.tar.gz拷贝到/usr/local/src目录下步骤2:进入src目录,解压。在命令窗口键入cd/usr/local/srctar-zxvfzookeeper-3.4.10.tar.gz步骤3:进入Zookeeper目录,创建zkdata目录并查看当前路径cdzookeeper-3.4.10任务实施:一、master上核心文件配置mkdirzkdatapwdpwd命令执行结果为/usr/local/src/zookeeper-3.4.10,复制该路径备用步骤4:进入conf目录,复制一份配置文件,并将其改名为zoo.cfgcdconfcpzoo_sample.cfgzoo.cfg任务实施:一、master上核心文件配置
01步骤5:编辑配置文件zoo.cfg
02vimzoo.cfg
03步骤6:将dataDir路径修改为如下所示
04dataDir=/usr/local/src/zookeeper-3.4.10/zkdata
05步骤7:在zoo.cfg最后加入以下内容
06server.1=master:2888:3888任务实施:一、master上核心文件配置
server.2=hadoop1:2888:3888
server.3=hadoop2:2888:3888
步骤8:进入zkdata目录,创建一个myid的文件
cd/usr/local/src/zookeeper-3.4.10/zkdata
touchmyid
步骤9:编辑myid文件任务实施:一、master上核心文件配置
vimmyid
在文件中添加与server对应的编号:1
步骤10:配置环境变量
vim/etc/profile
在最后输入以下内容
#zookeeper任务实施:一、master上核心文件配置
exportZK_HOME=/usr/local/src/zookeeper-3.4.10
exportPATH=$PATH:${ZK_HOME}/bin
使环境变量生效
source/etc/profile任务实施:二、Zookeeper集群配置
步骤1将master上配置好的zookeeper目录传输到集群其他机器上,在master上面执行如下命令
ZookeeperTransferscp-r/usr/local/src/zookeeper-3.4.10hadoop1:usr/local/src
SCPTransferZookeeperDirectoryscp-r/usr/local/src/zookeeper-3.4.10hadoop2:usr/local/src
步骤2将master上配置好的profile文件传输到集群其他机器上,在master上面执行如下命令
scp-r/etc/profilehadoop1:etc/profile单击此处添加项正文
scp-r/etc/profilehadoop2:etc/profile单击此处添加项正文任务实施:二、Zookeeper集群配置步骤3:配置hadoop1上面的serverid值,在hadoop1上面执行如下命令cd/usr/local/src/zookeeper-3.4.10/zkdatavimmyid在myid里面输入数字2步骤4:使hadoop1上面的修改过的profile文件立即生效,在hadoop1上面执行如下命令source/etc/profile任务实施:二、Zookeeper集群配置
01步骤5:配置hadoop2上面的serverid值,在hadoop2上面执行如下命令
02cd/usr/local/src/zookeeper-3.4.10/zkdata
03vimmyid
04在myid里面输入数字3
05步骤6:使hadoop2上面的修改过的profile文件立即生效,在hadoop2上面执行如下命令任务实施:二、Zookeeper集群配置source/etc/profile任务实施:三、Zookeeper启动步骤1:关闭防火墙。分别在3个节点上执行systemctlstopfirewalldsystemctldisablefirewalld步骤2:关闭SELinux。分别在3个节点上执行setenforce0这里还需要永久关闭SELinux,执行以下命令编辑SELinux配置文件任务实施:三、Zookeeper启动
vim/etc/selinux/config找到SELINUX一行,将其值改为disabledSELINUX=disabled步骤3:启动Zookeeper,分别在3个节点上执行bin/zkServer.shstart注意Zookeeper在大多数节点存活下,才会有效。所以启动第一台的时候,会报错,等三个节点都启动完毕之后,就会正常了任务实施:三、Zookeeper启动
步骤4:查看Zookeeper运行状态,分别在3个节点上执行单击此处添加项正文
bin/zkServer.shstatus单击此处添加项正文
观察节点状态确认启动成功分别观察3个节点,发现状态为follower或者leader中的一种即为启动成功,如图5-1-1所示任务二Zookeeper命令行操作06任务工单任务场景现有3台虚拟机,分别为master、hadoop1、hadoop2,上面搭建了Zookeeper分布式协调服务集群,现在需要使用命令行对节点进行管理维护任务准备全班学生以4人左右为一组,各组选出组长。请组长组织组员查找相关资料,并组织讨论和汇总问题1:永久节点和临时节点有什么区别问题2:什么是监听器必备知识技能:一、ZooKeeper数据结构
ZooKeeper数据模型结构ZooKeeper数据模型的结构与Linux文件系统很类似,整体上可以看作是一棵树,每个节点称作一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识,如图5-2-1
ZooKeeper数据模型解析ZooKeeper的数据模型,在结构上和标准文件系统非常相似,拥有一个层次的命名空间,都是采用树形层次结构,ZooKeeper树中的每个节点被称为ZNode。和文件系统的目录树一样,ZooKeeper树中的每个节点可以拥有子节点。但也有不同之处
ZNode特性与操作1.ZNode兼具文件和目录两种特点,既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分,并可以具有子ZNode。用户对ZNode具有增、删、改、查等操作(权限允许的情况下)
ZNode的原子性操作与ACL权限2.ZNode具有原子性操作,读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作必备知识技能:一、ZooKeeper数据结构
ZNode数据大小限制3.ZNode存储数据大小有限制,ZooKeeper虽然可以关联一些数据,但并没有被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置等等。这些数据的共同特性就是它们都是很小的数据,通常以KB为大小单位。ZooKeeper的服务器和客户端都被设计为严格检查并限制每个ZNode的数据大小至多1MB,但在常规使用中应该远小于此值ZNode路径规则4.ZNode通过路径引用,如同Unix中的文件路径。路径必须是绝对的,因此它们必须由斜杠字符来开头。除此以外,它们必须是唯一的,也就是说每一个路径只有一个表示,因此这些路径不能改变。在ZooKeeper中,路径由Unicode字符串组成,并且有一些限制。字符串"/zookeeper"用以保存管理信息,比如关键配额信息①stat:此为状态信息,描述该ZNode的版本,权限等信息②data:与该ZNode关联的数据③children:该ZNode下的子节点必备知识技能:二、Zookeeper节点类型
ZNode有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变临时节点该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然也可以手动删除。临时节点不允许拥有子节点永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显式执行删除操作的时候,它们才能被删除ZNode顺序节点特性解析ZNode还有一个顺序节点的特性,如果创建的时候指定了顺序模式的话(当然如果不指定默认也是顺序模式),该ZNode的名字后面会自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一的,这样便会记录每个子节点创建的先后顺序。它的格式为“10%d”(10位数字,没有数值的数位用0补充,例如“0000000001”)这样便会存在四种类型的ZNode节点,分别对应必备知识技能:二、Zookeeper节点类型
PERSISTENT:永久节点
EPHEMERAL:临时节点
PERSISTENT_SEQUENTIAL:永久节点、顺序
EPHEMERAL_SEQUENTIAL:临时节点、顺序任务实施:一、基本命令操作步骤1:进入Zookeeper家目录cd/usr/local/src/zookeeper-3.4.10步骤2:在master上面连接本地Zookeeper服务器bin/zkCli.sh-server:2181步骤3:在根目录下面创建一个内容为“bob”名字为tmp的节点create-e/tmp"bob"任务实施:一、基本命令操作
注意一个临时节点会在会话过期或关闭时自动被删除,刚刚我们在命令行创建的这个znode,如果退出连接然后重新连接,会发现节点已经不存在了步骤4:下面使用ls命令查看根目录底下的节点信息ls/上面使用ls命令查看zookeeper根目录节点信息,会发现刚才创建的tmp节点步骤5:在根目录下面创建一个内容为“tim”名字为permanent的永久节点create-s/permanent"tim"任务实施:一、基本命令操作
注意一个永久节点会话过期或关闭时不会自动被删除,如果退出会话然后重新连接,会发现permanent节点依旧存在步骤6:下面使用ls命令查看根目录底下的节点信息ls上面使用ls命令查看zookeeper根目录节点信息,会发现刚才创建的permanent节点步骤7:获取tmp节点内容get/tmp任务实施:一、基本命令操作
上面使用get命令获取/tmp节点内容信息为“bob”
步骤8:修改tmp节点内容为“bob2”
set/tmp“bob2”
步骤9:获取tmp节点内容
get/tmp
上面使用get命令获取tmp节点内容,发现其内容已经由“bob”更新为“bob2”任务实施:一、基本命令操作步骤10:删除/permanent节点delete/permanent注意:要想删除某个节点及其所有后代节点,可以使用递归删除,命令为rmrpath任务实施:二、监听器操作步骤1:给tmp节点设置get监听器单击此处添加项正文get/tmpwatch单击此处添加项正文ZooKeeper监听机制使用getpath[watch]注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是ZooKeeper的触发器是一次性的(One-timetrigger),即触发一次后就会立即失效步骤2:给tmp节点设置stat监听器单击此处添加项正文stat/tmpwatch单击此处添加项正文监控节点状态变化通知使用statpath[watch]注册的监听器能够在节点状态发生改变的时候,向客户端发出通知任务实施:二、监听器操作
步骤3:给tmp节点设置ls监听器ls/tmpwatch监听器注册与子节点变更监听使用lspath[watch]或ls2path[watch]注册的监听器能够监听该节点下所有子节点的增加和删除操作步骤8:给tmp节点设置ls监听器。修改tmp节点内容为“hello”,触发监听set/tmp"hello"任务三ZookeeperJavaAPI操作07任务场景
ZookeeperJavaAPI使用示例现有3台虚拟机,分别为master、hadoop1、hadoop2,上面搭建了Zookeeper分布式协调服务集群,现在需要使用JavaAPI对节点进行管理维护任务准备
全班学生以4人左右为一组,各组选出组长。请组长组织组员查找相关资料,并组织讨论和汇总
问题1:谈谈你对log4j的了解
问题2:什么是maven依赖任务评价01setData-为指定的节点设置数据单击此处添加项正文02getChildren-获取指定节点的所有子节点单击此处添加项正文03delete-删除指定节点以及子节点单击此处添加项正文04close-关闭连接单击此处添加项正文05ZooKeeperAPI同步与异步对比ZooKeeper大部分API都提供了同步和异步方法。同步方法一般会有返回值,并且会抛出相应的异常。异步方法没有返回值,也不会抛出异常。此外,异步方法参数在同步方法参数的基础上,会增加cb和ctx两个参数开发环境
在工程的pom.xml文件中加入下面的依赖<dependency><groupId>org.apache.zookeeper开发环境
</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>连接服务器
构造ZooKeeper类对象的过程就是与ZooKeeper服务器建立连接的过程ZooKeeper通过构造函数连接服务器。构造函数如下所示ZooKeeperConstructorZooKeeper(StringconnectionString,intsessionTimeout,Watcherwatcher)throwsIOExceptionZooKeeper构造函数一共有三个参数connectionString第一个参数,是ZooKeeper服务器地址(可以指定端口,默认端口号为2181)连接服务器
sessionTimeout第二个参数,是以毫秒为单位的会话超时时间。表示ZooKeeper等待客户端通信的最长时间,之后会声明会话结束。例如,我们设置为5000,即5s,这就是说如果ZooKeeper与客户端有5s的时间无法进行通信,ZooKeeper就会终止客户端的会话。ZooKeeper会话一般设置超时时间为5~10s
watcher第三个参数,Watcher对象实例。Watcher对象接收来自ZooKeeper的回调,以获得各种事件的通知。这个对象需要我们自己创建,因为Watcher定义为接口,所以需要我们自己实现一个类,然后初始化这个类的实例并传入ZooKeeper的构造函数中。客户端使用Watcher接口来监控与ZooKeeper之间会话的健康情况,与ZooKeeper服务器之间建立或者断开连接时会产生事件
ZooKeeperConnectionandCountDownLatch下面会创建一个ZooKeeperConnection类并实现一个connect方法。connect方法创建一个ZooKeeper对象,连接到ZooKeeper集群,然后返回该对象。CountDownLatch阻塞主进程,直到客户端连接到ZooKeeper集群连接服务器
ZooKeeper连接状态回调ZooKeeper通过Watcher回调返回连接状态。一旦客户端与ZooKeeper集群连接,Watcher回调函数会被调用,Watcher回调调用CountDownLatch的countDown方法释放锁判断ZNode是否存在
ZooKeeperexists方法介绍ZooKeeper类提供了检查ZNode是否存在的exists方法。如果指定的ZNode存在,则返回ZNode的元数据。exists方法如下所示
//同步方式单击此处添加项正文
StatexistsStatexists(Stringpath,Watcherwatcher)throwsKeeperException,InterruptedException
StatexistsStatexists(Stringpath,booleanwatch)throwsKeeperException,InterruptedException
//异步方式单击此处添加项正文
StatCallbackInvocationvoidexists(Stringpath,Watcherwatcher,StatCallbackcb,Objectctx)判断ZNode是否存在
StatCallbackUsageinPathExistenceCheckvoidexists(Stringpath,booleanwatch,StatCallbackcb,Objectctx)同步exists方法一共有两个参数path:第一个参数是ZNode路径watch或者watcher第二个参数是一个布尔类型的watch或者是一个自定义的Watcher对象。同步模式和异步模式分别有两个方法,第一个方法传递一个新的Watcher对象(我们需要自定义实现)。第二个方法使用默认Watcher,如果开启Watcher只需要将第二个参数设置为true(不需要我们自己实现)。用来监控节点数据变化以及节点的创建和删除异步exists方法参数增加除了同步exists方法中的两个参数以外,异步模式的exists方法还增加了cb和ctx两个参数获取节点数据
01ZooKeepergetData方法介绍ZooKeeper类提供了getData方法来获取指定ZNode中的数据以及状态。getData方法如下所示
02//同步方式单击此处添加项正文
03getDatamethodoverviewbyte[]getData(Stringpath,Watcherwatcher,Statstat)throwsKeeperException,InterruptedException
04getDataMethodDescriptionbyte[]getData(Stringpath,booleanwatch,Statstat)throwsKeeperException,InterruptedException
05//异步方式单击此处添加项正文
06getDataFunctionvoidgetData(Stringpath,Watcherwatcher,DataCallbackcb,Objectctx)获取节点数据
getDataFunctionvoidgetData(Stringpath,booleanwatch,DataCallbackcb,Objectctx)同步getData方法返回值就是节点中存储的数据值,它有三个参数path:第一个参数是节点的路径,用于表示要获取哪个节点中的数据watch或者watcher第二个参数是一个布尔类型的watch或者是一个自定义的Watcher对象。用来监控节点数据变化以及节点是否被删除stat:第三个参数用于存储节点的状态信息异步getData方法参数增加除了同步getData方法中的三个参数以外,异步模式的getData方法还增加了cb和ctx两个参数修改节点的数据内容ZooKeepersetData方法介绍ZooKeeper类提供了setData方法来修改指定ZNode中的数据。setData方法如下所示//同步方法单击此处添加项正文SetDataPathStatsetData(Stringpath,byte[]data,intversion)throwsKeeperException,InterruptedException//异步方法单击此处添加项正文setDataFunctionDescriptionvoidsetData(Stringpath,byte[]data,intversion,StatCallbackcb,Objectctx)同步setData方法有三个参数单击此处添加项正文修改节点的数据内容
path:第一个参数是节点的路径单击此处添加项正文
data:第二个参数是修改的数据值单击此处添加项正文
version最后一个参数当前ZNode版本。每当数据发生变化时,ZooKeeper都会更新ZNode的版本号
异步setData参数详解除了同步setData方法中的三个参数以外,异步模式的setData方法还增加了cb和ctx两个参数
ZooKeepergetChildren方法介绍ZooKeeper类提供getChildren方法来获取指定ZNode下的所有子节点。getChildren方法如下所示
//同步方式单击此处添加项正文修改节点的数据内容GetChildrenNodes
List<String>getChildren(Stringpath,Watcherwatcher)throwsKeeperException,InterruptedExceptionGetChildrenNodes
List<String>getChildren(Stringpath,booleanwatch)throwsKeeperException,InterruptedException//异步方式
单击此处添加项正文GetChildrenCallback
voidgetChildren(Stringpath,Watcherwatcher,ChildrenCallbackcb,Objectctx)getChildrenfunction
voidgetChildren(Stringpath,booleanwatch,Children2Callbackcb,Objectctx)同步getChildren方法有两个参数
单击此处添加项正文修改节点的数据内容
path:第一个参数是节点路径单击此处添加项正文
watch或者watcher第二个参数是一个布尔类型的watch或者是一个自定义的Watcher对象。用来监控节点数据变化以及节点是否被删除。用于监控节点的删除以及子节点的创建与删除操作
getChildren方法参数增加除了同步getChildren方法中的三个两个以外,异步模式的getChildren方法还增加了cb和ctx两个参数删除节点01ZooKeeperdelete方法ZooKeeper类提供了delete方法来删除指定的ZNode。delete方法如下所示02//同步方式单击此处添加项正文03voiddeletevoiddelete(Stringpath,intversion)throwsInterruptedException,KeeperException04//异步方式单击此处添加项正文05VoidDeleteFunctionvoiddelete(Stringpath,intversion,VoidCallbackcb,Objectctx)删除节点
同步delete方法有两个参数单击此处添加项正文
path:第一个参数是节点路径单击此处添加项正文
version最后一个参数是当前ZNode版本。每当数据发生变化时,ZooKeeper都会更新ZNode的版本号
异步delete方法参数增加除了同步delete方法中的两个参数以外,异步模式的delete方法还增加了cb和ctx两个参数任务实施准备环境
步骤1:启动Zookeeper,分别在3个节点上执行bin/zkServer.shstart注意Zookeeper在大多数节点存活下,才会有效。所以启动第一台的时候,会报错,等三个节点都启动完毕之后,就会正常了步骤2:查看Zookeeper运行状态,分别在3台节点上执行bin/zkServer.shstatus步骤3打开Idea,新建一个maven项目demo,新建一个包,包名为com.jsck.zookeeper准备环境步骤4:添加zookeeper依赖,在pom.xml文件中添加以下代码<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId>准备环境
<version>3.4.10</version>单击此处添加项正文
</dependency>单击此处添加项正文
步骤5在resources目录下新建一个日志文件,名为perties,在里面输入以下内容
log4j.rootLogger=INFO,stdout单击此处添加项正文
Log4jConsoleAppenderConfigurationlog4j.appender.stdout=org.apache.log4j.ConsoleAppender
Log4jAppenderConfigurationlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout准备环境单击此处添加正文
Log4jLayoutPatternlog4j.appender.stdout.layout.ConversionPattern=%d%p[%c]-%m%nLog4jFileAppenderConfigurationlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/spring.log单击此处添加项正文Log4jLayoutConfigurationlog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutLog4jLayoutConfigurationlog4j.appender.logfile.layout.ConversionPattern=%d%p[%c]-%m%n节点操作
步骤1创建永久节点mydir。在src-java下面创建包cn.jsck.zookeeper,在该包下新建java文件CreateNode.java,在main函数里面输入如下代码//创建zookeeper客户端ZookeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"//参数1:zk服务地址;参数2:会话超过时间;参数3:监视器ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)//参数1:创建节点路径和名称;参数2:节点数据内容;参数3:节点权限;参数4:节点类型节点操作
ZookeeperNodeCreationzk.create("/mydir","mycontent".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT)
//关闭zk连接单击此处添加项正文
zk.close()单击此处添加项正文
注意如果没有配置windows/etc/hosts文件,也就是没有配置master、hadoop1、hadoop2主机名和ip地址的映射关系,那么上面的master、hadoop1、hadoop2需要改成对应的ip地址
步骤2获取节点mydir的数据。在包cn.jsck.zookeeper下新建java文件GetNode.java,在main函数里面输入如下代码
//创建zookeeper客户端单击此处添加项正文节点操作单击此处添加正文ZookeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)//参数1:节点路径单击此处添加项正文DataRetrievalCodeStringmydirdata=newString(zk.getData("/mydir",false,null))System.out.println("mydir内容为:"+mydirdata)单击此处添加项正文//关闭zk连接单击此处添加项正文节点操作
zk.close()步骤3修改节点mydir的数据。在包cn.jsck.zookeeper下新建java文件ModifyNode.java,在main函数里面输入如下代码//创建zookeeper客户端ZooKeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"//参数1:zk服务地址;参数2:会话超过时间;参数3:监视器ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)节点操作
//修改节点数据。参数1:节点路径名;参数2:节点修改后的数据修改节点数据zk.setData("/mydir","modifynodedata".getBytes(),-1)DataRetrievalExampleStringmydirdata1=newString(zk.getData("/mydir",false,null))System.out.println("修改节点mydir后的内容为:"+mydirdata1)步骤4删除节点mydir。在包cn.jsck.zookeeper下新建java文件DeleteNode.java,在main函数里面输入如下代码//创建zookeeper客户端节点操作单击此处添加正文
ZookeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"//参数1:zk服务地址;参数2:会话超过时间;参数3:监视器单击此处添加项正文ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)//删除目录节点单击此处添加项正文zk.delete("/mydir",-1)单击此处添加项正文节点操作
//关闭zk连接
zk.close()项目总结08项目总结Zookeeper演示项目本项目主要演示了Zookeeper分布式协调服务安装、命令行操作、JavaAPI操作。项目、任务里面穿插了相关的理论知识项目考核09填空题
Zookeeper集群角色1.Zookeeper集群主要有、、三种角色
ZNode有两种类型节点,分别是、单击此处添加项正文判断题
zookeeper是分布式的。()
Zookeeper集群宕机数超过集群数一半,则Zookeeper服务失效。()
Zookeeper对节点的Watch监听通知是永久性的。()选择题
下列哪些操作可以触发监听器Watcher
A.getDataB.getChildrenC.existsD.setData
下面与Zookeeper类似的框架是?()
AProtobufB.JavaC.KafkaD.ChubbyTHEEND谢谢项目六Hadoop高可用集群搭建CONTENTS目录01
项目导读02
知识目标03
技能目标04
素质(思政)目标CONTENTS目录05
任务一Linux、Java、Zookeeper配置06
任务二HadoopHA配置07
项目总结08
项目考核项目导读01项目导读Hadoop高可用性HA在Hadoop2.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个集群只有一个NameNode,如果该计算机或进程不可用,则整个集群将不可用,直到NameNode重新启动或在单独的计算机上启动,Yarn也有类似问题。Hadoop高可用性HA(HighAvailability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。Hadoop高可用(HighAvailability)分为HDFS高可用和YARN高可用,两者的实现基本类似知识目标02知识目标
了解密钥公钥
了解HA产生的背景
熟悉HA原理
熟悉HDFSHA架构图
熟悉YarnHA架构图技能目标03技能目标
掌握HadoopHA集群规划
掌握JDK安装
掌握SSH免密登录
掌握HadoopHA集群配置
掌握HadoopHA集群启动和关闭素质(思政)目标04素质(思政)目标
培养严谨细致的工匠精神
厚植技术报国梦
培养不骄不躁的工匠心态
培养保密意识
培养网络安全意识任务一Linux、Java、Zookeeper配置05任务工单任务描述
在做Hadoop高可用配置之前,须先做一些铺垫,配置Linux环境、JDK环境、zookeeper环境任务工单:任务准备
01全班学生以4人左右为一组,各组选出组长。请组长组织组员查找相关资料,并组织讨论和汇总
02问题1:Linux的hosts文件有什么作用?如何配置
03问题2:Linux环境变量配置文件在哪?如何配置
04问题3:什么是SSH免密登录
05问题4:Zookeeper有什么作用必备知识技能:一、ZooKeeper在HadoopHA中的作用
ZooKeeper在分布式系统中的应用ZooKeeper能解决大多数分布式系统中的问题,如可以通过创建临时节点来建立心跳监测机制。如果分布式系统的某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发。分布式系统的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报。通过数据的订阅和发布功能,ZooKeeper还能对分布式系统进行模块的解耦和任务的调度。通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而实现服务的动态扩容必备知识技能:二、OpenJDK与JDK比较开放性OpenJDK是一个开放源代码的Java开发工具包,由Oracle公司主导并以GPL许可证发布。它的源代码是公开可用的,任何人都可以查看、修改和分发。而JDK(JavaDevelopmentKit)是Oracle公司提供的Java开发工具包,它不是开源的,源代码不公开许可证OpenJDK使用GPL许可证,这意味着使用OpenJDK开发的软件必须遵守GPL的规定,包括将源代码公开并保持开源。而JDK使用OracleBinaryCodeLicense许可证,这意味着使用JDK开发的软件不需要公开源代码,但需要遵守许可证的其他规定OpenJDK与JDK对比除了这些主要区别外,OpenJDK和JDK在功能上基本上是相同的,都提供了Java编译器(javac)、Java虚拟机(JVM)和Java标准库等开发工具和运行时环境。这两个工具包都可以用于开发和运行Java应用程序,只是在许可证和开放性上有所不同必备知识技能:三、HadoopHA存在的背景
HDFSHA解决方案Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF),对于只有一个NameNode的集群,若NameNode出现故障,则整个集群将无法使用,直到NameNode重启。NameNode主要在以下两个方面影响集群:NameNode机器出现意外,如宕机,集群将无法使用,直到管理员重启。NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。HDFSHA功能通过Active/Standby两个NameNodes实现集群中对NameNode的热备来解决上述问题。如出现故障,此时NameNode很快切换到另外一台机器上任务实施:一、Linux配置步骤1:修改主机名。切换到root,分别在3台虚拟机上执行如下命令hostnamectlset-hostnamemasterhostnamectlset-hostnamehadoop1hostnamectlset-hostnamehadoop2步骤2:修改hosts文件,分别在3台虚拟机上编辑hosts文件,命令为vim/etc/hosts任务实施:一、Linux配置
hosts文件内容为
0master
hadoop1
hadoop2任务实施:二、SSH免密登录配置
三虚拟机互免密登录配置在主机名为master、hadoop1、hadoop2的虚拟机上面配置,实现3台虚拟机之间两两互相免密登录步骤1:所有虚拟机。清空原来的。ssh文件,并给每台机器创建公钥和密钥以及自我免密登录SSHKeyGenerationcd/root;rm-rfhd?.pub;rm-rf.ssh;ssh-keygen-trsaSSHKeySetupcd.ssh;catid_rsa.pub>>authorized_keys;chmod600*步骤2:master上操作。把master的公钥分发给hadoop1和hadoop2scpid_rsa.pubhadoop1:root/hd1.pub任务实施:二、SSH免密登录配置scpid_rsa.pubhadoop2:root/hd1.pub步骤3:hadoop1上操作。把hadoop1的公钥分发给master和hadoop2scpid_rsa.pubmaster:root/hd2.pubscpid_rsa.pubhadoop2:root/hd2.pub步骤4:hadoop2上操作。把hadoop2的公钥分发给master和hadoop1scpid_rsa.pubmaster:root/hd3.pub任务实施:二、SSH免密登录配置
scpid_rsa.pubhadoop1:root/hd3.pub单击此处添加项正文
步骤5master上操作。追加hd2.pub、hd3.pub到master的authorized_keys文件里
cat/root/hd2.pub>authorized_keys单击此处添加项正文
cat/root/hd3.pub>authorized_keys单击此处添加项正文
步骤6hadoop1上操作。追加hd1.pub、hd3.pub到hadoop1的authorized_keys文件里
cat/root/hd1.pub>authorized_keys单击此处添加项正文任务实施:二、SSH免密登录配置
cat/root/hd3.pub>authorized_keys单击此处添加项正文
步骤7hadoop2上操作。追加hd1.pub、hd2.pub到hadoop2的authorized_keys文件里
cat/root/hd1.pub>authorized_keys单击此处添加项正文
cat/root/hd2.pub>authorized_keys单击此处添加项正文
步骤8:验证免密登录成功单击此处添加项正文
master上操作单击此处添加项正文任务实施:二、SSH免密登录配置
sshhadoop1;hostname;exit
sshhadoop2;hostname;exit
hadoop1上操作
sshmaster;hostname;exit
sshhadoop2;hostname;exit任务实施:二、SSH免密登录配置hadoop2上操作sshmaster;hostname;exitsshhadoop2;hostname;exit任务实施:三、JDK配置(3台虚拟机上都做一遍)
配置JDK在LinuxLinux上一般会安装OpenJDK,配置JDK之前先卸载掉OpenJDK,卸载以后再安装相应版本的JDK,并配置环境变量步骤1卸载系统自带的OpenJDK以及相关的java文件。在终端命令窗口键入:java-version可以看到系统自带的OpenJDK版本信息,如图6-1-1步骤2:查看OpenJDK自带Java文件在终端命令窗口键入rpm-qa|grepjava可以看到系统自带的OpenJDKJava相关文件,如图6-1-2任务实施:三、JDK配置(3台虚拟机上都做一遍)
上图文件中,下面这几个可以删除JavaOpenJDK02java-1.8.0-openjdk-headless-02-4.b14.el7.x86_64java-1.7.0-openjdk-11-.el7.x86_64java-1.8.0-openjdk-02-4.b14.el7.x86_64JavaOpenJDK1.7.0Update111java-1.7.0-openjdk-headless-11-.el7.x86_64noarch文件可以不用删除任务实施:三、JDK配置(3台虚拟机上都做一遍)
python-javapackages-3.4.1-11.el7.noarchtzdata-java-2016g-2.el7.noarchjavapackages-tools-3.4.1-11.el7.noarch步骤3:删除OpenJDK自带Java文件,在终端命令窗口键入UninstallJavaOpenJDKrpm-e--nodepsjava-1.7.0-openjdk-11-.el7.x86_64卸载OpenJDK1.8rpm-e--nodepsjava-1.8.0-openjdk-02-4.b14.el7.x86_64任务实施:三、JDK配置(3台虚拟机上都做一遍)
卸载Java1.8rpm-e--nodepsjava-1.8.0-openjdk-headless-02-4.b14.el7.x86_64UninstallJavaOpenJDKrpm-e--nodepsjava-1.7.0-openjdk-headless-11-.el7.x86_64步骤4:检查是否已经删除成功,在命令窗口键入java-version如图6-1-3所示,代表Linux系统自带的OpenJDK已经删除成功了注:如果还没有删除,则用yum-yremove去删除他们任务实施:三、JDK配置(3台虚拟机上都做一遍)
步骤5拷贝JDK,把事先下载好的JDK安装包用拖拽的方式,拷贝进/usr/local/src目录下(安装的JDK版本和IDEA里面的配置一样,因为IDEA自带JDK11)步骤6:解压JDK,把事先下载好的JDK安装包用拖拽的方式,在命令窗口键入tar-zxvfjdk-8u144-linux-x64.tar.gz步骤7:删除JDK压缩包,在命令行键入rm-rfjdk-8u144-linux-x64.tar.gz至此,usr/local/src目录下就有一个JDK的目录任务实施:三、JDK配置(3台虚拟机上都做一遍)
步骤8:配置JDK环境变量,在命令行键入vim/etc/profile粘贴内容至文档末尾进入文本编辑状态下,光标走到文件最后一行,键盘按下字母i,进入插入状态,在文本的最后一行粘贴如下内容#javaenvironmentexportJAVA_HOME=/usr/local/src/jdk1.8.0_221SettingJavaClasspathexportCLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar任务实施:三、JDK配置(3台虚拟机上都做一遍)单击此处添加正文
exportPATH=$PATH:${JAVA_HOME}/bin
步骤9:让刚刚设置的环境变量生效,在命令行键入
source/etc/profile
步骤10:检查java是否配置成功,在命令行键入任务实施:三、JDK配置(3台虚拟机上都做一遍)
命令执行结果如图6-1-4,即为java配置成功任务实施:四、Zookeeper配置
确保3台虚拟机上的Zookeeper安装配置成功,分别在3台虚拟机上启动Zookeeper步骤1:该步骤3台机器上均操作。进入Zookeeper家目录,在命令窗口键入bin/zkServer.shstart;bin/zkServer.shstatusZookeeper启动流程解析Zookeeper在大多数节点存活下才会有效。所以启动第一台的时候,会报错,等三个节点都启动完毕之后,就会正常了。正常启动如图6-1-5任务二HadoopHA配置06任务工单:任务描述
HDFS和Yarn高可用配置目前3台虚拟机上的Linux、JDK、zookeeper环境已经配置好了,现在我们需要实现HDFS和yarn的高可用,HDFSNamenode节点备份,yarn的ResourceManager节点备份任务工单:任务准备01全班学生以4人左右为一组,各组选出组长。请组长组织组员查找相关资料,并组织讨论和汇总02问题1:什么是高可用03问题2:HDFSHA实现有什么思路04问题3:YarnHA实现有什么思路05问题4:如果3台虚拟机里面的1台宕机,Hadoop集群是否能正常提供服务必备知识技能:一、基于QJM的HAHadoopQJMHA方案解析Hadoop2.x之后,Cloudera提出了QJM(QuorumJournalManager)的HA方案。这是一个基于Paxos算法(分布式一致性算法)实现的HDFSHA方案,主要优势如下:不需要配置额外的高性能共享存储,降低了系统复杂度和维护成本。消除SPOF(单点故障),系统鲁棒性(Robust)的程度可配置、可扩展。基本原理:使用2N+1台JournalNode存储EditLog,每次写数据操作有〉=N+1返回成功时即认为该次写成功,保证数据不会丢失高可用方案NN状态说明如图6-2-1,高可用方案中NN有〉=2个,只有一个是Active状态,表示正在对外提供服务的,是活跃的NN,其他的NN是StandBy状态,不对外提供服务的,随时准备替换ActiveNNJournalNode(JN)高效的存储系统,能够实现数据的超快速写入与读取。JN是一个小的文件系统集群,节点数需要是2N+1台。当ActiveNN执行任何命名空间修改时,它会持续地将修改记录到大多数这些JN上。StandByNN实时读取JN内部的数据,实现两个节点的实时元数据同步。JournalNode需要配置hdfs-site.xml里面的node.shared.edits.dir和dfs.journalnode.edits.dir这两个参数。配置示例如下必备知识技能:一、基于QJM的HA
<property>QJournalConfiguration<name>node.shared.edits.dir</name><value>qjournal://:8485;:8485;:8485/mycluster</value></property><property><name>dfs.journalnode.edits.dir</name><value>path/to/journal/node/local/data</value>必备知识技能:一、基于QJM的HA</property>单击此处添加项正文JournalNodes集群同步机制node.shared.edits.dir:JournalNodes地址,由JournalNodes集群提供共享的编辑存储,由ActiveNN写入,由StandbyNN读取,以保持与ActiveNN所做的所有文件系统更改同步JournalNode状态路径配置dfs.journalnode.edits.dir:JournalNode守护进程存储本地状态的路径。JournalNode机器上的绝对路径且只能配置一个路径必备知识技能:二、基于共享NFS的HA
与QJM的区别是使用高性能共享存储HDFS的元数据,但只有ActiveNN才能写,StandbyNN只能读。配置如下远程共享编辑目录设置node.shared.edits.dir:远程共享编辑目录的路径,备用NN使用同一个目录,以保持与ActiveNN所做的所有文件系统更改同步。这个目录应该以r/w的方式挂载在NN机器上,且需要配置为绝对路径<property><name>node.shared.edits.dir</name><value>filemnt/filer1/dfs/ha-name-dir-shared</value></property>必备知识技能:三、HDFSHA自动切换
01HDFSHA自动切换HA自动切换NN,需要增加两个新的组件:ZooKeeper集群和ZKFailoverController进程(简称ZKFC)。集群启动〉=2个NN,每个NN都会有一个ZKFC,每个ZKFC到ZooKeeper上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冲床模具生产管理制度
- 鱼船安全生产管理制度
- 生产插单计划管理制度
- 畜牧安全生产培训制度
- 安全生产班前提醒制度
- 2026上半年云南事业单位联考旅游职业学院招聘14人备考考试试题附答案解析
- 安全生产动态监管制度
- 2026上海市中医医院新职工招聘183人(第一批)备考考试题库附答案解析
- 双汇冷鲜肉生产规章制度
- 生产技术交底制度
- 专题08解题技巧专题:圆中辅助线的作法压轴题三种模型全攻略(原卷版+解析)
- 2024年全国职业院校技能大赛(节水系统安装与维护赛项)考试题库(含答案)
- 24秋人教版英语七上单词表(Vocabulary in Each Unit)总表
- ISO 15609-1 2019 金属材料焊接工艺规程和评定-焊接工艺规程-电弧焊(中文版)
- 肥胖患者麻醉管理
- 小鲤鱼跳龙门电子版
- 2019年急性脑梗死出血转化专家共识解读
- 《混凝土结构工程施工规范》
- 土地证延期申请书
- 硫乙醇酸盐流体培养基适用性检查记录
- 进阶切分技法advanced funk studies rick latham-蓝色加粗字
评论
0/150
提交评论