版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目五Zookeeper分布式協(xié)調(diào)服務(wù)操作CONTENTS目錄01
項(xiàng)目導(dǎo)讀02
知識(shí)目標(biāo)03
技能目標(biāo)04
素質(zhì)(思政)目標(biāo)05
任務(wù)一Zookeeper分布式集群安裝部署CONTENTS目錄06
任務(wù)二Zookeeper命令行操作07
任務(wù)三ZookeeperJavaAPI操作08
項(xiàng)目總結(jié)09
項(xiàng)目考核項(xiàng)目導(dǎo)讀01項(xiàng)目導(dǎo)讀
部署Zookeeper集群為了防止高可用平臺(tái)單點(diǎn)故障實(shí)現(xiàn),同時(shí)實(shí)現(xiàn)集群之間數(shù)據(jù)同步,現(xiàn)在需要搭建部署Zookeeper分布式協(xié)調(diào)服務(wù)集群知識(shí)目標(biāo)02知識(shí)目標(biāo)
了解Zookeeper特點(diǎn)、機(jī)制
熟悉Zookeeper應(yīng)用場景
熟悉Zookeeper選舉機(jī)制
熟悉Zookeeper數(shù)據(jù)結(jié)構(gòu)
熟悉Zookeeper節(jié)點(diǎn)類型
ZooKeeperAPI常用類技能目標(biāo)03技能目標(biāo)
掌握ZooKeeper安裝
掌握ZooKeeper命令行操作
掌握ZooKeeperJavaAPI操作素質(zhì)(思政)目標(biāo)04素質(zhì)(思政)目標(biāo)培養(yǎng)嚴(yán)謹(jǐn)細(xì)致的工匠精神厚植技術(shù)報(bào)國夢培養(yǎng)不驕不躁的工匠心態(tài)任務(wù)一Zookeeper分布式集群安裝部署05任務(wù)工單
任務(wù)場景現(xiàn)有3臺(tái)虛擬機(jī),分別為master、hadoop1、hadoop2,需要在上面搭建高可用,為了防止高可用平臺(tái)單點(diǎn)故障實(shí)現(xiàn)集群之間數(shù)據(jù)同步,現(xiàn)在需要搭建部署Zookeeper分布式協(xié)調(diào)服務(wù)集群
任務(wù)準(zhǔn)備全班學(xué)生以4人左右為一組,各組選出組長。請組長組織組員查找相關(guān)資料,并組織討論和匯總問題1:單點(diǎn)故障是什么問題2:selinux有什么作用必備知識(shí)技能:一、Zookeeper簡介
Zookeeper:分布式協(xié)調(diào)服務(wù)Zookeeper是一個(gè)開源的分布式協(xié)調(diào)服務(wù),主要為了解決分布式架構(gòu)下數(shù)據(jù)一致性問題,它是集群的管理者,監(jiān)視著集群中各個(gè)節(jié)點(diǎn)的狀態(tài),根據(jù)節(jié)點(diǎn)提交的反饋進(jìn)行下一步合理操作。最終,將簡單易用的接口和高性能、功能穩(wěn)定的系統(tǒng)提供給用戶必備知識(shí)技能:二、Zookeeper工作機(jī)制Zookeeper:文件系統(tǒng)+通知機(jī)制
Zookeeper從設(shè)計(jì)模式角度來理解:是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架,它負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就將負(fù)責(zé)通知已經(jīng)在Zookeeper上注冊的那些觀察者做出相應(yīng)的反應(yīng)。也就是說,Zookeeper=文件系統(tǒng)+通知機(jī)制必備知識(shí)技能:三、Zookeeper特點(diǎn)
Zookeeper:一個(gè)領(lǐng)導(dǎo)者(Leader),多個(gè)跟隨者(Follower)組成的集群Zookeeper奇數(shù)節(jié)點(diǎn)優(yōu)勢2.Zookeeper集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。所以Zookeeper適合安裝奇數(shù)臺(tái)服務(wù)器全局?jǐn)?shù)據(jù)一致每個(gè)Server保存一份相同的數(shù)據(jù)副本,Client無論連接到哪個(gè)Server,數(shù)據(jù)都是一致的更新請求順序執(zhí)行,來自同一個(gè)Client的更新請求按其發(fā)送順序依次執(zhí)行,即先進(jìn)先出數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗實(shí)時(shí)性,在一定時(shí)間范圍內(nèi),Client能讀到最新數(shù)據(jù)必備知識(shí)技能:四、Zookeeper應(yīng)用場景01數(shù)據(jù)發(fā)布/訂閱數(shù)據(jù)發(fā)布/訂閱系統(tǒng),需要發(fā)布者將數(shù)據(jù)發(fā)布到Zookeeper的節(jié)點(diǎn)上,供訂閱者進(jìn)行數(shù)據(jù)訂閱,進(jìn)而達(dá)到動(dòng)態(tài)獲取數(shù)據(jù)的目的,實(shí)現(xiàn)配置信息的集中式管理和數(shù)據(jù)的動(dòng)態(tài)更新發(fā)布/訂閱一般有兩種設(shè)計(jì)模式:推模式和拉模式,服務(wù)端主動(dòng)將數(shù)據(jù)更新發(fā)送給所有訂閱的客戶端稱為推模式;客戶端主動(dòng)請求獲取最新數(shù)據(jù)稱為拉模式Zookeeper采用了推拉相結(jié)合的模式,客戶端向服務(wù)端注冊自己需要關(guān)注的節(jié)點(diǎn),一旦該節(jié)點(diǎn)數(shù)據(jù)發(fā)生變更,那么服務(wù)端就會(huì)向相應(yīng)的客戶端推送Watcher事件通知,客戶端接收到此通知后,主動(dòng)到服務(wù)端獲取最新的數(shù)據(jù)02命名服務(wù)命名服務(wù)是分布式系統(tǒng)中較為常見的一類場景,分布式系統(tǒng)中,被命名的實(shí)體通??梢允羌褐械臋C(jī)器、提供的服務(wù)地址或遠(yuǎn)程對象等,通過命名服務(wù),客戶端可以根據(jù)指定名字來獲取資源的實(shí)體,在分布式環(huán)境中,上層應(yīng)用僅僅需要一個(gè)全局唯一的名字,Zookeeper可以實(shí)現(xiàn)一套分布式全局唯一ID的分配機(jī)制。通過調(diào)用Zookeeper節(jié)點(diǎn)創(chuàng)建的API接口就可以創(chuàng)建一個(gè)順序節(jié)點(diǎn),并且在API返回值中會(huì)返回這個(gè)節(jié)點(diǎn)的完整名字,利用此特性,可以生成全局ID,其步驟如下(1)客戶端根據(jù)任務(wù)類型,在指定類型的任務(wù)下通過調(diào)用接口創(chuàng)建一個(gè)順序節(jié)點(diǎn),如"job-"(2)創(chuàng)建完成后,會(huì)返回一個(gè)完整的節(jié)點(diǎn)名,如"job-00000001"(3)客戶端拼接type和返回值后,就可以作為全局唯一ID了,如"type2-job-00000001"必備知識(shí)技能:四、Zookeeper應(yīng)用場景分布式協(xié)調(diào)/通知Zookeeper中特有的Watcher注冊與異步通知機(jī)制,能夠很好地實(shí)現(xiàn)分布式環(huán)境下不同機(jī)器,甚至不同系統(tǒng)之間的協(xié)調(diào)與通知,從而實(shí)現(xiàn)對數(shù)據(jù)變更的實(shí)時(shí)處理。通常的做法是不同的客戶端都對Zookeeper上的同一個(gè)數(shù)據(jù)節(jié)點(diǎn)進(jìn)行Watcher注冊,監(jiān)聽數(shù)據(jù)節(jié)點(diǎn)的變化(包括節(jié)點(diǎn)本身和子節(jié)點(diǎn)),若數(shù)據(jù)節(jié)點(diǎn)發(fā)生變化,那么所有訂閱的客戶端都能夠接收到相應(yīng)的Watcher通知,并做出相應(yīng)處理。在絕大多數(shù)分布式系統(tǒng)中,系統(tǒng)機(jī)器間的通信無外乎心跳檢測、工作進(jìn)度匯報(bào)和系統(tǒng)調(diào)度必備知識(shí)技能:四、Zookeeper應(yīng)用場景3.分布式協(xié)調(diào)/通知
心跳檢測不同機(jī)器間需要檢測到彼此是否在正常運(yùn)行,可以使用Zookeeper實(shí)現(xiàn)機(jī)器間的心跳檢測,基于其臨時(shí)節(jié)點(diǎn)特性(臨時(shí)節(jié)點(diǎn)的生存周期是客戶端會(huì)話,客戶端會(huì)話結(jié)束以后,其臨時(shí)節(jié)點(diǎn)將不再存在),可以讓不同機(jī)器都在Zookeeper的一個(gè)指定節(jié)點(diǎn)下創(chuàng)建臨時(shí)子節(jié)點(diǎn),不同的機(jī)器之間可以根據(jù)這個(gè)臨時(shí)子節(jié)點(diǎn)來判斷對應(yīng)的客戶端機(jī)器是否存活。通過Zookeeper可以大大減少系統(tǒng)耦合工作進(jìn)度匯報(bào)通常任務(wù)被分發(fā)到不同機(jī)器后,需要實(shí)時(shí)地將自己的任務(wù)執(zhí)行進(jìn)度匯報(bào)給分發(fā)系統(tǒng),可以在Zookeeper上選擇一個(gè)節(jié)點(diǎn),每個(gè)任務(wù)客戶端都在這個(gè)節(jié)點(diǎn)下面創(chuàng)建臨時(shí)子節(jié)點(diǎn),這樣不僅可以判斷機(jī)器是否存活,同時(shí)各個(gè)機(jī)器可以將自己的任務(wù)執(zhí)行進(jìn)度寫到該臨時(shí)節(jié)點(diǎn)中去,以便中心系統(tǒng)能夠?qū)崟r(shí)獲取任務(wù)的執(zhí)行進(jìn)度系統(tǒng)調(diào)度Zookeeper能夠?qū)崿F(xiàn)如下系統(tǒng)調(diào)度模式:分布式系統(tǒng)由控制臺(tái)和一些客戶端系統(tǒng)兩部分構(gòu)成,控制臺(tái)的職責(zé)就是需要將一些指令信息發(fā)送給所有的客戶端,以控制他們進(jìn)行相應(yīng)的業(yè)務(wù)邏輯,后臺(tái)管理人員在控制臺(tái)上做一些操作,實(shí)際上就是修改Zookeeper上某些節(jié)點(diǎn)的數(shù)據(jù),Zookeeper可以把數(shù)據(jù)變更以事件通知的形式發(fā)送給訂閱客戶端必備知識(shí)技能:四、Zookeeper應(yīng)用場景
分布式鎖
分布式鎖用于控制分布式系統(tǒng)之間同步訪問共享資源的一種方式,可以保證不同系統(tǒng)訪問一個(gè)或一組資源時(shí)的一致性,主要分為排他鎖和共享鎖。排他鎖又稱為寫鎖或獨(dú)占鎖,若事務(wù)T1對數(shù)據(jù)對象O1加上了排他鎖,那么在整個(gè)加鎖期間,只允許事務(wù)T1對O1進(jìn)行讀取和更新操作,其他任何事務(wù)都不能再對這個(gè)數(shù)據(jù)對象進(jìn)行任何類型的操作,直到T1釋放了排他鎖
①獲取鎖,在需要獲取排他鎖時(shí),所有客戶端通過調(diào)用接口,在/exclusive_lock節(jié)點(diǎn)下創(chuàng)建臨時(shí)子節(jié)點(diǎn)/exclusive_lock/lock。Zookeeper可以保證只有一個(gè)客戶端能夠創(chuàng)建成功,沒有成功的客戶端需要注冊/exclusive_lock節(jié)點(diǎn)監(jiān)聽
②釋放鎖,當(dāng)獲取鎖的客戶端宕機(jī)或者正常完成業(yè)務(wù)邏輯都會(huì)導(dǎo)致臨時(shí)節(jié)點(diǎn)的刪除,此時(shí),所有在/exclusive_lock節(jié)點(diǎn)上注冊監(jiān)聽的客戶端都會(huì)收到通知,可以重新發(fā)起分布式鎖獲取
共享鎖又稱為讀鎖,若事務(wù)T1對數(shù)據(jù)對象O1加上共享鎖,那么當(dāng)前事務(wù)只能對O1進(jìn)行讀取操作,其他事務(wù)也只能對這個(gè)數(shù)據(jù)對象加共享鎖,直到該數(shù)據(jù)對象上的所有共享鎖都被釋放。在需要獲取共享鎖時(shí),所有客戶端都會(huì)到/shared_lock下面創(chuàng)建一個(gè)臨時(shí)順序節(jié)點(diǎn)必備知識(shí)技能:四、Zookeeper應(yīng)用場景
分布式隊(duì)列
有一些時(shí)候,多個(gè)團(tuán)隊(duì)需要共同完成一個(gè)任務(wù),比如,A團(tuán)隊(duì)將Hadoop集群計(jì)算的結(jié)果交給B團(tuán)隊(duì)繼續(xù)計(jì)算,B完成了自己的任務(wù)再交給C團(tuán)隊(duì)繼續(xù)做。這就有點(diǎn)像業(yè)務(wù)系統(tǒng)的工作流一樣,一環(huán)一環(huán)地傳下去
分布式環(huán)境下,我們同樣需要一個(gè)類似單進(jìn)程隊(duì)列的組件,用來實(shí)現(xiàn)跨進(jìn)程、跨主機(jī)、跨網(wǎng)絡(luò)的數(shù)據(jù)共享和數(shù)據(jù)傳遞,這就是我們的分布式隊(duì)列必備知識(shí)技能:五、Zookeeper選舉機(jī)制
Zookeeper選舉機(jī)制Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在。當(dāng)Zookeeper集群中的一臺(tái)服務(wù)器出現(xiàn)以下兩種情況之一時(shí),需要進(jìn)入Leader選舉必備知識(shí)技能:五、Zookeeper選舉機(jī)制
服務(wù)器啟動(dòng)時(shí)期的Leader選舉若進(jìn)行Leader選舉,則至少需要兩臺(tái)機(jī)器,這里選取3臺(tái)機(jī)器組成的服務(wù)器集群為例。在集群初始化階段,當(dāng)有一臺(tái)服務(wù)器Server1啟動(dòng)時(shí),其單獨(dú)無法進(jìn)行和完成Leader選舉,當(dāng)?shù)诙_(tái)服務(wù)器Server2啟動(dòng)時(shí),此時(shí)兩臺(tái)機(jī)器可以相互通信,每臺(tái)機(jī)器都試圖找到Leader,于是進(jìn)入Leader選舉過程。選舉過程如下(1)每個(gè)Server發(fā)出一個(gè)投票。由于是初始情況,Server1和Server2都會(huì)將自己作為Leader服務(wù)器來進(jìn)行投票,每次投票會(huì)包含所推舉的服務(wù)器的myid和ZXID,使用(myid,ZXID)來表示,此時(shí)Server1的投票為(1,0),Server2的投票為(2,0),然后各自將這個(gè)投票發(fā)給集群中其他機(jī)器(2)接受來自各個(gè)服務(wù)器的投票。集群的每個(gè)服務(wù)器收到投票后,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務(wù)器(3)處理投票。針對每一個(gè)投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行PK,PK規(guī)則如下:優(yōu)先檢查ZXID。ZXID比較大的服務(wù)器優(yōu)先作為Leader,如果ZXID相同,那么就比較myid,myid較大的服務(wù)器作為Leader服務(wù)器。對于Server1而言,它的投票是(1,0),接收Server2的投票為(2,0),首先會(huì)比較兩者的ZXID,均為0,再比較myid,此時(shí)Server2的myid最大,于是更新自己的投票為(2,0),然后重新投票,對于Server2而言,其無須更新自己的投票,只是再次向集群中所有機(jī)器發(fā)出上一次投票信息即可(4)統(tǒng)計(jì)投票。每次投票后,服務(wù)器都會(huì)統(tǒng)計(jì)投票信息,判斷是否已經(jīng)有過半機(jī)器接收到相同的投票信息,對于Server1、Server2而言,都統(tǒng)計(jì)出集群中已經(jīng)有兩臺(tái)機(jī)器接收了(2,0)的投票信息,此時(shí)便認(rèn)為已經(jīng)選出了Leader(5)改變服務(wù)器狀態(tài)。一旦確定了Leader,每個(gè)服務(wù)器就會(huì)更新自己的狀態(tài),如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為LEADING必備知識(shí)技能:五、Zookeeper選舉機(jī)制服務(wù)器運(yùn)行時(shí)期的Leader選舉在Zookeeper運(yùn)行期間,Leader與非Leader服務(wù)器各司其職,即便有非Leader服務(wù)器宕機(jī)或新加入,此時(shí)也不會(huì)影響Leader,但是一旦Leader服務(wù)器掛了,那么整個(gè)集群將暫停對外服務(wù),進(jìn)入新一輪Leader選舉,其過程和啟動(dòng)時(shí)期的Leader選舉過程基本一致任務(wù)實(shí)施:一、master上核心文件配置
步驟1把提前下載好的Zookeeper安裝包zookeeper-3.4.10.tar.gz拷貝到/usr/local/src目錄下步驟2:進(jìn)入src目錄,解壓。在命令窗口鍵入cd/usr/local/srctar-zxvfzookeeper-3.4.10.tar.gz步驟3:進(jìn)入Zookeeper目錄,創(chuàng)建zkdata目錄并查看當(dāng)前路徑cdzookeeper-3.4.10任務(wù)實(shí)施:一、master上核心文件配置mkdirzkdatapwdpwd命令執(zhí)行結(jié)果為/usr/local/src/zookeeper-3.4.10,復(fù)制該路徑備用步驟4:進(jìn)入conf目錄,復(fù)制一份配置文件,并將其改名為zoo.cfgcdconfcpzoo_sample.cfgzoo.cfg任務(wù)實(shí)施:一、master上核心文件配置
01步驟5:編輯配置文件zoo.cfg
02vimzoo.cfg
03步驟6:將dataDir路徑修改為如下所示
04dataDir=/usr/local/src/zookeeper-3.4.10/zkdata
05步驟7:在zoo.cfg最后加入以下內(nèi)容
06server.1=master:2888:3888任務(wù)實(shí)施:一、master上核心文件配置
server.2=hadoop1:2888:3888
server.3=hadoop2:2888:3888
步驟8:進(jìn)入zkdata目錄,創(chuàng)建一個(gè)myid的文件
cd/usr/local/src/zookeeper-3.4.10/zkdata
touchmyid
步驟9:編輯myid文件任務(wù)實(shí)施:一、master上核心文件配置
vimmyid
在文件中添加與server對應(yīng)的編號(hào):1
步驟10:配置環(huán)境變量
vim/etc/profile
在最后輸入以下內(nèi)容
#zookeeper任務(wù)實(shí)施:一、master上核心文件配置
exportZK_HOME=/usr/local/src/zookeeper-3.4.10
exportPATH=$PATH:${ZK_HOME}/bin
使環(huán)境變量生效
source/etc/profile任務(wù)實(shí)施:二、Zookeeper集群配置
步驟1將master上配置好的zookeeper目錄傳輸?shù)郊浩渌麢C(jī)器上,在master上面執(zhí)行如下命令
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文件傳輸?shù)郊浩渌麢C(jī)器上,在master上面執(zhí)行如下命令
scp-r/etc/profilehadoop1:etc/profile單擊此處添加項(xiàng)正文
scp-r/etc/profilehadoop2:etc/profile單擊此處添加項(xiàng)正文任務(wù)實(shí)施:二、Zookeeper集群配置步驟3:配置hadoop1上面的serverid值,在hadoop1上面執(zhí)行如下命令cd/usr/local/src/zookeeper-3.4.10/zkdatavimmyid在myid里面輸入數(shù)字2步驟4:使hadoop1上面的修改過的profile文件立即生效,在hadoop1上面執(zhí)行如下命令source/etc/profile任務(wù)實(shí)施:二、Zookeeper集群配置
01步驟5:配置hadoop2上面的serverid值,在hadoop2上面執(zhí)行如下命令
02cd/usr/local/src/zookeeper-3.4.10/zkdata
03vimmyid
04在myid里面輸入數(shù)字3
05步驟6:使hadoop2上面的修改過的profile文件立即生效,在hadoop2上面執(zhí)行如下命令任務(wù)實(shí)施:二、Zookeeper集群配置source/etc/profile任務(wù)實(shí)施:三、Zookeeper啟動(dòng)步驟1:關(guān)閉防火墻。分別在3個(gè)節(jié)點(diǎn)上執(zhí)行systemctlstopfirewalldsystemctldisablefirewalld步驟2:關(guān)閉SELinux。分別在3個(gè)節(jié)點(diǎn)上執(zhí)行setenforce0這里還需要永久關(guān)閉SELinux,執(zhí)行以下命令編輯SELinux配置文件任務(wù)實(shí)施:三、Zookeeper啟動(dòng)
vim/etc/selinux/config找到SELINUX一行,將其值改為disabledSELINUX=disabled步驟3:啟動(dòng)Zookeeper,分別在3個(gè)節(jié)點(diǎn)上執(zhí)行bin/zkServer.shstart注意Zookeeper在大多數(shù)節(jié)點(diǎn)存活下,才會(huì)有效。所以啟動(dòng)第一臺(tái)的時(shí)候,會(huì)報(bào)錯(cuò),等三個(gè)節(jié)點(diǎn)都啟動(dòng)完畢之后,就會(huì)正常了任務(wù)實(shí)施:三、Zookeeper啟動(dòng)
步驟4:查看Zookeeper運(yùn)行狀態(tài),分別在3個(gè)節(jié)點(diǎn)上執(zhí)行單擊此處添加項(xiàng)正文
bin/zkServer.shstatus單擊此處添加項(xiàng)正文
觀察節(jié)點(diǎn)狀態(tài)確認(rèn)啟動(dòng)成功分別觀察3個(gè)節(jié)點(diǎn),發(fā)現(xiàn)狀態(tài)為follower或者leader中的一種即為啟動(dòng)成功,如圖5-1-1所示任務(wù)二Zookeeper命令行操作06任務(wù)工單任務(wù)場景現(xiàn)有3臺(tái)虛擬機(jī),分別為master、hadoop1、hadoop2,上面搭建了Zookeeper分布式協(xié)調(diào)服務(wù)集群,現(xiàn)在需要使用命令行對節(jié)點(diǎn)進(jìn)行管理維護(hù)任務(wù)準(zhǔn)備全班學(xué)生以4人左右為一組,各組選出組長。請組長組織組員查找相關(guān)資料,并組織討論和匯總問題1:永久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)有什么區(qū)別問題2:什么是監(jiān)聽器必備知識(shí)技能:一、ZooKeeper數(shù)據(jù)結(jié)構(gòu)
ZooKeeper數(shù)據(jù)模型結(jié)構(gòu)ZooKeeper數(shù)據(jù)模型的結(jié)構(gòu)與Linux文件系統(tǒng)很類似,整體上可以看作是一棵樹,每個(gè)節(jié)點(diǎn)稱作一個(gè)ZNode。每一個(gè)ZNode默認(rèn)能夠存儲(chǔ)1MB的數(shù)據(jù),每個(gè)ZNode都可以通過其路徑唯一標(biāo)識(shí),如圖5-2-1
ZooKeeper數(shù)據(jù)模型解析ZooKeeper的數(shù)據(jù)模型,在結(jié)構(gòu)上和標(biāo)準(zhǔn)文件系統(tǒng)非常相似,擁有一個(gè)層次的命名空間,都是采用樹形層次結(jié)構(gòu),ZooKeeper樹中的每個(gè)節(jié)點(diǎn)被稱為ZNode。和文件系統(tǒng)的目錄樹一樣,ZooKeeper樹中的每個(gè)節(jié)點(diǎn)可以擁有子節(jié)點(diǎn)。但也有不同之處
ZNode特性與操作1.ZNode兼具文件和目錄兩種特點(diǎn),既像文件一樣維護(hù)著數(shù)據(jù)、元信息、ACL、時(shí)間戳等數(shù)據(jù)結(jié)構(gòu),又像目錄一樣可以作為路徑標(biāo)識(shí)的一部分,并可以具有子ZNode。用戶對ZNode具有增、刪、改、查等操作(權(quán)限允許的情況下)
ZNode的原子性操作與ACL權(quán)限2.ZNode具有原子性操作,讀操作將獲取與節(jié)點(diǎn)相關(guān)的所有數(shù)據(jù),寫操作也將替換掉節(jié)點(diǎn)的所有數(shù)據(jù)。另外,每一個(gè)節(jié)點(diǎn)都擁有自己的ACL(訪問控制列表),這個(gè)列表規(guī)定了用戶的權(quán)限,即限定了特定用戶對目標(biāo)節(jié)點(diǎn)可以執(zhí)行的操作必備知識(shí)技能:一、ZooKeeper數(shù)據(jù)結(jié)構(gòu)
ZNode數(shù)據(jù)大小限制3.ZNode存儲(chǔ)數(shù)據(jù)大小有限制,ZooKeeper雖然可以關(guān)聯(lián)一些數(shù)據(jù),但并沒有被設(shè)計(jì)為常規(guī)的數(shù)據(jù)庫或者大數(shù)據(jù)存儲(chǔ),相反的是,它用來管理調(diào)度數(shù)據(jù),比如分布式應(yīng)用中的配置文件信息、狀態(tài)信息、匯集位置等等。這些數(shù)據(jù)的共同特性就是它們都是很小的數(shù)據(jù),通常以KB為大小單位。ZooKeeper的服務(wù)器和客戶端都被設(shè)計(jì)為嚴(yán)格檢查并限制每個(gè)ZNode的數(shù)據(jù)大小至多1MB,但在常規(guī)使用中應(yīng)該遠(yuǎn)小于此值ZNode路徑規(guī)則4.ZNode通過路徑引用,如同Unix中的文件路徑。路徑必須是絕對的,因此它們必須由斜杠字符來開頭。除此以外,它們必須是唯一的,也就是說每一個(gè)路徑只有一個(gè)表示,因此這些路徑不能改變。在ZooKeeper中,路徑由Unicode字符串組成,并且有一些限制。字符串"/zookeeper"用以保存管理信息,比如關(guān)鍵配額信息①stat:此為狀態(tài)信息,描述該ZNode的版本,權(quán)限等信息②data:與該ZNode關(guān)聯(lián)的數(shù)據(jù)③children:該ZNode下的子節(jié)點(diǎn)必備知識(shí)技能:二、Zookeeper節(jié)點(diǎn)類型
ZNode有兩種,分別為臨時(shí)節(jié)點(diǎn)和永久節(jié)點(diǎn)。節(jié)點(diǎn)的類型在創(chuàng)建時(shí)即被確定,并且不能改變臨時(shí)節(jié)點(diǎn)該節(jié)點(diǎn)的生命周期依賴于創(chuàng)建它們的會(huì)話。一旦會(huì)話結(jié)束,臨時(shí)節(jié)點(diǎn)將被自動(dòng)刪除,當(dāng)然也可以手動(dòng)刪除。臨時(shí)節(jié)點(diǎn)不允許擁有子節(jié)點(diǎn)永久節(jié)點(diǎn):該節(jié)點(diǎn)的生命周期不依賴于會(huì)話,并且只有在客戶端顯式執(zhí)行刪除操作的時(shí)候,它們才能被刪除ZNode順序節(jié)點(diǎn)特性解析ZNode還有一個(gè)順序節(jié)點(diǎn)的特性,如果創(chuàng)建的時(shí)候指定了順序模式的話(當(dāng)然如果不指定默認(rèn)也是順序模式),該ZNode的名字后面會(huì)自動(dòng)追加一個(gè)不斷增加的序列號(hào)。序列號(hào)對于此節(jié)點(diǎn)的父節(jié)點(diǎn)來說是唯一的,這樣便會(huì)記錄每個(gè)子節(jié)點(diǎn)創(chuàng)建的先后順序。它的格式為“10%d”(10位數(shù)字,沒有數(shù)值的數(shù)位用0補(bǔ)充,例如“0000000001”)這樣便會(huì)存在四種類型的ZNode節(jié)點(diǎn),分別對應(yīng)必備知識(shí)技能:二、Zookeeper節(jié)點(diǎn)類型
PERSISTENT:永久節(jié)點(diǎn)
EPHEMERAL:臨時(shí)節(jié)點(diǎn)
PERSISTENT_SEQUENTIAL:永久節(jié)點(diǎn)、順序
EPHEMERAL_SEQUENTIAL:臨時(shí)節(jié)點(diǎn)、順序任務(wù)實(shí)施:一、基本命令操作步驟1:進(jìn)入Zookeeper家目錄cd/usr/local/src/zookeeper-3.4.10步驟2:在master上面連接本地Zookeeper服務(wù)器bin/zkCli.sh-server:2181步驟3:在根目錄下面創(chuàng)建一個(gè)內(nèi)容為“bob”名字為tmp的節(jié)點(diǎn)create-e/tmp"bob"任務(wù)實(shí)施:一、基本命令操作
注意一個(gè)臨時(shí)節(jié)點(diǎn)會(huì)在會(huì)話過期或關(guān)閉時(shí)自動(dòng)被刪除,剛剛我們在命令行創(chuàng)建的這個(gè)znode,如果退出連接然后重新連接,會(huì)發(fā)現(xiàn)節(jié)點(diǎn)已經(jīng)不存在了步驟4:下面使用ls命令查看根目錄底下的節(jié)點(diǎn)信息ls/上面使用ls命令查看zookeeper根目錄節(jié)點(diǎn)信息,會(huì)發(fā)現(xiàn)剛才創(chuàng)建的tmp節(jié)點(diǎn)步驟5:在根目錄下面創(chuàng)建一個(gè)內(nèi)容為“tim”名字為permanent的永久節(jié)點(diǎn)create-s/permanent"tim"任務(wù)實(shí)施:一、基本命令操作
注意一個(gè)永久節(jié)點(diǎn)會(huì)話過期或關(guān)閉時(shí)不會(huì)自動(dòng)被刪除,如果退出會(huì)話然后重新連接,會(huì)發(fā)現(xiàn)permanent節(jié)點(diǎn)依舊存在步驟6:下面使用ls命令查看根目錄底下的節(jié)點(diǎn)信息ls上面使用ls命令查看zookeeper根目錄節(jié)點(diǎn)信息,會(huì)發(fā)現(xiàn)剛才創(chuàng)建的permanent節(jié)點(diǎn)步驟7:獲取tmp節(jié)點(diǎn)內(nèi)容get/tmp任務(wù)實(shí)施:一、基本命令操作
上面使用get命令獲取/tmp節(jié)點(diǎn)內(nèi)容信息為“bob”
步驟8:修改tmp節(jié)點(diǎn)內(nèi)容為“bob2”
set/tmp“bob2”
步驟9:獲取tmp節(jié)點(diǎn)內(nèi)容
get/tmp
上面使用get命令獲取tmp節(jié)點(diǎn)內(nèi)容,發(fā)現(xiàn)其內(nèi)容已經(jīng)由“bob”更新為“bob2”任務(wù)實(shí)施:一、基本命令操作步驟10:刪除/permanent節(jié)點(diǎn)delete/permanent注意:要想刪除某個(gè)節(jié)點(diǎn)及其所有后代節(jié)點(diǎn),可以使用遞歸刪除,命令為rmrpath任務(wù)實(shí)施:二、監(jiān)聽器操作步驟1:給tmp節(jié)點(diǎn)設(shè)置get監(jiān)聽器單擊此處添加項(xiàng)正文get/tmpwatch單擊此處添加項(xiàng)正文ZooKeeper監(jiān)聽機(jī)制使用getpath[watch]注冊的監(jiān)聽器能夠在節(jié)點(diǎn)內(nèi)容發(fā)生改變的時(shí)候,向客戶端發(fā)出通知。需要注意的是ZooKeeper的觸發(fā)器是一次性的(One-timetrigger),即觸發(fā)一次后就會(huì)立即失效步驟2:給tmp節(jié)點(diǎn)設(shè)置stat監(jiān)聽器單擊此處添加項(xiàng)正文stat/tmpwatch單擊此處添加項(xiàng)正文監(jiān)控節(jié)點(diǎn)狀態(tài)變化通知使用statpath[watch]注冊的監(jiān)聽器能夠在節(jié)點(diǎn)狀態(tài)發(fā)生改變的時(shí)候,向客戶端發(fā)出通知任務(wù)實(shí)施:二、監(jiān)聽器操作
步驟3:給tmp節(jié)點(diǎn)設(shè)置ls監(jiān)聽器ls/tmpwatch監(jiān)聽器注冊與子節(jié)點(diǎn)變更監(jiān)聽使用lspath[watch]或ls2path[watch]注冊的監(jiān)聽器能夠監(jiān)聽該節(jié)點(diǎn)下所有子節(jié)點(diǎn)的增加和刪除操作步驟8:給tmp節(jié)點(diǎn)設(shè)置ls監(jiān)聽器。修改tmp節(jié)點(diǎn)內(nèi)容為“hello”,觸發(fā)監(jiān)聽set/tmp"hello"任務(wù)三ZookeeperJavaAPI操作07任務(wù)場景
ZookeeperJavaAPI使用示例現(xiàn)有3臺(tái)虛擬機(jī),分別為master、hadoop1、hadoop2,上面搭建了Zookeeper分布式協(xié)調(diào)服務(wù)集群,現(xiàn)在需要使用JavaAPI對節(jié)點(diǎn)進(jìn)行管理維護(hù)任務(wù)準(zhǔn)備
全班學(xué)生以4人左右為一組,各組選出組長。請組長組織組員查找相關(guān)資料,并組織討論和匯總
問題1:談?wù)勀銓og4j的了解
問題2:什么是maven依賴任務(wù)評價(jià)01setData-為指定的節(jié)點(diǎn)設(shè)置數(shù)據(jù)單擊此處添加項(xiàng)正文02getChildren-獲取指定節(jié)點(diǎn)的所有子節(jié)點(diǎn)單擊此處添加項(xiàng)正文03delete-刪除指定節(jié)點(diǎn)以及子節(jié)點(diǎn)單擊此處添加項(xiàng)正文04close-關(guān)閉連接單擊此處添加項(xiàng)正文05ZooKeeperAPI同步與異步對比ZooKeeper大部分API都提供了同步和異步方法。同步方法一般會(huì)有返回值,并且會(huì)拋出相應(yīng)的異常。異步方法沒有返回值,也不會(huì)拋出異常。此外,異步方法參數(shù)在同步方法參數(shù)的基礎(chǔ)上,會(huì)增加cb和ctx兩個(gè)參數(shù)開發(fā)環(huán)境
在工程的pom.xml文件中加入下面的依賴<dependency><groupId>org.apache.zookeeper開發(fā)環(huán)境
</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>連接服務(wù)器
構(gòu)造ZooKeeper類對象的過程就是與ZooKeeper服務(wù)器建立連接的過程ZooKeeper通過構(gòu)造函數(shù)連接服務(wù)器。構(gòu)造函數(shù)如下所示ZooKeeperConstructorZooKeeper(StringconnectionString,intsessionTimeout,Watcherwatcher)throwsIOExceptionZooKeeper構(gòu)造函數(shù)一共有三個(gè)參數(shù)connectionString第一個(gè)參數(shù),是ZooKeeper服務(wù)器地址(可以指定端口,默認(rèn)端口號(hào)為2181)連接服務(wù)器
sessionTimeout第二個(gè)參數(shù),是以毫秒為單位的會(huì)話超時(shí)時(shí)間。表示ZooKeeper等待客戶端通信的最長時(shí)間,之后會(huì)聲明會(huì)話結(jié)束。例如,我們設(shè)置為5000,即5s,這就是說如果ZooKeeper與客戶端有5s的時(shí)間無法進(jìn)行通信,ZooKeeper就會(huì)終止客戶端的會(huì)話。ZooKeeper會(huì)話一般設(shè)置超時(shí)時(shí)間為5~10s
watcher第三個(gè)參數(shù),Watcher對象實(shí)例。Watcher對象接收來自ZooKeeper的回調(diào),以獲得各種事件的通知。這個(gè)對象需要我們自己創(chuàng)建,因?yàn)閃atcher定義為接口,所以需要我們自己實(shí)現(xiàn)一個(gè)類,然后初始化這個(gè)類的實(shí)例并傳入ZooKeeper的構(gòu)造函數(shù)中。客戶端使用Watcher接口來監(jiān)控與ZooKeeper之間會(huì)話的健康情況,與ZooKeeper服務(wù)器之間建立或者斷開連接時(shí)會(huì)產(chǎn)生事件
ZooKeeperConnectionandCountDownLatch下面會(huì)創(chuàng)建一個(gè)ZooKeeperConnection類并實(shí)現(xiàn)一個(gè)connect方法。connect方法創(chuàng)建一個(gè)ZooKeeper對象,連接到ZooKeeper集群,然后返回該對象。CountDownLatch阻塞主進(jìn)程,直到客戶端連接到ZooKeeper集群連接服務(wù)器
ZooKeeper連接狀態(tài)回調(diào)ZooKeeper通過Watcher回調(diào)返回連接狀態(tài)。一旦客戶端與ZooKeeper集群連接,Watcher回調(diào)函數(shù)會(huì)被調(diào)用,Watcher回調(diào)調(diào)用CountDownLatch的countDown方法釋放鎖判斷ZNode是否存在
ZooKeeperexists方法介紹ZooKeeper類提供了檢查ZNode是否存在的exists方法。如果指定的ZNode存在,則返回ZNode的元數(shù)據(jù)。exists方法如下所示
//同步方式單擊此處添加項(xiàng)正文
StatexistsStatexists(Stringpath,Watcherwatcher)throwsKeeperException,InterruptedException
StatexistsStatexists(Stringpath,booleanwatch)throwsKeeperException,InterruptedException
//異步方式單擊此處添加項(xiàng)正文
StatCallbackInvocationvoidexists(Stringpath,Watcherwatcher,StatCallbackcb,Objectctx)判斷ZNode是否存在
StatCallbackUsageinPathExistenceCheckvoidexists(Stringpath,booleanwatch,StatCallbackcb,Objectctx)同步exists方法一共有兩個(gè)參數(shù)path:第一個(gè)參數(shù)是ZNode路徑watch或者watcher第二個(gè)參數(shù)是一個(gè)布爾類型的watch或者是一個(gè)自定義的Watcher對象。同步模式和異步模式分別有兩個(gè)方法,第一個(gè)方法傳遞一個(gè)新的Watcher對象(我們需要自定義實(shí)現(xiàn))。第二個(gè)方法使用默認(rèn)Watcher,如果開啟Watcher只需要將第二個(gè)參數(shù)設(shè)置為true(不需要我們自己實(shí)現(xiàn))。用來監(jiān)控節(jié)點(diǎn)數(shù)據(jù)變化以及節(jié)點(diǎn)的創(chuàng)建和刪除異步exists方法參數(shù)增加除了同步exists方法中的兩個(gè)參數(shù)以外,異步模式的exists方法還增加了cb和ctx兩個(gè)參數(shù)獲取節(jié)點(diǎn)數(shù)據(jù)
01ZooKeepergetData方法介紹ZooKeeper類提供了getData方法來獲取指定ZNode中的數(shù)據(jù)以及狀態(tài)。getData方法如下所示
02//同步方式單擊此處添加項(xiàng)正文
03getDatamethodoverviewbyte[]getData(Stringpath,Watcherwatcher,Statstat)throwsKeeperException,InterruptedException
04getDataMethodDescriptionbyte[]getData(Stringpath,booleanwatch,Statstat)throwsKeeperException,InterruptedException
05//異步方式單擊此處添加項(xiàng)正文
06getDataFunctionvoidgetData(Stringpath,Watcherwatcher,DataCallbackcb,Objectctx)獲取節(jié)點(diǎn)數(shù)據(jù)
getDataFunctionvoidgetData(Stringpath,booleanwatch,DataCallbackcb,Objectctx)同步getData方法返回值就是節(jié)點(diǎn)中存儲(chǔ)的數(shù)據(jù)值,它有三個(gè)參數(shù)path:第一個(gè)參數(shù)是節(jié)點(diǎn)的路徑,用于表示要獲取哪個(gè)節(jié)點(diǎn)中的數(shù)據(jù)watch或者watcher第二個(gè)參數(shù)是一個(gè)布爾類型的watch或者是一個(gè)自定義的Watcher對象。用來監(jiān)控節(jié)點(diǎn)數(shù)據(jù)變化以及節(jié)點(diǎn)是否被刪除stat:第三個(gè)參數(shù)用于存儲(chǔ)節(jié)點(diǎn)的狀態(tài)信息異步getData方法參數(shù)增加除了同步getData方法中的三個(gè)參數(shù)以外,異步模式的getData方法還增加了cb和ctx兩個(gè)參數(shù)修改節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容ZooKeepersetData方法介紹ZooKeeper類提供了setData方法來修改指定ZNode中的數(shù)據(jù)。setData方法如下所示//同步方法單擊此處添加項(xiàng)正文SetDataPathStatsetData(Stringpath,byte[]data,intversion)throwsKeeperException,InterruptedException//異步方法單擊此處添加項(xiàng)正文setDataFunctionDescriptionvoidsetData(Stringpath,byte[]data,intversion,StatCallbackcb,Objectctx)同步setData方法有三個(gè)參數(shù)單擊此處添加項(xiàng)正文修改節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容
path:第一個(gè)參數(shù)是節(jié)點(diǎn)的路徑單擊此處添加項(xiàng)正文
data:第二個(gè)參數(shù)是修改的數(shù)據(jù)值單擊此處添加項(xiàng)正文
version最后一個(gè)參數(shù)當(dāng)前ZNode版本。每當(dāng)數(shù)據(jù)發(fā)生變化時(shí),ZooKeeper都會(huì)更新ZNode的版本號(hào)
異步setData參數(shù)詳解除了同步setData方法中的三個(gè)參數(shù)以外,異步模式的setData方法還增加了cb和ctx兩個(gè)參數(shù)
ZooKeepergetChildren方法介紹ZooKeeper類提供getChildren方法來獲取指定ZNode下的所有子節(jié)點(diǎn)。getChildren方法如下所示
//同步方式單擊此處添加項(xiàng)正文修改節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容GetChildrenNodes
List<String>getChildren(Stringpath,Watcherwatcher)throwsKeeperException,InterruptedExceptionGetChildrenNodes
List<String>getChildren(Stringpath,booleanwatch)throwsKeeperException,InterruptedException//異步方式
單擊此處添加項(xiàng)正文GetChildrenCallback
voidgetChildren(Stringpath,Watcherwatcher,ChildrenCallbackcb,Objectctx)getChildrenfunction
voidgetChildren(Stringpath,booleanwatch,Children2Callbackcb,Objectctx)同步getChildren方法有兩個(gè)參數(shù)
單擊此處添加項(xiàng)正文修改節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容
path:第一個(gè)參數(shù)是節(jié)點(diǎn)路徑單擊此處添加項(xiàng)正文
watch或者watcher第二個(gè)參數(shù)是一個(gè)布爾類型的watch或者是一個(gè)自定義的Watcher對象。用來監(jiān)控節(jié)點(diǎn)數(shù)據(jù)變化以及節(jié)點(diǎn)是否被刪除。用于監(jiān)控節(jié)點(diǎn)的刪除以及子節(jié)點(diǎn)的創(chuàng)建與刪除操作
getChildren方法參數(shù)增加除了同步getChildren方法中的三個(gè)兩個(gè)以外,異步模式的getChildren方法還增加了cb和ctx兩個(gè)參數(shù)刪除節(jié)點(diǎn)01ZooKeeperdelete方法ZooKeeper類提供了delete方法來刪除指定的ZNode。delete方法如下所示02//同步方式單擊此處添加項(xiàng)正文03voiddeletevoiddelete(Stringpath,intversion)throwsInterruptedException,KeeperException04//異步方式單擊此處添加項(xiàng)正文05VoidDeleteFunctionvoiddelete(Stringpath,intversion,VoidCallbackcb,Objectctx)刪除節(jié)點(diǎn)
同步delete方法有兩個(gè)參數(shù)單擊此處添加項(xiàng)正文
path:第一個(gè)參數(shù)是節(jié)點(diǎn)路徑單擊此處添加項(xiàng)正文
version最后一個(gè)參數(shù)是當(dāng)前ZNode版本。每當(dāng)數(shù)據(jù)發(fā)生變化時(shí),ZooKeeper都會(huì)更新ZNode的版本號(hào)
異步delete方法參數(shù)增加除了同步delete方法中的兩個(gè)參數(shù)以外,異步模式的delete方法還增加了cb和ctx兩個(gè)參數(shù)任務(wù)實(shí)施準(zhǔn)備環(huán)境
步驟1:啟動(dòng)Zookeeper,分別在3個(gè)節(jié)點(diǎn)上執(zhí)行bin/zkServer.shstart注意Zookeeper在大多數(shù)節(jié)點(diǎn)存活下,才會(huì)有效。所以啟動(dòng)第一臺(tái)的時(shí)候,會(huì)報(bào)錯(cuò),等三個(gè)節(jié)點(diǎn)都啟動(dòng)完畢之后,就會(huì)正常了步驟2:查看Zookeeper運(yùn)行狀態(tài),分別在3臺(tái)節(jié)點(diǎn)上執(zhí)行bin/zkServer.shstatus步驟3打開Idea,新建一個(gè)maven項(xiàng)目demo,新建一個(gè)包,包名為com.jsck.zookeeper準(zhǔn)備環(huán)境步驟4:添加zookeeper依賴,在pom.xml文件中添加以下代碼<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId>準(zhǔn)備環(huán)境
<version>3.4.10</version>單擊此處添加項(xiàng)正文
</dependency>單擊此處添加項(xiàng)正文
步驟5在resources目錄下新建一個(gè)日志文件,名為perties,在里面輸入以下內(nèi)容
log4j.rootLogger=INFO,stdout單擊此處添加項(xiàng)正文
Log4jConsoleAppenderConfigurationlog4j.appender.stdout=org.apache.log4j.ConsoleAppender
Log4jAppenderConfigurationlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout準(zhǔn)備環(huán)境單擊此處添加正文
Log4jLayoutPatternlog4j.appender.stdout.layout.ConversionPattern=%d%p[%c]-%m%nLog4jFileAppenderConfigurationlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/spring.log單擊此處添加項(xiàng)正文Log4jLayoutConfigurationlog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutLog4jLayoutConfigurationlog4j.appender.logfile.layout.ConversionPattern=%d%p[%c]-%m%n節(jié)點(diǎn)操作
步驟1創(chuàng)建永久節(jié)點(diǎn)mydir。在src-java下面創(chuàng)建包c(diǎn)n.jsck.zookeeper,在該包下新建java文件CreateNode.java,在main函數(shù)里面輸入如下代碼//創(chuàng)建zookeeper客戶端ZookeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"http://參數(shù)1:zk服務(wù)地址;參數(shù)2:會(huì)話超過時(shí)間;參數(shù)3:監(jiān)視器ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)//參數(shù)1:創(chuàng)建節(jié)點(diǎn)路徑和名稱;參數(shù)2:節(jié)點(diǎn)數(shù)據(jù)內(nèi)容;參數(shù)3:節(jié)點(diǎn)權(quán)限;參數(shù)4:節(jié)點(diǎn)類型節(jié)點(diǎn)操作
ZookeeperNodeCreationzk.create("/mydir","mycontent".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT)
//關(guān)閉zk連接單擊此處添加項(xiàng)正文
zk.close()單擊此處添加項(xiàng)正文
注意如果沒有配置windows/etc/hosts文件,也就是沒有配置master、hadoop1、hadoop2主機(jī)名和ip地址的映射關(guān)系,那么上面的master、hadoop1、hadoop2需要改成對應(yīng)的ip地址
步驟2獲取節(jié)點(diǎn)mydir的數(shù)據(jù)。在包c(diǎn)n.jsck.zookeeper下新建java文件GetNode.java,在main函數(shù)里面輸入如下代碼
//創(chuàng)建zookeeper客戶端單擊此處添加項(xiàng)正文節(jié)點(diǎn)操作單擊此處添加正文ZookeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)//參數(shù)1:節(jié)點(diǎn)路徑單擊此處添加項(xiàng)正文DataRetrievalCodeStringmydirdata=newString(zk.getData("/mydir",false,null))System.out.println("mydir內(nèi)容為:"+mydirdata)單擊此處添加項(xiàng)正文//關(guān)閉zk連接單擊此處添加項(xiàng)正文節(jié)點(diǎn)操作
zk.close()步驟3修改節(jié)點(diǎn)mydir的數(shù)據(jù)。在包c(diǎn)n.jsck.zookeeper下新建java文件ModifyNode.java,在main函數(shù)里面輸入如下代碼//創(chuàng)建zookeeper客戶端ZooKeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"http://參數(shù)1:zk服務(wù)地址;參數(shù)2:會(huì)話超過時(shí)間;參數(shù)3:監(jiān)視器ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)節(jié)點(diǎn)操作
//修改節(jié)點(diǎn)數(shù)據(jù)。參數(shù)1:節(jié)點(diǎn)路徑名;參數(shù)2:節(jié)點(diǎn)修改后的數(shù)據(jù)修改節(jié)點(diǎn)數(shù)據(jù)zk.setData("/mydir","modifynodedata".getBytes(),-1)DataRetrievalExampleStringmydirdata1=newString(zk.getData("/mydir",false,null))System.out.println("修改節(jié)點(diǎn)mydir后的內(nèi)容為:"+mydirdata1)步驟4刪除節(jié)點(diǎn)mydir。在包c(diǎn)n.jsck.zookeeper下新建java文件DeleteNode.java,在main函數(shù)里面輸入如下代碼//創(chuàng)建zookeeper客戶端節(jié)點(diǎn)操作單擊此處添加正文
ZookeeperConnectionStringStringconnectStr="master:2181,hadoop1:2181,hadoop2:2181"http://參數(shù)1:zk服務(wù)地址;參數(shù)2:會(huì)話超過時(shí)間;參數(shù)3:監(jiān)視器單擊此處添加項(xiàng)正文ZooKeeperInitializationZooKeeperzk=newZooKeeper(connectStr,3000,null)//刪除目錄節(jié)點(diǎn)單擊此處添加項(xiàng)正文zk.delete("/mydir",-1)單擊此處添加項(xiàng)正文節(jié)點(diǎn)操作
//關(guān)閉zk連接
zk.close()項(xiàng)目總結(jié)08項(xiàng)目總結(jié)Zookeeper演示項(xiàng)目本項(xiàng)目主要演示了Zookeeper分布式協(xié)調(diào)服務(wù)安裝、命令行操作、JavaAPI操作。項(xiàng)目、任務(wù)里面穿插了相關(guān)的理論知識(shí)項(xiàng)目考核09填空題
Zookeeper集群角色1.Zookeeper集群主要有、、三種角色
ZNode有兩種類型節(jié)點(diǎn),分別是、單擊此處添加項(xiàng)正文判斷題
zookeeper是分布式的。()
Zookeeper集群宕機(jī)數(shù)超過集群數(shù)一半,則Zookeeper服務(wù)失效。()
Zookeeper對節(jié)點(diǎn)的Watch監(jiān)聽通知是永久性的。()選擇題
下列哪些操作可以觸發(fā)監(jiān)聽器Watcher
A.getDataB.getChildrenC.existsD.setData
下面與Zookeeper類似的框架是?()
AProtobufB.JavaC.KafkaD.ChubbyTHEEND謝謝項(xiàng)目六Hadoop高可用集群搭建CONTENTS目錄01
項(xiàng)目導(dǎo)讀02
知識(shí)目標(biāo)03
技能目標(biāo)04
素質(zhì)(思政)目標(biāo)CONTENTS目錄05
任務(wù)一Linux、Java、Zookeeper配置06
任務(wù)二HadoopHA配置07
項(xiàng)目總結(jié)08
項(xiàng)目考核項(xiàng)目導(dǎo)讀01項(xiàng)目導(dǎo)讀Hadoop高可用性HA在Hadoop2.0之前,NameNode是HDFS集群中的單點(diǎn)故障(SPOF)。每個(gè)集群只有一個(gè)NameNode,如果該計(jì)算機(jī)或進(jìn)程不可用,則整個(gè)集群將不可用,直到NameNode重新啟動(dòng)或在單獨(dú)的計(jì)算機(jī)上啟動(dòng),Yarn也有類似問題。Hadoop高可用性HA(HighAvailability)通常來描述一個(gè)系統(tǒng)經(jīng)過專門的設(shè)計(jì),從而減少停工時(shí)間,而保持其服務(wù)的高度可用性。Hadoop高可用(HighAvailability)分為HDFS高可用和YARN高可用,兩者的實(shí)現(xiàn)基本類似知識(shí)目標(biāo)02知識(shí)目標(biāo)
了解密鑰公鑰
了解HA產(chǎn)生的背景
熟悉HA原理
熟悉HDFSHA架構(gòu)圖
熟悉YarnHA架構(gòu)圖技能目標(biāo)03技能目標(biāo)
掌握HadoopHA集群規(guī)劃
掌握J(rèn)DK安裝
掌握SSH免密登錄
掌握HadoopHA集群配置
掌握HadoopHA集群啟動(dòng)和關(guān)閉素質(zhì)(思政)目標(biāo)04素質(zhì)(思政)目標(biāo)
培養(yǎng)嚴(yán)謹(jǐn)細(xì)致的工匠精神
厚植技術(shù)報(bào)國夢
培養(yǎng)不驕不躁的工匠心態(tài)
培養(yǎng)保密意識(shí)
培養(yǎng)網(wǎng)絡(luò)安全意識(shí)任務(wù)一Linux、Java、Zookeeper配置05任務(wù)工單任務(wù)描述
在做Hadoop高可用配置之前,須先做一些鋪墊,配置Linux環(huán)境、JDK環(huán)境、zookeeper環(huán)境任務(wù)工單:任務(wù)準(zhǔn)備
01全班學(xué)生以4人左右為一組,各組選出組長。請組長組織組員查找相關(guān)資料,并組織討論和匯總
02問題1:Linux的hosts文件有什么作用?如何配置
03問題2:Linux環(huán)境變量配置文件在哪?如何配置
04問題3:什么是SSH免密登錄
05問題4:Zookeeper有什么作用必備知識(shí)技能:一、ZooKeeper在HadoopHA中的作用
ZooKeeper在分布式系統(tǒng)中的應(yīng)用ZooKeeper能解決大多數(shù)分布式系統(tǒng)中的問題,如可以通過創(chuàng)建臨時(shí)節(jié)點(diǎn)來建立心跳監(jiān)測機(jī)制。如果分布式系統(tǒng)的某個(gè)服務(wù)節(jié)點(diǎn)宕機(jī)了,則其持有的會(huì)話會(huì)超時(shí),此時(shí)該臨時(shí)節(jié)點(diǎn)會(huì)被刪除,相應(yīng)的監(jiān)聽事件就會(huì)被觸發(fā)。分布式系統(tǒng)的每個(gè)服務(wù)節(jié)點(diǎn)還可以將自己的節(jié)點(diǎn)狀態(tài)寫入臨時(shí)節(jié)點(diǎn),從而完成狀態(tài)報(bào)告或節(jié)點(diǎn)工作進(jìn)度匯報(bào)。通過數(shù)據(jù)的訂閱和發(fā)布功能,ZooKeeper還能對分布式系統(tǒng)進(jìn)行模塊的解耦和任務(wù)的調(diào)度。通過監(jiān)聽機(jī)制,還能對分布式系統(tǒng)的服務(wù)節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)上下線,從而實(shí)現(xiàn)服務(wù)的動(dòng)態(tài)擴(kuò)容必備知識(shí)技能:二、OpenJDK與JDK比較開放性O(shè)penJDK是一個(gè)開放源代碼的Java開發(fā)工具包,由Oracle公司主導(dǎo)并以GPL許可證發(fā)布。它的源代碼是公開可用的,任何人都可以查看、修改和分發(fā)。而JDK(JavaDevelopmentKit)是Oracle公司提供的Java開發(fā)工具包,它不是開源的,源代碼不公開許可證OpenJDK使用GPL許可證,這意味著使用OpenJDK開發(fā)的軟件必須遵守GPL的規(guī)定,包括將源代碼公開并保持開源。而JDK使用OracleBinaryCodeLicense許可證,這意味著使用JDK開發(fā)的軟件不需要公開源代碼,但需要遵守許可證的其他規(guī)定OpenJDK與JDK對比除了這些主要區(qū)別外,OpenJDK和JDK在功能上基本上是相同的,都提供了Java編譯器(javac)、Java虛擬機(jī)(JVM)和Java標(biāo)準(zhǔn)庫等開發(fā)工具和運(yùn)行時(shí)環(huán)境。這兩個(gè)工具包都可以用于開發(fā)和運(yùn)行Java應(yīng)用程序,只是在許可證和開放性上有所不同必備知識(shí)技能:三、HadoopHA存在的背景
HDFSHA解決方案Hadoop2.0之前,在HDFS集群中NameNode存在單點(diǎn)故障(SPOF),對于只有一個(gè)NameNode的集群,若NameNode出現(xiàn)故障,則整個(gè)集群將無法使用,直到NameNode重啟。NameNode主要在以下兩個(gè)方面影響集群:NameNode機(jī)器出現(xiàn)意外,如宕機(jī),集群將無法使用,直到管理員重啟。NameNode機(jī)器需要升級(jí),包括軟件、硬件升級(jí),此時(shí)集群也將無法使用。HDFSHA功能通過Active/Standby兩個(gè)NameNodes實(shí)現(xiàn)集群中對NameNode的熱備來解決上述問題。如出現(xiàn)故障,此時(shí)NameNode很快切換到另外一臺(tái)機(jī)器上任務(wù)實(shí)施:一、Linux配置步驟1:修改主機(jī)名。切換到root,分別在3臺(tái)虛擬機(jī)上執(zhí)行如下命令hostnamectlset-hostnamemasterhostnamectlset-hostnamehadoop1hostnamectlset-hostnamehadoop2步驟2:修改hosts文件,分別在3臺(tái)虛擬機(jī)上編輯hosts文件,命令為vim/etc/hosts任務(wù)實(shí)施:一、Linux配置
hosts文件內(nèi)容為
0master
hadoop1
hadoop2任務(wù)實(shí)施:二、SSH免密登錄配置
三虛擬機(jī)互免密登錄配置在主機(jī)名為master、hadoop1、hadoop2的虛擬機(jī)上面配置,實(shí)現(xiàn)3臺(tái)虛擬機(jī)之間兩兩互相免密登錄步驟1:所有虛擬機(jī)。清空原來的。ssh文件,并給每臺(tái)機(jī)器創(chuàng)建公鑰和密鑰以及自我免密登錄SSHKeyGenerationcd/root;rm-rfhd?.pub;rm-rf.ssh;ssh-keygen-trsaSSHKeySetupcd.ssh;catid_rsa.pub>>authorized_keys;chmod600*步驟2:master上操作。把master的公鑰分發(fā)給hadoop1和hadoop2scpid_rsa.pubhadoop1:root/hd1.pub任務(wù)實(shí)施:二、SSH免密登錄配置scpid_rsa.pubhadoop2:root/hd1.pub步驟3:hadoop1上操作。把hadoop1的公鑰分發(fā)給master和hadoop2scpid_rsa.pubmaster:root/hd2.pubscpid_rsa.pubhadoop2:root/hd2.pub步驟4:hadoop2上操作。把hadoop2的公鑰分發(fā)給master和hadoop1scpid_rsa.pubmaster:root/hd3.pub任務(wù)實(shí)施:二、SSH免密登錄配置
scpid_rsa.pubhadoop1:root/hd3.pub單擊此處添加項(xiàng)正文
步驟5master上操作。追加hd2.pub、hd3.pub到master的authorized_keys文件里
cat/root/hd2.pub>authorized_keys單擊此處添加項(xiàng)正文
cat/root/hd3.pub>authorized_keys單擊此處添加項(xiàng)正文
步驟6hadoop1上操作。追加hd1.pub、hd3.pub到hadoop1的authorized_keys文件里
cat/root/hd1.pub>authorized_keys單擊此處添加項(xiàng)正文任務(wù)實(shí)施:二、SSH免密登錄配置
cat/root/hd3.pub>authorized_keys單擊此處添加項(xiàng)正文
步驟7hadoop2上操作。追加hd1.pub、hd2.pub到hadoop2的authorized_keys文件里
cat/root/hd1.pub>authorized_keys單擊此處添加項(xiàng)正文
cat/root/hd2.pub>authorized_keys單擊此處添加項(xiàng)正文
步驟8:驗(yàn)證免密登錄成功單擊此處添加項(xiàng)正文
master上操作單擊此處添加項(xiàng)正文任務(wù)實(shí)施:二、SSH免密登錄配置
sshhadoop1;hostname;exit
sshhadoop2;hostname;exit
hadoop1上操作
sshmaster;hostname;exit
sshhadoop2;hostname;exit任務(wù)實(shí)施:二、SSH免密登錄配置hadoop2上操作sshmaster;hostname;exitsshhadoop2;hostname;exit任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
配置JDK在LinuxLinux上一般會(huì)安裝OpenJDK,配置JDK之前先卸載掉OpenJDK,卸載以后再安裝相應(yīng)版本的JDK,并配置環(huán)境變量步驟1卸載系統(tǒng)自帶的OpenJDK以及相關(guān)的java文件。在終端命令窗口鍵入:java-version可以看到系統(tǒng)自帶的OpenJDK版本信息,如圖6-1-1步驟2:查看OpenJDK自帶Java文件在終端命令窗口鍵入rpm-qa|grepjava可以看到系統(tǒng)自帶的OpenJDKJava相關(guān)文件,如圖6-1-2任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
上圖文件中,下面這幾個(gè)可以刪除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文件可以不用刪除任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
python-javapackages-3.4.1-11.el7.noarchtzdata-java-2016g-2.el7.noarchjavapackages-tools-3.4.1-11.el7.noarch步驟3:刪除OpenJDK自帶Java文件,在終端命令窗口鍵入U(xiǎn)ninstallJavaOpenJDKrpm-e--nodepsjava-1.7.0-openjdk-11-.el7.x86_64卸載OpenJDK1.8rpm-e--nodepsjava-1.8.0-openjdk-02-4.b14.el7.x86_64任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
卸載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:檢查是否已經(jīng)刪除成功,在命令窗口鍵入java-version如圖6-1-3所示,代表Linux系統(tǒng)自帶的OpenJDK已經(jīng)刪除成功了注:如果還沒有刪除,則用yum-yremove去刪除他們?nèi)蝿?wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
步驟5拷貝JDK,把事先下載好的JDK安裝包用拖拽的方式,拷貝進(jìn)/usr/local/src目錄下(安裝的JDK版本和IDEA里面的配置一樣,因?yàn)镮DEA自帶JDK11)步驟6:解壓JDK,把事先下載好的JDK安裝包用拖拽的方式,在命令窗口鍵入tar-zxvfjdk-8u144-linux-x64.tar.gz步驟7:刪除JDK壓縮包,在命令行鍵入rm-rfjdk-8u144-linux-x64.tar.gz至此,usr/local/src目錄下就有一個(gè)JDK的目錄任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
步驟8:配置JDK環(huán)境變量,在命令行鍵入vim/etc/profile粘貼內(nèi)容至文檔末尾進(jìn)入文本編輯狀態(tài)下,光標(biāo)走到文件最后一行,鍵盤按下字母i,進(jìn)入插入狀態(tài),在文本的最后一行粘貼如下內(nè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任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)單擊此處添加正文
exportPATH=$PATH:${JAVA_HOME}/bin
步驟9:讓剛剛設(shè)置的環(huán)境變量生效,在命令行鍵入
source/etc/profile
步驟10:檢查java是否配置成功,在命令行鍵入任務(wù)實(shí)施:三、JDK配置(3臺(tái)虛擬機(jī)上都做一遍)
命令執(zhí)行結(jié)果如圖6-1-4,即為java配置成功任務(wù)實(shí)施:四、Zookeeper配置
確保3臺(tái)虛擬機(jī)上的Zookeeper安裝配置成功,分別在3臺(tái)虛擬機(jī)上啟動(dòng)Zookeeper步驟1:該步驟3臺(tái)機(jī)器上均操作。進(jìn)入Zookeeper家目錄,在命令窗口鍵入bin/zkServer.shstart;bin/zkServer.shstatusZookeeper啟動(dòng)流程解析Zookeeper在大多數(shù)節(jié)點(diǎn)存活下才會(huì)有效。所以啟動(dòng)第一臺(tái)的時(shí)候,會(huì)報(bào)錯(cuò),等三個(gè)節(jié)點(diǎn)都啟動(dòng)完畢之后,就會(huì)正常了。正常啟動(dòng)如圖6-1-5任務(wù)二HadoopHA配置06任務(wù)工單:任務(wù)描述
HDFS和Yarn高可用配置目前3臺(tái)虛擬機(jī)上的Linux、JDK、zookeeper環(huán)境已經(jīng)配置好了,現(xiàn)在我們需要實(shí)現(xiàn)HDFS和yarn的高可用,HDFSNamenode節(jié)點(diǎn)備份,yarn的ResourceManager節(jié)點(diǎn)備份任務(wù)工單:任務(wù)準(zhǔn)備01全班學(xué)生以4人左右為一組,各組選出組長。請組長組織組員查找相關(guān)資料,并組織討論和匯總02問題1:什么是高可用03問題2:HDFSHA實(shí)現(xiàn)有什么思路04問題3:YarnHA實(shí)現(xiàn)有什么思路05問題4:如果3臺(tái)虛擬機(jī)里面的1臺(tái)宕機(jī),Hadoop集群是否能正常提供服務(wù)必備知識(shí)技能:一、基于QJM的HAHadoopQJMHA方案解析Hadoop2.x之后,Cloudera提出了QJM(QuorumJournalManager)的HA方案。這是一個(gè)基于Paxos算法(分布式一致性算法)實(shí)現(xiàn)的HDFSHA方案,主要優(yōu)勢如下:不需要配置額外的高性能共享存儲(chǔ),降低了系統(tǒng)復(fù)雜度和維護(hù)成本。消除SPOF(單點(diǎn)故障),系統(tǒng)魯棒性(Robust)的程度可配置、可擴(kuò)展?;驹恚菏褂?N+1臺(tái)JournalNode存儲(chǔ)EditLog,每次寫數(shù)據(jù)操作有〉=N+1返回成功時(shí)即認(rèn)為該次寫成功,保證數(shù)據(jù)不會(huì)丟失高可用方案NN狀態(tài)說明如圖6-2-1,高可用方案中NN有〉=2個(gè),只有一個(gè)是Active狀態(tài),表示正在對外提供服務(wù)的,是活躍的NN,其他的NN是StandBy狀態(tài),不對外提供服務(wù)的,隨時(shí)準(zhǔn)備替換ActiveNNJournalNode(JN)高效的存儲(chǔ)系統(tǒng),能夠?qū)崿F(xiàn)數(shù)據(jù)的超快速寫入與讀取。JN是一個(gè)小的文件系統(tǒng)集群,節(jié)點(diǎn)數(shù)需要是2N+1臺(tái)。當(dāng)ActiveNN執(zhí)行任何命名空間修改時(shí),它會(huì)持續(xù)地將修改記錄到大多數(shù)這些JN上。StandByNN實(shí)時(shí)讀取JN內(nèi)部的數(shù)據(jù),實(shí)現(xiàn)兩個(gè)節(jié)點(diǎn)的實(shí)時(shí)元數(shù)據(jù)同步。JournalNode需要配置hdfs-site.xml里面的node.shared.edits.dir和dfs.journalnode.edits.dir這兩個(gè)參數(shù)。配置示例如下必備知識(shí)技能:一、基于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>必備知識(shí)技能:一、基于QJM的HA</property>單擊此處添加項(xiàng)正文JournalNodes集群同步機(jī)制node.shared.edits.dir:JournalNodes地址,由JournalNodes集群提供共享的編輯存儲(chǔ),由ActiveNN寫入,由StandbyNN讀取,以保持與ActiveNN所做的所有文件系統(tǒng)更改同步JournalNode狀態(tài)路徑配置dfs.journalnode.edits.dir:JournalNode守護(hù)進(jìn)程存儲(chǔ)本地狀態(tài)的路徑。JournalNode機(jī)器上的絕對路徑且只能配置一個(gè)路徑必備知識(shí)技能:二、基于共享NFS的HA
與QJM的區(qū)別是使用高性能共享存儲(chǔ)HDFS的元數(shù)據(jù),但只有ActiveNN才能寫,StandbyNN只能讀。配置如下遠(yuǎn)程共享編輯目錄設(shè)置node.shared.edits.dir:遠(yuǎn)程共享編輯目錄的路徑,備用NN使用同一個(gè)目錄,以保持與ActiveNN所做的所有文件系統(tǒng)更改同步。這個(gè)目錄應(yīng)該以r/w的方式掛載在NN機(jī)器上,且需要配置為絕對路徑<property><name>node.shared.edits.dir</name><value>filemnt/filer1/dfs/ha-name-dir-shared</value></property>必備知識(shí)技能:三、HDFSHA自動(dòng)切換
01HDFSHA自動(dòng)切換HA自動(dòng)切換NN,需要增加兩個(gè)新的組件:ZooKeeper集群和ZKFailoverController進(jìn)程(簡稱ZKFC)。集群啟動(dòng)〉=2個(gè)NN,每個(gè)NN都會(huì)有一個(gè)ZKFC,每個(gè)ZKFC到ZooKeeper上
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沖床模具生產(chǎn)管理制度
- 魚船安全生產(chǎn)管理制度
- 生產(chǎn)插單計(jì)劃管理制度
- 畜牧安全生產(chǎn)培訓(xùn)制度
- 安全生產(chǎn)班前提醒制度
- 2026上半年云南事業(yè)單位聯(lián)考旅游職業(yè)學(xué)院招聘14人備考考試試題附答案解析
- 安全生產(chǎn)動(dòng)態(tài)監(jiān)管制度
- 2026上海市中醫(yī)醫(yī)院新職工招聘183人(第一批)備考考試題庫附答案解析
- 雙匯冷鮮肉生產(chǎn)規(guī)章制度
- 生產(chǎn)技術(shù)交底制度
- 專題08解題技巧專題:圓中輔助線的作法壓軸題三種模型全攻略(原卷版+解析)
- 2024年全國職業(yè)院校技能大賽(節(jié)水系統(tǒng)安裝與維護(hù)賽項(xiàng))考試題庫(含答案)
- 24秋人教版英語七上單詞表(Vocabulary in Each Unit)總表
- ISO 15609-1 2019 金屬材料焊接工藝規(guī)程和評定-焊接工藝規(guī)程-電弧焊(中文版)
- 肥胖患者麻醉管理
- 小鯉魚跳龍門電子版
- 2019年急性腦梗死出血轉(zhuǎn)化專家共識(shí)解讀
- 《混凝土結(jié)構(gòu)工程施工規(guī)范》
- 土地證延期申請書
- 硫乙醇酸鹽流體培養(yǎng)基適用性檢查記錄
- 進(jìn)階切分技法advanced funk studies rick latham-藍(lán)色加粗字
評論
0/150
提交評論