提到列式(Column Family)數(shù)據(jù)庫(kù),就不得不提Google的BigTable,其開(kāi)源版本就是我們熟知的HBASE。BigTable建立在谷歌的另兩個(gè)系統(tǒng)GFS和Chubby之上,這三個(gè)系統(tǒng)和分布式計(jì)算編程模型MapReduce共同構(gòu)成Google云計(jì)算的基礎(chǔ),Chubby解決主從自動(dòng)切換的基礎(chǔ)。接下來(lái)通過(guò)一個(gè)表格對(duì)比來(lái)引入Hadoop。
為孟津等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及孟津網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、孟津網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!Google云計(jì)算 | Hadoop中的對(duì)應(yīng) |
分布式文件系統(tǒng)GFS | HDFS,負(fù)責(zé)數(shù)據(jù)物理存儲(chǔ) |
分布式管理服務(wù)Chubby | Zookeeper,負(fù)責(zé)管理服務(wù)器 |
分布式計(jì)算框架MapReduce | MapReduce,負(fù)責(zé)計(jì)算 |
分布式數(shù)據(jù)庫(kù)BigTable | HBase,負(fù)責(zé)存取數(shù)據(jù) |
Hadoop是有Apache Lucene的作者Boug Cutting開(kāi)發(fā)的,其主體結(jié)構(gòu)如下圖所示。
HDFS(Hadoop File System)
NameNode:整個(gè)文件系統(tǒng)的大腦,提供整個(gè)系統(tǒng)的目錄信息并管理各個(gè)數(shù)據(jù)服務(wù)器。
DataNode:分布式文件系統(tǒng)中每一個(gè)文件被切割為若干數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊存儲(chǔ)在不同服務(wù)器,這些就是數(shù)據(jù)服務(wù)器。
Block:每個(gè)被切分的數(shù)據(jù)塊就是一段文件內(nèi)容,其是基本的存儲(chǔ)單位,被稱為數(shù)據(jù)塊,典型大小為64MB。
Tip:由于硬件錯(cuò)誤是常態(tài),HDFS是很多臺(tái)Server的集合,因而錯(cuò)誤檢測(cè)和恢復(fù)是核心功能;其以流式讀為主,做批量操作,關(guān)注數(shù)據(jù)訪問(wèn)的高吞吐量。
HDFS采用master/slave架構(gòu),一個(gè)HDFS集群由一個(gè)NameNode和若干DataNode組成,中心服務(wù)器NameNode負(fù)責(zé)管理文件系統(tǒng)的namespace和客戶端對(duì)文件的訪問(wèn)。DataNode一般一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理節(jié)點(diǎn)上附帶的存儲(chǔ)。在內(nèi)部,一個(gè)文件被分成一個(gè)或多個(gè)block,這些block存儲(chǔ)在DataNode集合中。NameNode和DataNode均可運(yùn)行在廉價(jià)的linux機(jī)器上,HDFS由java語(yǔ)言開(kāi)發(fā),跨平臺(tái)好,總體結(jié)構(gòu)示意圖如下所示。
復(fù)制:采用rack-aware策略改進(jìn)數(shù)據(jù)可靠性和網(wǎng)絡(luò)帶寬的利用;NameNode決定每個(gè)DataNode的Rack id;大多數(shù)情況,replication因子是3,簡(jiǎn)單來(lái)說(shuō)就是將一個(gè)副本放在本地機(jī)架節(jié)點(diǎn),一個(gè)副本放在同一機(jī)架另一個(gè)節(jié)點(diǎn),最后一個(gè)放在不同機(jī)架;在讀取時(shí),會(huì)選擇最近的副本;NameNode啟動(dòng)時(shí)會(huì)進(jìn)入SafeMode狀態(tài),該狀態(tài)時(shí),NameNode不會(huì)進(jìn)行數(shù)據(jù)塊的復(fù)制,這是會(huì)檢測(cè)DataNode的副本數(shù)量,如果滿足要求則認(rèn)為安全。
NameNode用于存儲(chǔ)元數(shù)據(jù),任何修改均被Editlog記錄,通訊協(xié)議基于TCP/IP,可以通過(guò)java API調(diào)用。
安裝Hadoop,步驟如下所示
View Code
在分布式模式下,hadoop配置文件中不能使用ip,必須使用主機(jī)名,安裝hadoop必須在所有節(jié)點(diǎn)上使用相同配置和安裝路徑,并用相同用戶啟動(dòng)。Hadoop中的HDFS和Map-Reduce可以分別啟動(dòng),NameNode和JobTracker可以部署到不同節(jié)點(diǎn),但小集群一般在一起,注意元數(shù)據(jù)安全即可。
Hdfs常見(jiàn)操作,請(qǐng)見(jiàn)下表所示,在實(shí)踐中,一般都是通過(guò)API調(diào)用,了解下就好
命令 | 詮釋 | 命令 | 詮釋 |
#cat | Hadoop fs –cat uri輸出內(nèi)容 | #chgrp | 修改文件所屬組 |
#chmod | 修改文件去哪先 | #chown | 修改文件擁有者 |
#put#copyFromLocal | 從本地文件系統(tǒng)復(fù)制到目標(biāo)系統(tǒng) | #get#getmerge#copToLocal | 復(fù)制文件到本地系統(tǒng) Hadoop fs –gethdfs://host:port/user/Hadoop/file local file |
#cp | 復(fù)制文件 | #du,#dus | 顯示目錄、文件大小 |
#expunge | 清空回收站 | #ls, lsr | 顯示文件信息 |
#mv#movefromLocal | 移動(dòng)文件 | #rm #rmr | 刪除文件 |
#mkdir | 創(chuàng)建目錄 | #setrep | 改變文件副本系數(shù) |
#stat | 返回統(tǒng)計(jì)信息 hadoop fs –stat path | 其他 | #tail #touchz |
#test | #text |
通過(guò)Java調(diào)用hdfs的示例如下所示,其實(shí)就是一個(gè)文件系統(tǒng)
View Code
Map Reduce核心概念
Job: 用戶的每一個(gè)計(jì)算請(qǐng)求就是一個(gè)作業(yè)
JobTracker:用戶提交作業(yè)的服務(wù)器,同時(shí)它還負(fù)責(zé)各個(gè)作業(yè)任務(wù)的分配,管理所有的任務(wù)服務(wù)器。
Task:一個(gè)都需要拆分,交個(gè)多個(gè)服務(wù)器完成,拆分出來(lái)的執(zhí)行單位就是任務(wù)
TaskTracker:就是任勞任怨的工人,負(fù)責(zé)執(zhí)行具體的任務(wù)。
Map Reduce計(jì)算模型
在hadoop中,每一個(gè)MapReduce任務(wù)被初始化為一個(gè)Job,每個(gè)Job又被分為兩個(gè)階段:Map階段、Reduce階段。這兩個(gè)階段分別用兩個(gè)函數(shù)表示,Map函數(shù)接受一個(gè)<key,value>輸入,然后產(chǎn)生一個(gè)<key,value>的中間輸出;之后hadoop會(huì)將具有相同中間key的value集合傳給Reduce函數(shù),之后Reduce處理后得到<key,value>形式輸出。
在Java中接入Hadoop的配置與代碼如下所示。
View Code
MapReduce的數(shù)據(jù)流和控制流
zookeeper主要用來(lái)解決分布式應(yīng)用中經(jīng)常遇到的數(shù)據(jù)管理的問(wèn)題,如統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理和分布式應(yīng)用配置項(xiàng)的管理,Zookeeper典型的應(yīng)用場(chǎng)景(配置文件的管理、集群管理、同步鎖、Leader選舉和隊(duì)列管理等)。
Zookeeper配置安裝的步驟如下所示
View Code
ZooKeeper數(shù)據(jù)模型,其會(huì)維護(hù)一個(gè)層次關(guān)系的數(shù)據(jù)結(jié)構(gòu),非常類似標(biāo)準(zhǔn)文件系統(tǒng)
ZooKeeper的基礎(chǔ)使用,其作為一個(gè)分布式服務(wù)框架,主要用于解決分布式集群的一致性問(wèn)題,它提供類似文件系統(tǒng)目錄節(jié)點(diǎn)樹(shù)方式的數(shù)據(jù)存儲(chǔ),并會(huì)維護(hù)和監(jiān)控?cái)?shù)據(jù)的狀態(tài)變化,其常見(jiàn)方法如下所示。
方法 | 詮釋 |
Stringcreate | 創(chuàng)建一個(gè)給點(diǎn)的目錄節(jié)點(diǎn)path并設(shè)置數(shù)據(jù) |
Statexists | 判斷某個(gè)path是否存在,并設(shè)置監(jiān)控這個(gè)目錄節(jié)點(diǎn) |
Delete | 參數(shù)path對(duì)應(yīng)目錄節(jié)點(diǎn) |
StatsetData,getData | 設(shè)置數(shù)據(jù),獲取數(shù)據(jù) |
addAuthInfo | 將自己授權(quán)信息發(fā)送給服務(wù)器 |
StatsetACL,getACL | 設(shè)置目錄節(jié)點(diǎn)訪問(wèn)權(quán)限,獲取權(quán)限列表 |
java調(diào)用zookeeper的API示例如下
View Code
ZooKeeper的典型應(yīng)用場(chǎng)景
統(tǒng)一命名服務(wù)(Name Service):分布式應(yīng)用,通常需要一整套的命名規(guī)則,一般使用樹(shù)形命名,這兒和JNDI很相似。
配置管理:ZooKeeper統(tǒng)一管理配置信息,保存在對(duì)應(yīng)目錄,一旦變化,對(duì)應(yīng)機(jī)器就會(huì)收到通知(觀察者)。
集群管理:ZooKeeper不僅能維護(hù)當(dāng)前集群中及其的服務(wù)狀態(tài),并能選出一個(gè)總管(Leader Election),從而避免單點(diǎn)故障,示例代碼如下。
共享鎖(Locks):共享鎖在同一個(gè)進(jìn)程容易實(shí)現(xiàn),但再不同Server見(jiàn)不好實(shí)現(xiàn),但Zookeeper卻很容易實(shí)現(xiàn),方式就是需要獲取鎖的Servere創(chuàng)建一個(gè)EPHEMERAL_SEQUENTIAL目錄節(jié)點(diǎn),然后調(diào)用getChildren方法獲得當(dāng)前目錄節(jié)點(diǎn)列表中最小的目錄節(jié)點(diǎn),并判斷,如果未自己建立,則獲得鎖,如果不是就調(diào)用exist方法監(jiān)控節(jié)點(diǎn)變化,一直到自己創(chuàng)建的節(jié)點(diǎn)時(shí)最小,從而獲得鎖,釋放很賤,只要?jiǎng)h除前面自己創(chuàng)建的目錄節(jié)點(diǎn)就OK。
隊(duì)列管理(Queue Management):可以處理兩類隊(duì)列,一種是當(dāng)成員齊聚時(shí),隊(duì)列才可用,否則一直等待,被稱為同步隊(duì)列;一種是按照FIFO方式進(jìn)行入隊(duì)和出隊(duì),例如實(shí)現(xiàn)生產(chǎn)-消費(fèi)者模型。
HBase(邏輯結(jié)構(gòu))是BigTable的開(kāi)源版,其建立在HDFS(物理結(jié)構(gòu))之上,提供高可靠性、高性能、列存儲(chǔ)和可伸縮、實(shí)時(shí)讀寫(xiě)的數(shù)據(jù)庫(kù)系統(tǒng)。它結(jié)余NOSQL和RDBMS之間,僅能通過(guò)主鍵和主鍵range來(lái)檢索數(shù)據(jù),支持單行事務(wù)(可通過(guò)hive支持來(lái)實(shí)現(xiàn)多表join等復(fù)雜操作),主要用于存儲(chǔ)非結(jié)構(gòu)和半結(jié)構(gòu)化的松散數(shù)據(jù)。與Hadoop一樣,Hbase主要依靠橫向擴(kuò)展來(lái)提高計(jì)算和存儲(chǔ)能力。
Hbase的表具有以下特點(diǎn):
大:一個(gè)表可以有上億行
面向列:面向列族的存儲(chǔ)和權(quán)限控制,列族獨(dú)立檢索。
稀疏:對(duì)于空的列,并不占用空間,因此表可以設(shè)計(jì)的非常稀疏。
邏輯視圖:HBase以表的形式存儲(chǔ)數(shù)據(jù),表由行和列組成,列劃分為若干個(gè)列族row family,如下表所示。
Row Key | Column-family1 | Column-family2 | |
Column1 | Column1 | Column1 | Column2 |
Key1 | t2:abc t1:bcd | t1:354 | |
Key2 | t3:efy t1:uio | t2:tyi t1:456 |
Row Key:檢索數(shù)據(jù)的主鍵,訪問(wèn)HBase中的行,可以通過(guò)單個(gè)row key(字典序,數(shù)值型數(shù)據(jù)需要補(bǔ)0)訪問(wèn);通過(guò)row key的range的訪問(wèn);全表掃描。
列族:表中的每一列,都?xì)w屬于列族,列族是表schema的一部分,必須在使用前定義,而列不是,關(guān)鍵理解。列名都以列族作為前綴,例如courses:history和courses:math都數(shù)據(jù)courses列族。
時(shí)間戳:通過(guò)row和column確定一個(gè)存儲(chǔ)單元cell,每個(gè)cell保存同一份數(shù)據(jù)的多個(gè)版本,通過(guò)時(shí)間戳來(lái)索引。時(shí)間戳為64位證書(shū),精確到毫秒,按時(shí)間倒序排列。為了避免版本過(guò)多,一般通過(guò)個(gè)數(shù)或時(shí)間來(lái)回收。
Cell:由{row key, column(=<family>+<label>),version}唯一確定的單元,cell中數(shù)據(jù)沒(méi)有類型,以字節(jié)碼存儲(chǔ)。
物理存儲(chǔ):指如何將大表分布的存儲(chǔ)在多臺(tái)服務(wù)器。
特點(diǎn):Table上所有行使用row key排列;Table在行方向上分割為多個(gè)HRegion;HRegion按大小分割,每個(gè)表已開(kāi)始只有一個(gè)region,隨著數(shù)據(jù)不斷插入,region增大,當(dāng)超過(guò)閾值是,會(huì)分裂成連個(gè)新的HRegion;HRegion是HBase中分布式存儲(chǔ)和負(fù)載均衡最小單元,表示不同Region可以分布在不同RegionServer上;HRegion是分布式存儲(chǔ)的最小單元,但不是最小存儲(chǔ)單元,實(shí)際上,一個(gè)Region由多個(gè)Store組成,一個(gè)Store保存一個(gè)columns family,一個(gè)Store又由一個(gè)memStore和0-多個(gè)StoreFile(重點(diǎn)是StoreFile就是一個(gè)Hdfs中文件,通過(guò)壓縮存儲(chǔ)減少通信消耗,這兒就找到了對(duì)應(yīng)關(guān)系,還可以細(xì)分,就不介紹了)組成。(腦海里有了大體的印象)
系統(tǒng)架構(gòu)
Client:包含訪問(wèn)HBase接口,client維護(hù)一些cahce來(lái)加快訪問(wèn),比如region未知信息。
ZooKeeper:保證任何時(shí)候集群只有一個(gè)master;存儲(chǔ)所有region尋址接口;實(shí)施監(jiān)控Region Server狀態(tài),將其上下線消息實(shí)時(shí)通知給master;存儲(chǔ)Hbase的schema,包含哪些table,每個(gè)table的column family;為region server分配region;負(fù)責(zé)Region server的負(fù)載均衡;發(fā)現(xiàn)失效的Region Server并重新分配其上Region,GFS上的垃圾文件回收;處理schema更新請(qǐng)求。
Region Server:維護(hù)Master分配給它的Region,處理這些Region的IO請(qǐng)求;切分在運(yùn)行中變得過(guò)大的Region。
Tip:可以看到client訪問(wèn)HBase數(shù)據(jù)的過(guò)程并不需要master參與,尋址訪問(wèn)zookeeper和Region Server,數(shù)據(jù)讀寫(xiě)訪問(wèn)Region Server,master只維護(hù)table和Region的元數(shù)據(jù),負(fù)載低。
關(guān)鍵算法和流程
Region定位:大表使用三層類似B+樹(shù)的結(jié)構(gòu)來(lái)存儲(chǔ)Region位置,第一次保存zookeeper中數(shù)據(jù),持有RootRegion位置;第二層RootRegion是.META表的第一個(gè)Region,其中保存了其他Region的位置;第三層是個(gè)特殊的表,存儲(chǔ)HBase中所有數(shù)據(jù)表的Region位置信息。
讀寫(xiě)過(guò)程:HBase使用MemStore和StoreFile存儲(chǔ)對(duì)表的更新。數(shù)據(jù)在更新時(shí)首先寫(xiě)入Log和MemStore,MemStore中的數(shù)據(jù)是排序的,當(dāng)MemStore累計(jì)到一定閾值,會(huì)創(chuàng)建新MemStore,并將老MemStore添加到Flush隊(duì)列,有單獨(dú)線程寫(xiě)到磁盤,稱為一個(gè)StoreFile,同時(shí)系統(tǒng)會(huì)在zookeeper記錄一個(gè)Redo point,表示更新已經(jīng)持久化。系統(tǒng)出現(xiàn)問(wèn)題是,可以使用log來(lái)恢復(fù)check point之后的數(shù)據(jù)。(思路和傳統(tǒng)數(shù)據(jù)庫(kù)一致)
Region分配:任何時(shí)刻,一個(gè)region只能分配給一個(gè)server,master記錄了當(dāng)前可用的Server以及當(dāng)前region的分配情況,當(dāng)存在未分配region且有server有可用空間時(shí),master就給這個(gè)server發(fā)送一個(gè)裝載請(qǐng)求,分配該region。
Region Server的上下線:master通過(guò)zookeeper來(lái)跟蹤region server狀態(tài),當(dāng)某個(gè)server啟動(dòng)時(shí),會(huì)在zookeeper的server目錄建立代表自己的文件,并獲得該文件獨(dú)占鎖,由于master訂閱了該目錄的變更小心,因此當(dāng)文件出現(xiàn)增刪時(shí),可以接到通知。下線時(shí),斷開(kāi)與zookeeper會(huì)話,釋放獨(dú)占鎖,這時(shí)master會(huì)發(fā)現(xiàn)并刪除對(duì)應(yīng)目錄文件,并將原有region分配給其他server。
master的上下線:從zookeeper獲取唯一master鎖,阻止其他人稱為master;掃描zookeeper上server目錄,獲得region server列表;與每個(gè)server通信,獲得Region分配的情況;掃描META.region集合,計(jì)算得到當(dāng)前未分配的region,放入待分配列表。
安裝與配置
View Code
常見(jiàn)操作
比如創(chuàng)建一個(gè)如下表格
#name | #grad | #course:math | #course:art |
Xionger | 1 | 62 | 60 |
xiongda | 2 | 100 | 98 |
View Code
Tip:
終于完成了,帥,這部分內(nèi)容之后重點(diǎn)在于既有的集成解決方案,包括docker上的部署等。
此外,有空考慮區(qū)塊鏈方面的學(xué)習(xí),同時(shí)把數(shù)據(jù)結(jié)構(gòu)好好再學(xué)習(xí)下,感覺(jué)還是不太OK。,比如B+樹(shù)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章標(biāo)題:Hadoop快速入門-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://aaarwkj.com/article12/cogjgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、云服務(wù)器、移動(dòng)網(wǎng)站建設(shè)、App開(kāi)發(fā)、App設(shè)計(jì)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)