分布式數(shù)據(jù)庫(kù)HBase課件_第1頁(yè)
分布式數(shù)據(jù)庫(kù)HBase課件_第2頁(yè)
分布式數(shù)據(jù)庫(kù)HBase課件_第3頁(yè)
分布式數(shù)據(jù)庫(kù)HBase課件_第4頁(yè)
分布式數(shù)據(jù)庫(kù)HBase課件_第5頁(yè)
已閱讀5頁(yè),還剩133頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

分布式數(shù)據(jù)庫(kù)HBase

分布式數(shù)據(jù)庫(kù)HBase提綱1 概述2 HBase訪問(wèn)接口3 HBase數(shù)據(jù)模型4 HBase的實(shí)現(xiàn)原理5 HBase運(yùn)行機(jī)制6HBase應(yīng)用方案7HBase編程實(shí)踐提綱1 概述1 概述1.1 從BigTable說(shuō)起1.2 HBase簡(jiǎn)介1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析1 概述1.1 從BigTable說(shuō)起Google云計(jì)算技術(shù)具體包括:Google分布式文件系統(tǒng)GFS、分布式計(jì)算編程模型MapReduce、分布式鎖服務(wù)Chubby分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)Bigtable等。

1.1 從BigTable說(shuō)起Google云計(jì)算技術(shù)具體包括:1.1 從BigTable說(shuō)需要存儲(chǔ)的數(shù)據(jù)種類繁多:Google目前向公眾開(kāi)放的服務(wù)很多,需要處理的數(shù)據(jù)類型也非常多。包括URL、網(wǎng)頁(yè)內(nèi)容、用戶的個(gè)性化設(shè)置在內(nèi)的數(shù)據(jù)都是Google需要經(jīng)常處理的海量的服務(wù)請(qǐng)求:Google運(yùn)行著目前世界上最繁忙的系統(tǒng),它每時(shí)每刻處理的客戶服務(wù)請(qǐng)求數(shù)量是現(xiàn)有商用數(shù)據(jù)庫(kù)根本無(wú)法承受的。挑戰(zhàn)Google在數(shù)據(jù)存儲(chǔ)訪問(wèn)方面當(dāng)時(shí)面臨的挑戰(zhàn)

需要存儲(chǔ)的數(shù)據(jù)種類繁多:Google目前向公眾開(kāi)放的服務(wù)很多BigTable設(shè)計(jì)目標(biāo)基本目標(biāo)高可用性

能確保幾乎所有的情況下系統(tǒng)都可用

廣泛的適用性

能滿足系列Google產(chǎn)品簡(jiǎn)單性

底層系統(tǒng)簡(jiǎn)單性既可減少系統(tǒng)出錯(cuò)概率,也為上層應(yīng)用開(kāi)發(fā)帶來(lái)便利

很強(qiáng)的可擴(kuò)展性

根據(jù)需要隨時(shí)可以加入或撤銷服務(wù)器

BigTable設(shè)計(jì)目標(biāo)基本目標(biāo)高可用性能確保幾乎所有的情1.1 從BigTable說(shuō)起B(yǎng)igTable是一個(gè)分布式數(shù)據(jù)存儲(chǔ)系統(tǒng),

起初用于解決典型的互聯(lián)網(wǎng)搜索問(wèn)題,可以擴(kuò)展到PB級(jí)別的數(shù)據(jù)和上千臺(tái)機(jī)器,具備廣泛應(yīng)用性、可擴(kuò)展性、高性能和高可用性等特點(diǎn)。BigTable在互聯(lián)網(wǎng)搜索方面的例子:1

爬蟲(chóng)持續(xù)不斷地抓取新頁(yè)面,這些頁(yè)面每頁(yè)一行地存儲(chǔ)到BigTable里2MapReduce計(jì)算作業(yè)運(yùn)行在整張表上,生成索引,為網(wǎng)絡(luò)搜索應(yīng)用做準(zhǔn)備3

用戶發(fā)起網(wǎng)絡(luò)搜索請(qǐng)求4

網(wǎng)絡(luò)搜索應(yīng)用查詢建立好的索引,從BigTable得到網(wǎng)頁(yè)5

搜索結(jié)果提交給用戶目前,BigTable為谷歌旗下的搜索、地圖、財(cái)經(jīng)、打印、以及社交網(wǎng)站Orkut、視頻共享網(wǎng)站YouTube和博客網(wǎng)站Blogger等業(yè)務(wù)提供技術(shù)支持。1.1 從BigTable說(shuō)起B(yǎng)igTable是一個(gè)分布式數(shù)Bigtable數(shù)據(jù)模型Bigtable是一個(gè)分布式多維映射表,表中的數(shù)據(jù)通過(guò)一個(gè)行關(guān)鍵字(RowKey)、一個(gè)列關(guān)鍵字(ColumnKey)以及一個(gè)時(shí)間戳(TimeStamp)進(jìn)行索引Bigtable對(duì)存儲(chǔ)在其中的數(shù)據(jù)不做任何解析,一律看做字符串Bigtable的存儲(chǔ)邏輯可以表示為:(row:string,column:string,time:int64)→stringBigtable數(shù)據(jù)模型Bigtable是一個(gè)分布式多維Bigtable數(shù)據(jù)模型行Bigtable的行關(guān)鍵字可以是任意的字符串,但是大小不能超過(guò)64KB。Bigtable和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)有很大不同,它不支持一般意義上的事務(wù),但能保證對(duì)于行的讀寫操作具有原子性(Atomic)

表中數(shù)據(jù)都是根據(jù)行關(guān)鍵字進(jìn)行排序的,排序使用的是詞典序。

一個(gè)典型實(shí)例,其中n.www就是一個(gè)行關(guān)鍵字。不直接存儲(chǔ)網(wǎng)頁(yè)地址而將其倒排是Bigtable的一個(gè)巧妙設(shè)計(jì)。帶來(lái)兩個(gè)好處

:同一地址域的網(wǎng)頁(yè)會(huì)被存儲(chǔ)在表中的連續(xù)位置,有利于用戶查找和分析

倒排便于數(shù)據(jù)壓縮,可以大幅提高壓縮率

由于規(guī)模的問(wèn)題,單個(gè)的大表不利于數(shù)據(jù)處理,因此Bigtable將一個(gè)表分成了多個(gè)子表,每個(gè)子表包含多個(gè)行。子表是Bigtable中數(shù)據(jù)劃分和負(fù)載均衡的基本單位。Bigtable數(shù)據(jù)模型行由于規(guī)模的問(wèn)題,單個(gè)的大表不利數(shù)據(jù)模型列

Bigtable并不是簡(jiǎn)單地存儲(chǔ)所有的列關(guān)鍵字,而是將其組織成所謂的列族。每個(gè)族中的一列或者多列數(shù)據(jù)都屬于同一個(gè)類型(如圖中,內(nèi)容、錨點(diǎn)是不同的族)。同族的數(shù)據(jù)會(huì)被壓縮在一起保存

族是Bigtable中訪問(wèn)控制(AccessControl)基本單元,也就是說(shuō)訪問(wèn)權(quán)限的設(shè)置是在族這一級(jí)別上進(jìn)行的數(shù)據(jù)模型列數(shù)據(jù)模型時(shí)間戳

為了簡(jiǎn)化不同版本的數(shù)據(jù)管理,Bigtable目前提供了兩種設(shè)置:一種是保留最近的N個(gè)不同版本,圖中數(shù)據(jù)模型采取的就是這種方法,它保存最新的三個(gè)版本數(shù)據(jù)。另一種就是保留限定時(shí)間內(nèi)的所有不同版本,比如可以保存最近10天的所有不同版本數(shù)據(jù)。失效的版本將會(huì)由Bigtable的垃圾回收機(jī)制自動(dòng)處理

Google的很多服務(wù)比如網(wǎng)頁(yè)檢索和用戶的個(gè)性化設(shè)置等都需要保存不同時(shí)間的數(shù)據(jù),這些不同的數(shù)據(jù)版本必須通過(guò)時(shí)間戳來(lái)區(qū)分。數(shù)據(jù)模型時(shí)間戳Google的很多服務(wù)比如網(wǎng)頁(yè)檢索和用戶的系統(tǒng)架構(gòu)讀/寫元數(shù)據(jù)操作Bigtable數(shù)據(jù)庫(kù)主要由三個(gè)部分組成:客戶端程序庫(kù)(ClientLibrary),一個(gè)主服務(wù)器(MasterServer)和多個(gè)子表服務(wù)器(TabletServer)。在Bigtable中,整個(gè)數(shù)據(jù)庫(kù)看成一張大表,并會(huì)劃分為許多基本子表(bigtable中最小的處理單位)。子表服務(wù)器存儲(chǔ)實(shí)際數(shù)據(jù),并負(fù)責(zé)處理數(shù)據(jù)的讀寫,并在子表過(guò)大時(shí)進(jìn)行拆分。主服務(wù)器負(fù)責(zé)將子表分配到各子表服務(wù)器、檢測(cè)新增和過(guò)期的子表服務(wù)器、平衡子表服務(wù)器之間的負(fù)載、數(shù)據(jù)模式的改變(例如創(chuàng)建表)等。Chubby作用:1.選取并保證同一時(shí)間內(nèi)只有一個(gè)主服務(wù)器(MasterServer);2.獲取子表的位置信息;3.保存Bigtable的訪問(wèn)控制列表??蛻粼L問(wèn)Bigtable服務(wù)時(shí),首先要利用其庫(kù)函數(shù)執(zhí)行Open()操作來(lái)打開(kāi)一個(gè)鎖(實(shí)際上就是獲取了文件目錄),鎖打開(kāi)以后客戶端就可以和子表服務(wù)器進(jìn)行通信和許多具有單個(gè)主節(jié)點(diǎn)分布式系統(tǒng)一樣,客戶端主要與子表服務(wù)器通信,幾乎不和主服務(wù)器進(jìn)行通信,這使得主服務(wù)器的負(fù)載大大降低系統(tǒng)架構(gòu)讀/寫元數(shù)據(jù)操作Bigtable數(shù)據(jù)庫(kù)主要由三個(gè)部1.2 HBase簡(jiǎn)介HBase是一個(gè)高可靠、高性能、面向列、可伸縮的分布式數(shù)據(jù)庫(kù),是谷歌BigTable的開(kāi)源實(shí)現(xiàn),主要用來(lái)存儲(chǔ)非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。HBase的目標(biāo)是處理非常龐大的表,可以通過(guò)水平擴(kuò)展的方式,利用廉價(jià)計(jì)算機(jī)集群處理由超過(guò)10億行數(shù)據(jù)和數(shù)百萬(wàn)列元素組成的數(shù)據(jù)表Hadoop生態(tài)系統(tǒng)中HBase與其他部分的關(guān)系Hadoop1.2 HBase簡(jiǎn)介HBase是一個(gè)高可靠、高性能、面向列1.2 HBase簡(jiǎn)介關(guān)系數(shù)據(jù)庫(kù)已經(jīng)流行很多年,為什么需要HBase?傳統(tǒng)通用關(guān)系型數(shù)據(jù)庫(kù)無(wú)法應(yīng)對(duì)在數(shù)據(jù)規(guī)模劇增時(shí)導(dǎo)致的系統(tǒng)擴(kuò)展性和性能問(wèn)題傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)在數(shù)據(jù)結(jié)構(gòu)變化時(shí)一般需要停機(jī)維護(hù);空列浪費(fèi)存儲(chǔ)空間因此,出現(xiàn)了一類面向半結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)和訪問(wèn)的高可擴(kuò)展、低寫入/查詢延遲的系統(tǒng)HBase。目前,HBase已經(jīng)成功應(yīng)用于互聯(lián)網(wǎng)服務(wù)領(lǐng)域和傳統(tǒng)行業(yè)的眾多在線式數(shù)據(jù)分析處理系統(tǒng)中。1.2 HBase簡(jiǎn)介關(guān)系數(shù)據(jù)庫(kù)已經(jīng)流行很多年,為什么需要H1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析HBase與傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)的區(qū)別主要體現(xiàn)在以下幾個(gè)方面:(1)數(shù)據(jù)類型:關(guān)系數(shù)據(jù)庫(kù)具有豐富的數(shù)據(jù)類型和存儲(chǔ)方式,HBase則采用了更加簡(jiǎn)單的數(shù)據(jù)模型,它把數(shù)據(jù)存儲(chǔ)為未經(jīng)解釋的字符串。(2)數(shù)據(jù)操作:關(guān)系數(shù)據(jù)庫(kù)中包含了豐富的操作,其中會(huì)涉及復(fù)雜的多表連接。HBase操作則不存在復(fù)雜的表與表之間的關(guān)系,只有簡(jiǎn)單的插入、查詢、刪除、清空等,因?yàn)镠Base在設(shè)計(jì)上就避免了復(fù)雜的表和表之間的關(guān)系。(3)存儲(chǔ)模式:關(guān)系數(shù)據(jù)庫(kù)是基于行模式存儲(chǔ)的。HBase是基于列存儲(chǔ)的,每個(gè)列族都由幾個(gè)文件保存,不同列族的文件是分離的。1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析HBase與傳統(tǒng)1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析(4)數(shù)據(jù)索引:關(guān)系數(shù)據(jù)庫(kù)通??梢葬槍?duì)不同列構(gòu)建復(fù)雜的多個(gè)索引,以提高數(shù)據(jù)訪問(wèn)性能。HBase只有一個(gè)索引——行鍵(5)數(shù)據(jù)維護(hù):在關(guān)系數(shù)據(jù)庫(kù)中,更新操作會(huì)用最新的當(dāng)前值去替換記錄中原來(lái)的舊值,舊值被覆蓋后就不會(huì)存在。而在HBase中執(zhí)行更新操作時(shí),并不會(huì)刪除數(shù)據(jù)舊的版本,而是生成一個(gè)新的版本,舊有的版本仍然保留(6)可伸縮性:關(guān)系數(shù)據(jù)庫(kù)水平擴(kuò)展空間有限。相反,HBase就是為了實(shí)現(xiàn)靈活的水平擴(kuò)展而開(kāi)發(fā)的,能夠輕易地通過(guò)在集群中增加或者減少硬件數(shù)量來(lái)實(shí)現(xiàn)性能的伸縮1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析(4)數(shù)據(jù)索引:2 HBase訪問(wèn)接口HBase訪問(wèn)接口類型特點(diǎn)場(chǎng)合NativeJavaAPI最常規(guī)和高效的訪問(wèn)方式適合HadoopMapReduce作業(yè)并行批處理HBase表數(shù)據(jù)HBaseShellHBase的命令行工具,最簡(jiǎn)單的接口適合HBase管理使用ThriftGateway利用Thrift序列化技術(shù),支持C++、PHP、Python等多種語(yǔ)言適合其他異構(gòu)系統(tǒng)在線訪問(wèn)HBase表數(shù)據(jù)RESTGateway解除了語(yǔ)言限制支持REST風(fēng)格的HttpAPI訪問(wèn)HBasePig使用PigLatin流式編程語(yǔ)言來(lái)處理HBase中的數(shù)據(jù)適合做數(shù)據(jù)統(tǒng)計(jì)Hive簡(jiǎn)單當(dāng)需要以類似SQL語(yǔ)言方式來(lái)訪問(wèn)HBase的時(shí)候2 HBase訪問(wèn)接口HBase訪問(wèn)接口類型特點(diǎn)場(chǎng)合Nati3 HBase數(shù)據(jù)模型3.1 數(shù)據(jù)模型概述3.2 數(shù)據(jù)模型相關(guān)概念3.3 數(shù)據(jù)坐標(biāo)3.4 概念視圖3.5 物理視圖3.6 面向列的存儲(chǔ)3 HBase數(shù)據(jù)模型3.1 數(shù)據(jù)模型概述3.1 數(shù)據(jù)模型概述HBase是一個(gè)稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時(shí)間戳每個(gè)值是一個(gè)未經(jīng)解釋的字符串,沒(méi)有數(shù)據(jù)類型用戶在表中存儲(chǔ)數(shù)據(jù),每一行都有一個(gè)可排序的行鍵和任意多的列表在水平方向由一個(gè)或者多個(gè)列族組成,一個(gè)列族中可以包含任意多個(gè)列,同一個(gè)列族里面的數(shù)據(jù)存儲(chǔ)在一起列族支持動(dòng)態(tài)擴(kuò)展,可以很輕松地添加一個(gè)列族或列,無(wú)需預(yù)先定義列的數(shù)量以及類型,所有列均以字符串形式存儲(chǔ),用戶需要自行進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換HBase中執(zhí)行更新操作時(shí),并不會(huì)刪除數(shù)據(jù)舊的版本,而是生成一個(gè)新的版本,舊有的版本仍然保留(這是和HDFS只允許追加不允許修改的特性相關(guān)的)3.1 數(shù)據(jù)模型概述HBase是一個(gè)稀疏、多維度、排序的映射3.2 數(shù)據(jù)模型相關(guān)概念表:HBase采用表來(lái)組織數(shù)據(jù),表由行和列組成,列劃分為若干個(gè)列族行:每個(gè)HBase表都由若干行組成,每個(gè)行由行鍵(rowkey)來(lái)標(biāo)識(shí)。列族:一個(gè)HBase表被分組成許多“列族”(ColumnFamily)的集合,它是基本的訪問(wèn)控制單元列限定符:列族里的數(shù)據(jù)通過(guò)列限定符(或列)來(lái)定位單元格:在HBase表中,通過(guò)行、列族和列限定符確定一個(gè)“單元格”(cell),單元格中存儲(chǔ)的數(shù)據(jù)沒(méi)有數(shù)據(jù)類型,總被視為字節(jié)數(shù)組byte[]時(shí)間戳:每個(gè)單元格都保存著同一份數(shù)據(jù)的多個(gè)版本,這些版本采用時(shí)間戳進(jìn)行索引3.2 數(shù)據(jù)模型相關(guān)概念表:HBase采用表來(lái)組織數(shù)據(jù),表由3.3 數(shù)據(jù)坐標(biāo)HBase中需要根據(jù)行鍵、列族、列限定符和時(shí)間戳來(lái)確定一個(gè)單元格,因此,可以視為一個(gè)“四維坐標(biāo)”,即[行鍵,列族,列限定符,時(shí)間戳]鍵值[“201505003”,“Info”,“email”,1174184619081]“xie@”[“201505003”,“Info”,“email”,1174184620720]“you@163.com”3.3 數(shù)據(jù)坐標(biāo)HBase中需要根據(jù)行鍵、列族、列限定符和時(shí)3.4 邏輯視圖

HBase數(shù)據(jù)的邏輯視圖行鍵時(shí)間戳列族contents列族anchor"n.www"t5anchor:=”CNN”t4anchor:my.look.ca="CNN.com"t3contents:html="<html>..."t2contents:html="<html>..."t1contents:html="<html>..."3.4 邏輯視圖HBase數(shù)據(jù)的邏輯視圖行鍵時(shí)間戳列族c3.5 物理視圖

HBase數(shù)據(jù)的物理視圖:基于列的存儲(chǔ)行鍵時(shí)間戳列族contents"n.www"t3contents:html="<html>..."t2contents:html="<html>..."t1contents:html="<html>..."行鍵時(shí)間戳列族anchor"n.www"t5anchor:=”CNN”t4anchor:my.look.ca="CNN.com"列族contents列族anchor3.5 物理視圖HBase數(shù)據(jù)的物理視圖:基于列的存儲(chǔ)行3.6 面向列的存儲(chǔ)

行式數(shù)據(jù)庫(kù)和列式數(shù)據(jù)庫(kù)示意圖3.6 面向列的存儲(chǔ)行式數(shù)據(jù)庫(kù)和列式數(shù)據(jù)庫(kù)示意圖3.6 面向列的存儲(chǔ)

行式存儲(chǔ)結(jié)構(gòu)和列式存儲(chǔ)結(jié)構(gòu)3.6 面向列的存儲(chǔ)行式存儲(chǔ)結(jié)構(gòu)和列式存儲(chǔ)結(jié)構(gòu)4 HBase的實(shí)現(xiàn)原理1 HBase功能組件2 表和Region3 Region的定位4 HBase的實(shí)現(xiàn)原理1 HBase功能組件1 HBase功能組件HBase的實(shí)現(xiàn)包括三個(gè)主要的功能組件:(1)庫(kù)函數(shù):鏈接到每個(gè)客戶端(2)一個(gè)Master主服務(wù)器(3)許多個(gè)Region服務(wù)器主服務(wù)器Master負(fù)責(zé)管理和維護(hù)HBase表的分區(qū)信息,維護(hù)Region服務(wù)器列表,分配Region,負(fù)載均衡Region服務(wù)器負(fù)責(zé)存儲(chǔ)和維護(hù)分配給自己的Region,處理來(lái)自客戶端的讀寫請(qǐng)求客戶端并不是直接從Master主服務(wù)器上讀取數(shù)據(jù),而是在獲得Region的存儲(chǔ)位置信息后,直接從Region服務(wù)器上讀取數(shù)據(jù)客戶端并不依賴Master,而是通過(guò)Zookeeper來(lái)獲得Region位置信息,大多數(shù)客戶端甚至從來(lái)不和Master通信,這種設(shè)計(jì)方式使得Master負(fù)載很小

1 HBase功能組件HBase的實(shí)現(xiàn)包括三個(gè)主要的功能組件2 表和Region一個(gè)HBase表被劃分成多個(gè)Region

一個(gè)Region會(huì)分裂成多個(gè)新的Region開(kāi)始只有一個(gè)Region,后來(lái)不斷分裂Region拆分操作非???,接近瞬間,因?yàn)椴鸱种蟮腞egion讀取的仍然是原存儲(chǔ)文件,直到“合并”過(guò)程把存儲(chǔ)文件異步地寫到獨(dú)立的文件之后,才會(huì)讀取新文件2 表和Region一個(gè)HBase表被劃分成多個(gè)Regio2 表和Region圖4-7不同的Region可以分布在不同的Region服務(wù)器上每個(gè)Region默認(rèn)大小是100MB到200MB(2006年以前的硬件配置)每個(gè)Region的最佳大小取決于單臺(tái)服務(wù)器的有效處理能力目前每個(gè)Region最佳大小建議1GB-2GB(2013年以后的硬件配置)同一個(gè)Region不會(huì)被分拆到多個(gè)Region服務(wù)器每個(gè)Region服務(wù)器存儲(chǔ)10-1000個(gè)Region2 表和Region圖4-7不同的Region可以分布在不3 Region的定位

HBase的三層結(jié)構(gòu)元數(shù)據(jù)表,又名.META.表,存儲(chǔ)了Region和Region服務(wù)器的映射關(guān)系當(dāng)HBase表很大時(shí),.META.表也會(huì)被分裂成多個(gè)Region根數(shù)據(jù)表,又名-ROOT-表,記錄所有元數(shù)據(jù)的具體位置-ROOT-表只有唯一一個(gè)Region,名字是在程序中被寫死的Zookeeper文件記錄了-ROOT-表的位置3 Region的定位HBase的三層結(jié)構(gòu)元數(shù)據(jù)表,又名3 Region的定位

HBase的三層結(jié)構(gòu)中各層次的名稱和作用層次名稱作用第一層Zookeeper文件記錄了-ROOT-表的位置信息第二層-ROOT-表記錄了.META.表的Region位置信息-ROOT-表只能有一個(gè)Region。通過(guò)-ROOT-表,就可以訪問(wèn).META.表中的數(shù)據(jù)第三層.META.表記錄了用戶數(shù)據(jù)表的Region位置信息,.META.表可以有多個(gè)Region,保存了HBase中所有用戶數(shù)據(jù)表的Region位置信息3 Region的定位HBase的三層結(jié)構(gòu)中各層次的名稱3 Region的定位客戶端訪問(wèn)數(shù)據(jù)時(shí)的“三級(jí)尋址”為了加速尋址,客戶端會(huì)緩存位置信息,同時(shí),需要解決緩存失效問(wèn)題尋址過(guò)程客戶端只需要詢問(wèn)Zookeeper服務(wù)器,不需要連接Master服務(wù)器3 Region的定位客戶端訪問(wèn)數(shù)據(jù)時(shí)的“三級(jí)尋址”3 Region的定位

為了加快訪問(wèn)速度,.META.表的全部Region都會(huì)被保存在內(nèi)存中。

假設(shè).META.表的每行(一個(gè)映射條目)在內(nèi)存中大約占用1KB,并且每個(gè)Region限制為128MB,那么,上面的三層結(jié)構(gòu)可以保存的用戶數(shù)據(jù)表的Region數(shù)目是:(-ROOT-表能夠?qū)ぶ返?META.表的Region個(gè)數(shù))×(每個(gè).META.表的Region可以尋址的用戶數(shù)據(jù)表的Region個(gè)數(shù))

一個(gè)-ROOT-表最多只能有一個(gè)Region,也就是最多只能有128MB,按照每行(一個(gè)映射條目)占用1KB內(nèi)存計(jì)算,128MB空間可以容納128MB/1KB=217行,也就是說(shuō),一個(gè)-ROOT-表可以尋址217個(gè).META.表的Region。同理,每個(gè).META.表的Region可以尋址的用戶數(shù)據(jù)表的Region個(gè)數(shù)是128MB/1KB=217。最終,三層結(jié)構(gòu)可以保存的Region數(shù)目是(128MB/1KB)×(128MB/1KB)=234個(gè)Region3 Region的定位為了加快訪問(wèn)速度,.META.表的5 HBase運(yùn)行機(jī)制5.1 HBase系統(tǒng)架構(gòu)5.2 Region服務(wù)器工作原理5.3 Store工作原理5.4 HLog工作原理5 HBase運(yùn)行機(jī)制5.1 HBase系統(tǒng)架構(gòu)5.1 HBase系統(tǒng)架構(gòu)

HBase的系統(tǒng)架構(gòu)1.客戶端客戶端包含訪問(wèn)HBase的接口,同時(shí)在緩存中維護(hù)著已經(jīng)訪問(wèn)過(guò)的Region位置信息,用來(lái)加快后續(xù)數(shù)據(jù)訪問(wèn)過(guò)程2.Zookeeper服務(wù)器Zookeeper可以幫助選舉出一個(gè)Master作為集群的總管,并保證在任何時(shí)刻總有唯一一個(gè)Master在運(yùn)行,同時(shí)避免Master的“單點(diǎn)失效”問(wèn)題3.Master主服務(wù)器Master主要負(fù)責(zé)表和Region的管理工作:管理用戶對(duì)表的增加、刪除、修改、查詢等操作實(shí)現(xiàn)不同Region服務(wù)器之間的負(fù)載均衡在Region分裂或合并后,負(fù)責(zé)重新調(diào)整Region的分布對(duì)發(fā)生故障失效的Region服務(wù)器上的Region進(jìn)行遷移Region服務(wù)器Region服務(wù)器是HBase中最核心的模塊,負(fù)責(zé)維護(hù)分配給自己的Region,并響應(yīng)用戶的讀寫請(qǐng)求5.1 HBase系統(tǒng)架構(gòu)HBase的系統(tǒng)架構(gòu)1.客戶5.1 HBase系統(tǒng)架構(gòu)Zookeeper是一個(gè)很好的集群管理工具,被大量用于分布式計(jì)算,提供配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。5.1 HBase系統(tǒng)架構(gòu)Zookeeper是一個(gè)很好的集群5.2 Region服務(wù)器工作原理Region服務(wù)器向HDFS文件系統(tǒng)中讀寫數(shù)據(jù)1.用戶讀寫數(shù)據(jù)過(guò)程

2.緩存的刷新3.StoreFile的合并5.2 Region服務(wù)器工作原理Region服務(wù)器向HDF5.2 Region服務(wù)器工作原理1.用戶讀寫數(shù)據(jù)過(guò)程

用戶寫入數(shù)據(jù)時(shí),被分配到相應(yīng)Region服務(wù)器去執(zhí)行用戶數(shù)據(jù)首先被寫入到MemStore和Hlog中只有當(dāng)操作寫入Hlog之后,commit()調(diào)用才會(huì)將其返回給客戶端當(dāng)用戶讀取數(shù)據(jù)時(shí),Region服務(wù)器會(huì)首先訪問(wèn)MemStore緩存,如果找不到,再去磁盤上面的StoreFile中尋找5.2 Region服務(wù)器工作原理1.用戶讀寫數(shù)據(jù)過(guò)程用5.2 Region服務(wù)器工作原理2.緩存的刷新系統(tǒng)會(huì)周期性地把MemStore緩存里的內(nèi)容刷寫到磁盤的StoreFile文件中,清空緩存,并在Hlog里面寫入一個(gè)標(biāo)記每次刷寫都生成一個(gè)新的StoreFile文件,因此,每個(gè)Store包含多個(gè)StoreFile文件每個(gè)Region服務(wù)器都有一個(gè)自己的HLog文件,每次啟動(dòng)都檢查該文件,確認(rèn)最近一次執(zhí)行緩存刷新操作之后是否發(fā)生新的寫入操作;如果發(fā)現(xiàn)更新,則先寫入MemStore,再刷寫到StoreFile,最后刪除舊的Hlog文件,開(kāi)始為用戶提供服務(wù)5.2 Region服務(wù)器工作原理2.緩存的刷新系統(tǒng)會(huì)周期5.2 Region服務(wù)器工作原理3.StoreFile的合并每次刷寫都生成一個(gè)新的StoreFile,數(shù)量太多,影響查找速度調(diào)用Spact()把多個(gè)合并成一個(gè)合并操作比較耗費(fèi)資源,只有數(shù)量達(dá)到一個(gè)閾值才啟動(dòng)合并5.2 Region服務(wù)器工作原理3.StoreFile的5.3 Store工作原理

StoreFile的合并和分裂過(guò)程Store是Region服務(wù)器的核心多個(gè)StoreFile合并成一個(gè)單個(gè)StoreFile過(guò)大時(shí),又觸發(fā)分裂操作,1個(gè)父Region被分裂成兩個(gè)子Region5.3 Store工作原理StoreFile的合并和分裂5.4 HLog工作原理分布式環(huán)境必須要考慮系統(tǒng)出錯(cuò)。HBase采用HLog保證系統(tǒng)恢復(fù)HBase系統(tǒng)為每個(gè)Region服務(wù)器配置了一個(gè)HLog文件,它是一種預(yù)寫式日志(WriteAheadLog)用戶更新數(shù)據(jù)必須首先寫入日志后,才能寫入MemStore緩存,并且,直到MemStore緩存內(nèi)容對(duì)應(yīng)的日志已經(jīng)寫入磁盤,該緩存內(nèi)容才能被刷寫到磁盤5.4 HLog工作原理分布式環(huán)境必須要考慮系統(tǒng)出錯(cuò)。HBa5.4 HLog工作原理Zookeeper會(huì)實(shí)時(shí)監(jiān)測(cè)每個(gè)Region服務(wù)器的狀態(tài),當(dāng)某個(gè)Region服務(wù)器發(fā)生故障時(shí),Zookeeper會(huì)通知MasterMaster首先會(huì)處理該故障Region服務(wù)器上面遺留的HLog文件,這個(gè)遺留的HLog文件中包含了來(lái)自多個(gè)Region對(duì)象的日志記錄系統(tǒng)會(huì)根據(jù)每條日志記錄所屬的Region對(duì)象對(duì)HLog數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)Region對(duì)象的目錄下,然后,再將失效的Region重新分配到可用的Region服務(wù)器中,并把與該Region對(duì)象相關(guān)的HLog日志記錄也發(fā)送給相應(yīng)的Region服務(wù)器Region服務(wù)器領(lǐng)取到分配給自己的Region對(duì)象以及與之相關(guān)的HLog日志記錄以后,會(huì)重新做一遍日志記錄中的各種操作,把日志記錄中的數(shù)據(jù)寫入到MemStore緩存中,然后,刷新到磁盤的StoreFile文件中,完成數(shù)據(jù)恢復(fù)共用日志優(yōu)點(diǎn):提高對(duì)表的寫操作性能;缺點(diǎn):恢復(fù)時(shí)需要分拆日志5.4 HLog工作原理Zookeeper會(huì)實(shí)時(shí)監(jiān)測(cè)每個(gè)Re6HBase訪問(wèn)方式NativeJavaAPI最常規(guī)和高效的訪問(wèn)方式HBaseShellHBase的命令行工具,最簡(jiǎn)單的接口,適合HBase管理使用;ThriftGateway利用Thrift序列化技術(shù),支持C++,PHP,Python等多種語(yǔ)言,適合其他異構(gòu)系統(tǒng)在線訪問(wèn)HBase表數(shù)據(jù)RESTGateway支持REST風(fēng)格的HttpAPI訪問(wèn)HBase,解除了語(yǔ)言限制MapReduce直接使用MapReduce作業(yè)處理Hbase數(shù)據(jù)使用Pig/hive處理Hbase數(shù)據(jù)6HBase訪問(wèn)方式NativeJavaAPIHBaseJavaAPI概述Hbase是用Java語(yǔ)言編寫的,支持Java編程是自然而然的事情支持CRUD操作:Create,Read,Update,DeleteJavaAPI包含Hbaseshell支持的所有功能,甚至更多JavaAPI是訪問(wèn)Hbase最快的方式HBaseJavaAPI概述Hbase是用Java語(yǔ)言編JavaAPI程序設(shè)計(jì)步驟步驟1:創(chuàng)建一個(gè)Configuration對(duì)象包含各種配置信息例如:Configurationconf=HbaseConfiguration.create();步驟2:構(gòu)建一個(gè)HTable句柄提供Configuration對(duì)象提供待訪問(wèn)Table的名稱例如:HTabletable=newHTable(conf,tableName);步驟3:執(zhí)行相應(yīng)的操作執(zhí)行put、get、delete、scan等操作例如:table.getTableName();步驟4:關(guān)閉HTable句柄將內(nèi)存數(shù)據(jù)刷新到磁盤上釋放各種資源例如:table.close();JavaAPI程序設(shè)計(jì)步驟步驟1:創(chuàng)建一個(gè)Configur程序示例框架程序程序示例框架程序7HBase編程實(shí)踐7.1HBase的安裝與配置7.2 HBase常用Shell命令7.3 HBase常用JavaAPI及應(yīng)用實(shí)例7HBase編程實(shí)踐7.1HBase的安裝與配置7.1HBase的安裝與配置1.HBase安裝下載安裝包hbase-1.1.2-bin.tar.gz解壓安裝包hbase-1.1.2-bin.tar.gz至路徑/usr/local配置系統(tǒng)環(huán)境,將hbase下的bin目錄添加到系統(tǒng)的path中2.HBase配置HBase有三種運(yùn)行模式,單機(jī)模式、偽分布式模式、分布式模式。

以下先決條件很重要,比如沒(méi)有配置JAVA_HOME環(huán)境變量,就會(huì)報(bào)錯(cuò)。

–JDK

–Hadoop(單機(jī)模式不需要,偽分布式模式和分布式模式需要)

–SSH備注:安裝完Hadoop時(shí),只包含HDFS和MapReduce等核心組件,并不包含HBase,因此,HBase需要單獨(dú)安裝啟動(dòng)關(guān)閉Hadoop和HBase的順序一定是:

啟動(dòng)Hadoop—>啟動(dòng)HBase—>關(guān)閉HBase—>關(guān)閉HadoopHBASE_MANAGES_ZK=true,由HBase管理Zookeeper,否則啟動(dòng)獨(dú)立的Zookeeper.建議:?jiǎn)螜C(jī)版HBase,使用自帶Zookeeper;集群安裝HBase則采用單獨(dú)Zookeeper集群7.1HBase的安裝與配置1.HBase安裝下載安裝包7.2

HBase常用Shell命令Shell命令幫助

7.2 HBase常用Shell命令Shell命令幫助查詢數(shù)據(jù)庫(kù)狀態(tài)

hbase(main):024:0>status3servers,0dead,1.0000averageload查詢數(shù)據(jù)庫(kù)版本

hbase(main):025:0>version0.90.4,r1150278,SunJul2415:53:29PDT20117.2

HBase常用Shell命令查詢數(shù)據(jù)庫(kù)狀態(tài)hbase(main):024:0>stat7.2

HBase常用Shell命令create:創(chuàng)建表list:列出HBase中所有的表信息例子1:創(chuàng)建一個(gè)表,該表名稱為tempTable,包含3個(gè)列族f1,f2和f3(1)利用命令create創(chuàng)建表tempTable,表中有f1,f2,f3三個(gè)列族(2)利用list列出Hbase中所有的表信息7.2 HBase常用Shell命令create:創(chuàng)建表例7.2 HBase常用Shell命令put:向表、行、列指定的單元格添加數(shù)據(jù)一次只能為一個(gè)表的一行數(shù)據(jù)的一個(gè)列添加一個(gè)數(shù)據(jù)scan:瀏覽表的相關(guān)信息例子2:繼續(xù)向表tempTable中的第r1行、第“f1:c1”列,添加數(shù)據(jù)值為“hello,dblab”(1)利用put命令向表tempTalble,行r1,列f1:c1中插入數(shù)據(jù)(2)利用scan命令瀏覽表tempTable的相關(guān)信息在添加數(shù)據(jù)時(shí),HBase會(huì)自動(dòng)為添加的數(shù)據(jù)添加一個(gè)時(shí)間戳,當(dāng)然,也可以在添加數(shù)據(jù)時(shí)人工指定時(shí)間戳的值.7.2 HBase常用Shell命令put:向表、行、列指7.2 HBase常用Shell命令get:通過(guò)表名、行、列、時(shí)間戳、時(shí)間范圍和版本號(hào)來(lái)獲得相應(yīng)單元格的值例子3:(1)從tempTable中,獲取第r1行、第“f1:c1”列的值(2)從tempTable中,獲取第r1行、第“f1:c3”列的值備注:f1是列族,c1和c3都是列從運(yùn)行結(jié)果可以看出:tempTable中第r1行、第“f1:c3”列的值當(dāng)前不存在7.2 HBase常用Shell命令get:通過(guò)表名、行、7.2 HBase常用Shell命令enable/disable:使表有效或無(wú)效drop:刪除表例子4:使表tempTable無(wú)效、刪除該表(1)利用disable命令使表tempTable無(wú)效(2)利用drop命令刪除表tempTable(3)利用list命令展示刪除表tempTable后的效果7.2 HBase常用Shell命令enable/disab7.3 HBase常用JavaAPI及應(yīng)用實(shí)例HBase是Java編寫的,它的原生的API也是Java開(kāi)發(fā)的,不過(guò),可以使用Java或其他語(yǔ)言調(diào)用API來(lái)訪問(wèn)HBase:首先要在工程中導(dǎo)入一下jar包:

這里只需要導(dǎo)入hbase安裝目錄中的lib文件中的所有jar包,此處不用再導(dǎo)入Hadoop中的jar包,避免由于Hadoop和HBase的版本沖突引起錯(cuò)誤。7.3 HBase常用JavaAPI及應(yīng)用實(shí)例HBase是7.3 HBase常用JavaAPI及應(yīng)用實(shí)例namescoreEnglishMathComputer學(xué)生信息表的表結(jié)構(gòu)任務(wù)要求:創(chuàng)建表、插入數(shù)據(jù)、瀏覽數(shù)據(jù)創(chuàng)建一個(gè)學(xué)生信息表,用來(lái)存儲(chǔ)學(xué)生姓名(姓名作為行鍵,并且假設(shè)姓名不會(huì)重復(fù))以及考試成績(jī),其中,考試成績(jī)是一個(gè)列族,分別存儲(chǔ)了各個(gè)科目的考試成績(jī)。邏輯視圖如表所示。namescoreEnglishMathComputerzhangsan698677lisi5510088需要添加的數(shù)據(jù)7.3 HBase常用JavaAPI及應(yīng)用實(shí)例namescimportorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.hbase.*;

importorg.apache.hadoop.hbase.client.*;

importorg.apache.hadoop.hbase.util.Bytes;

importjava.io.IOException;

publicclassChapter4{

publicstaticConfigurationconfiguration;

publicstaticConnectionconnection;

publicstaticAdminadmin;

publicstaticvoidmain(String[]args)throwsIOException{

createTable(“student”,newString[]{“score”});

insertData(“student”,“zhangsan”,“score”,“English”,“69”);

insertData(“student”,“zhangsan”,“score”,“Math”,“86”);

insertData(“student”,“zhangsan”,“score”,“Computer”,“77”);

getData(“student”,“zhangsan”,“score”,“English”);

}……publicstaticvoidinit(){……}//建立連接publicstaticvoidclose(){……}//關(guān)閉連接publicstaticvoidcreateTable(){……}//創(chuàng)建表publicstaticvoidinsertData(){……}//插入數(shù)據(jù)publicstaticvoidgetData{……}//瀏覽數(shù)據(jù)}importorg.apache.hadoop.conf.7.3 HBase常用JavaAPI及應(yīng)用實(shí)例建立連接//建立連接

publicstaticvoidinit(){

configuration=HBaseConfiguration.create();

configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");

try{

connection=ConnectionFactory.createConnection(configuration);

admin=connection.getAdmin();

}catch(IOExceptione){

e.printStackTrace();

}

}7.3 HBase常用JavaAPI及應(yīng)用實(shí)例建立連接///*創(chuàng)建表*//***@parammyTableName表名*@paramcolFamily列族數(shù)組*@throwsException*/ publicstaticvoidcreateTable(StringmyTableName,String[]colFamily)throwsIOException{TableNametableName=TableName.valueOf(myTableName);if(admin.tableExists(tableName)){System.out.println("tableexists!");}else{HTableDescriptorhTableDescriptor=newHTableDescriptor(tableName);for(Stringstr:colFamily){HColumnDescriptorhColumnDescriptor=newHColumnDescriptor(str);hTableDescriptor.addFamily(hColumnDescriptor);}admin.createTable(hTableDescriptor);}}在運(yùn)行程序時(shí),需要指定參數(shù)myTableName為“student”,colFamily為“{“score”}”程序的運(yùn)行效果與如下HBaseShell命令等效:create‘student’,‘score’namescoreEnglishMathComputer①建表/*創(chuàng)建表*/在運(yùn)行程序時(shí),需要指定參數(shù)myTableNam②添加數(shù)據(jù)/*添加數(shù)據(jù)*//** *@paramtableName表名 *@paramrowKey行鍵 *@paramcolFamily列族 *@paramcol列限定符 *@paramval數(shù)據(jù) *@throwsException */publicstaticvoidinsertData(StringtableName,StringrowKey,StringcolFamily,Stringcol,Stringval)throwsIOException{Tabletable=connection.getTable(TableName.valueOf(tableName));Putput=newPut(Bytes.toBytes(rowkey));put.addColumn(Bytes.toBytes(colFamily),Bytes.toBytes(col),Bytes.toBytes(val));table.put(put);table.close();}namescoreEnglishMathComputerzhangsan698677lisi5510088②添加數(shù)據(jù)/*添加數(shù)據(jù)*/namescoreEnglishM7.3

HBase常用JavaAPI及應(yīng)用實(shí)例添加數(shù)據(jù)時(shí),需要分別設(shè)置參數(shù)myTableName、rowkey、colFamily、col、val的值,然后運(yùn)行上述代碼例如添加第一行數(shù)據(jù)時(shí),為insertData()方法指定相應(yīng)參數(shù),并運(yùn)行如下3行代碼:insertData("student","zhangsan","score","English","69");insertData("student","zhangsan","score","Math","86");insertData("student","zhangsan","score","Computer","77");上述代碼與如下HBaseShell命令等效:put'student',’zhangsan’,’score:English’,’69’;put'student',’zhangsan’,’score:Math’,’86’;put'student',’zhangsan’,’score:Computer’,’77’;7.3 HBase常用JavaAPI及應(yīng)用實(shí)例添加數(shù)據(jù)7.3 HBase常用JavaAPI及應(yīng)用實(shí)例③瀏覽數(shù)據(jù)/*獲取某單元格數(shù)據(jù)*//** *@paramtableName表名 *@paramrowKey行鍵 *@paramcolFamily列族 *@paramcol列限定符*@throwsIOException*/publicstaticvoidgetData(StringtableName,StringrowKey,StringcolFamily,Stringcol)throwsIOException{Tabletable=connection.getTable(TableName.valueOf(tableName));Getget=newGet(Bytes.toBytes(rowkey)); get.addColumn(Bytes.toBytes(colFamily),Bytes.toBytes(col));//獲取的result數(shù)據(jù)是結(jié)果集,還需要格式化輸出想要的數(shù)據(jù)才行

Resultresult=table.get(get);System.out.println(newString(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));

table.close();}7.3 HBase常用JavaAPI及應(yīng)用實(shí)例③瀏覽數(shù)據(jù)/7.3 HBase常用JavaAPI及應(yīng)用實(shí)例比如,現(xiàn)在要獲取姓名為“zhangsan”在“English”上的數(shù)據(jù),就可以在運(yùn)行上述代碼時(shí),指定參數(shù)tableName為“student”、rowKey為“zhangsan”、colFamily為“score”、col為“English”。getData("student","zhangsan","score","English");上述代碼與如下HBaseShell命令等效:get‘student','zhangsan',{COLUMN=>'score:English'}”7.3 HBase常用JavaAPI及應(yīng)用實(shí)例比如,現(xiàn)在要7.3 HBase常用JavaAPI及應(yīng)用實(shí)例//關(guān)閉連接

publicstaticvoidclose(){

try{

if(admin!=null){

admin.close();

}

if(null!=connection){

connection.close();

}

}catch(IOExceptione){

e.printStackTrace();

}

}關(guān)閉連接7.3 HBase常用JavaAPI及應(yīng)用實(shí)例//關(guān)閉連接本章小結(jié)HBase數(shù)據(jù)庫(kù)的知識(shí)。HBase數(shù)據(jù)庫(kù)是BigTable的開(kāi)源實(shí)現(xiàn),和BigTable一樣,支持大規(guī)模海量數(shù)據(jù),分布式并發(fā)數(shù)據(jù)處理效率極高,易于擴(kuò)展且支持動(dòng)態(tài)伸縮,適用于廉價(jià)設(shè)備。HBase可以支持NativeJavaAPI、HBaseShell、ThriftGateway、RESTGateway、Pig、Hive等多種訪問(wèn)接口,可以根據(jù)具體應(yīng)用選擇訪問(wèn)方式。HBase實(shí)際上就是一個(gè)稀疏、多維、持久化存儲(chǔ)的映射表,它采用行鍵、列鍵和時(shí)間戳進(jìn)行索引,每個(gè)值都是未經(jīng)解釋的字符串。HBase采用分區(qū)存儲(chǔ),一個(gè)大的表會(huì)被分拆許多個(gè)Region,這些Region會(huì)被分發(fā)到不同的服務(wù)器上實(shí)現(xiàn)分布式存儲(chǔ)。HBase的系統(tǒng)架構(gòu)包括客戶端、Zookeeper服務(wù)器、Master主服務(wù)器、Region服務(wù)器。客戶端包含訪問(wèn)HBase的接口;Zookeeper服務(wù)器負(fù)責(zé)提供穩(wěn)定可靠的協(xié)同服務(wù);Master主服務(wù)器主要負(fù)責(zé)表和Region的管理工作;Region服務(wù)器負(fù)責(zé)維護(hù)分配給自己的Region,并響應(yīng)用戶的讀寫請(qǐng)求。HBase運(yùn)行機(jī)制和編程實(shí)踐的知識(shí)。本章小結(jié)HBase數(shù)據(jù)庫(kù)的知識(shí)。HBase數(shù)據(jù)庫(kù)是BigTaHBase邏輯模型以表的形式存放數(shù)據(jù)HBase邏輯模型以表的形式存放數(shù)據(jù)HBase物理模型HBase是按照列存儲(chǔ)HBase物理模型HBase是按照列存儲(chǔ)HBase運(yùn)行時(shí)架構(gòu)HBase運(yùn)行時(shí)架構(gòu)

分布式數(shù)據(jù)庫(kù)HBase

分布式數(shù)據(jù)庫(kù)HBase提綱1 概述2 HBase訪問(wèn)接口3 HBase數(shù)據(jù)模型4 HBase的實(shí)現(xiàn)原理5 HBase運(yùn)行機(jī)制6HBase應(yīng)用方案7HBase編程實(shí)踐提綱1 概述1 概述1.1 從BigTable說(shuō)起1.2 HBase簡(jiǎn)介1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析1 概述1.1 從BigTable說(shuō)起Google云計(jì)算技術(shù)具體包括:Google分布式文件系統(tǒng)GFS、分布式計(jì)算編程模型MapReduce、分布式鎖服務(wù)Chubby分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)Bigtable等。

1.1 從BigTable說(shuō)起Google云計(jì)算技術(shù)具體包括:1.1 從BigTable說(shuō)需要存儲(chǔ)的數(shù)據(jù)種類繁多:Google目前向公眾開(kāi)放的服務(wù)很多,需要處理的數(shù)據(jù)類型也非常多。包括URL、網(wǎng)頁(yè)內(nèi)容、用戶的個(gè)性化設(shè)置在內(nèi)的數(shù)據(jù)都是Google需要經(jīng)常處理的海量的服務(wù)請(qǐng)求:Google運(yùn)行著目前世界上最繁忙的系統(tǒng),它每時(shí)每刻處理的客戶服務(wù)請(qǐng)求數(shù)量是現(xiàn)有商用數(shù)據(jù)庫(kù)根本無(wú)法承受的。挑戰(zhàn)Google在數(shù)據(jù)存儲(chǔ)訪問(wèn)方面當(dāng)時(shí)面臨的挑戰(zhàn)

需要存儲(chǔ)的數(shù)據(jù)種類繁多:Google目前向公眾開(kāi)放的服務(wù)很多BigTable設(shè)計(jì)目標(biāo)基本目標(biāo)高可用性

能確保幾乎所有的情況下系統(tǒng)都可用

廣泛的適用性

能滿足系列Google產(chǎn)品簡(jiǎn)單性

底層系統(tǒng)簡(jiǎn)單性既可減少系統(tǒng)出錯(cuò)概率,也為上層應(yīng)用開(kāi)發(fā)帶來(lái)便利

很強(qiáng)的可擴(kuò)展性

根據(jù)需要隨時(shí)可以加入或撤銷服務(wù)器

BigTable設(shè)計(jì)目標(biāo)基本目標(biāo)高可用性能確保幾乎所有的情1.1 從BigTable說(shuō)起B(yǎng)igTable是一個(gè)分布式數(shù)據(jù)存儲(chǔ)系統(tǒng),

起初用于解決典型的互聯(lián)網(wǎng)搜索問(wèn)題,可以擴(kuò)展到PB級(jí)別的數(shù)據(jù)和上千臺(tái)機(jī)器,具備廣泛應(yīng)用性、可擴(kuò)展性、高性能和高可用性等特點(diǎn)。BigTable在互聯(lián)網(wǎng)搜索方面的例子:1

爬蟲(chóng)持續(xù)不斷地抓取新頁(yè)面,這些頁(yè)面每頁(yè)一行地存儲(chǔ)到BigTable里2MapReduce計(jì)算作業(yè)運(yùn)行在整張表上,生成索引,為網(wǎng)絡(luò)搜索應(yīng)用做準(zhǔn)備3

用戶發(fā)起網(wǎng)絡(luò)搜索請(qǐng)求4

網(wǎng)絡(luò)搜索應(yīng)用查詢建立好的索引,從BigTable得到網(wǎng)頁(yè)5

搜索結(jié)果提交給用戶目前,BigTable為谷歌旗下的搜索、地圖、財(cái)經(jīng)、打印、以及社交網(wǎng)站Orkut、視頻共享網(wǎng)站YouTube和博客網(wǎng)站Blogger等業(yè)務(wù)提供技術(shù)支持。1.1 從BigTable說(shuō)起B(yǎng)igTable是一個(gè)分布式數(shù)Bigtable數(shù)據(jù)模型Bigtable是一個(gè)分布式多維映射表,表中的數(shù)據(jù)通過(guò)一個(gè)行關(guān)鍵字(RowKey)、一個(gè)列關(guān)鍵字(ColumnKey)以及一個(gè)時(shí)間戳(TimeStamp)進(jìn)行索引Bigtable對(duì)存儲(chǔ)在其中的數(shù)據(jù)不做任何解析,一律看做字符串Bigtable的存儲(chǔ)邏輯可以表示為:(row:string,column:string,time:int64)→stringBigtable數(shù)據(jù)模型Bigtable是一個(gè)分布式多維Bigtable數(shù)據(jù)模型行Bigtable的行關(guān)鍵字可以是任意的字符串,但是大小不能超過(guò)64KB。Bigtable和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)有很大不同,它不支持一般意義上的事務(wù),但能保證對(duì)于行的讀寫操作具有原子性(Atomic)

表中數(shù)據(jù)都是根據(jù)行關(guān)鍵字進(jìn)行排序的,排序使用的是詞典序。

一個(gè)典型實(shí)例,其中n.www就是一個(gè)行關(guān)鍵字。不直接存儲(chǔ)網(wǎng)頁(yè)地址而將其倒排是Bigtable的一個(gè)巧妙設(shè)計(jì)。帶來(lái)兩個(gè)好處

:同一地址域的網(wǎng)頁(yè)會(huì)被存儲(chǔ)在表中的連續(xù)位置,有利于用戶查找和分析

倒排便于數(shù)據(jù)壓縮,可以大幅提高壓縮率

由于規(guī)模的問(wèn)題,單個(gè)的大表不利于數(shù)據(jù)處理,因此Bigtable將一個(gè)表分成了多個(gè)子表,每個(gè)子表包含多個(gè)行。子表是Bigtable中數(shù)據(jù)劃分和負(fù)載均衡的基本單位。Bigtable數(shù)據(jù)模型行由于規(guī)模的問(wèn)題,單個(gè)的大表不利數(shù)據(jù)模型列

Bigtable并不是簡(jiǎn)單地存儲(chǔ)所有的列關(guān)鍵字,而是將其組織成所謂的列族。每個(gè)族中的一列或者多列數(shù)據(jù)都屬于同一個(gè)類型(如圖中,內(nèi)容、錨點(diǎn)是不同的族)。同族的數(shù)據(jù)會(huì)被壓縮在一起保存

族是Bigtable中訪問(wèn)控制(AccessControl)基本單元,也就是說(shuō)訪問(wèn)權(quán)限的設(shè)置是在族這一級(jí)別上進(jìn)行的數(shù)據(jù)模型列數(shù)據(jù)模型時(shí)間戳

為了簡(jiǎn)化不同版本的數(shù)據(jù)管理,Bigtable目前提供了兩種設(shè)置:一種是保留最近的N個(gè)不同版本,圖中數(shù)據(jù)模型采取的就是這種方法,它保存最新的三個(gè)版本數(shù)據(jù)。另一種就是保留限定時(shí)間內(nèi)的所有不同版本,比如可以保存最近10天的所有不同版本數(shù)據(jù)。失效的版本將會(huì)由Bigtable的垃圾回收機(jī)制自動(dòng)處理

Google的很多服務(wù)比如網(wǎng)頁(yè)檢索和用戶的個(gè)性化設(shè)置等都需要保存不同時(shí)間的數(shù)據(jù),這些不同的數(shù)據(jù)版本必須通過(guò)時(shí)間戳來(lái)區(qū)分。數(shù)據(jù)模型時(shí)間戳Google的很多服務(wù)比如網(wǎng)頁(yè)檢索和用戶的系統(tǒng)架構(gòu)讀/寫元數(shù)據(jù)操作Bigtable數(shù)據(jù)庫(kù)主要由三個(gè)部分組成:客戶端程序庫(kù)(ClientLibrary),一個(gè)主服務(wù)器(MasterServer)和多個(gè)子表服務(wù)器(TabletServer)。在Bigtable中,整個(gè)數(shù)據(jù)庫(kù)看成一張大表,并會(huì)劃分為許多基本子表(bigtable中最小的處理單位)。子表服務(wù)器存儲(chǔ)實(shí)際數(shù)據(jù),并負(fù)責(zé)處理數(shù)據(jù)的讀寫,并在子表過(guò)大時(shí)進(jìn)行拆分。主服務(wù)器負(fù)責(zé)將子表分配到各子表服務(wù)器、檢測(cè)新增和過(guò)期的子表服務(wù)器、平衡子表服務(wù)器之間的負(fù)載、數(shù)據(jù)模式的改變(例如創(chuàng)建表)等。Chubby作用:1.選取并保證同一時(shí)間內(nèi)只有一個(gè)主服務(wù)器(MasterServer);2.獲取子表的位置信息;3.保存Bigtable的訪問(wèn)控制列表??蛻粼L問(wèn)Bigtable服務(wù)時(shí),首先要利用其庫(kù)函數(shù)執(zhí)行Open()操作來(lái)打開(kāi)一個(gè)鎖(實(shí)際上就是獲取了文件目錄),鎖打開(kāi)以后客戶端就可以和子表服務(wù)器進(jìn)行通信和許多具有單個(gè)主節(jié)點(diǎn)分布式系統(tǒng)一樣,客戶端主要與子表服務(wù)器通信,幾乎不和主服務(wù)器進(jìn)行通信,這使得主服務(wù)器的負(fù)載大大降低系統(tǒng)架構(gòu)讀/寫元數(shù)據(jù)操作Bigtable數(shù)據(jù)庫(kù)主要由三個(gè)部1.2 HBase簡(jiǎn)介HBase是一個(gè)高可靠、高性能、面向列、可伸縮的分布式數(shù)據(jù)庫(kù),是谷歌BigTable的開(kāi)源實(shí)現(xiàn),主要用來(lái)存儲(chǔ)非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。HBase的目標(biāo)是處理非常龐大的表,可以通過(guò)水平擴(kuò)展的方式,利用廉價(jià)計(jì)算機(jī)集群處理由超過(guò)10億行數(shù)據(jù)和數(shù)百萬(wàn)列元素組成的數(shù)據(jù)表Hadoop生態(tài)系統(tǒng)中HBase與其他部分的關(guān)系Hadoop1.2 HBase簡(jiǎn)介HBase是一個(gè)高可靠、高性能、面向列1.2 HBase簡(jiǎn)介關(guān)系數(shù)據(jù)庫(kù)已經(jīng)流行很多年,為什么需要HBase?傳統(tǒng)通用關(guān)系型數(shù)據(jù)庫(kù)無(wú)法應(yīng)對(duì)在數(shù)據(jù)規(guī)模劇增時(shí)導(dǎo)致的系統(tǒng)擴(kuò)展性和性能問(wèn)題傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)在數(shù)據(jù)結(jié)構(gòu)變化時(shí)一般需要停機(jī)維護(hù);空列浪費(fèi)存儲(chǔ)空間因此,出現(xiàn)了一類面向半結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)和訪問(wèn)的高可擴(kuò)展、低寫入/查詢延遲的系統(tǒng)HBase。目前,HBase已經(jīng)成功應(yīng)用于互聯(lián)網(wǎng)服務(wù)領(lǐng)域和傳統(tǒng)行業(yè)的眾多在線式數(shù)據(jù)分析處理系統(tǒng)中。1.2 HBase簡(jiǎn)介關(guān)系數(shù)據(jù)庫(kù)已經(jīng)流行很多年,為什么需要H1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析HBase與傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)的區(qū)別主要體現(xiàn)在以下幾個(gè)方面:(1)數(shù)據(jù)類型:關(guān)系數(shù)據(jù)庫(kù)具有豐富的數(shù)據(jù)類型和存儲(chǔ)方式,HBase則采用了更加簡(jiǎn)單的數(shù)據(jù)模型,它把數(shù)據(jù)存儲(chǔ)為未經(jīng)解釋的字符串。(2)數(shù)據(jù)操作:關(guān)系數(shù)據(jù)庫(kù)中包含了豐富的操作,其中會(huì)涉及復(fù)雜的多表連接。HBase操作則不存在復(fù)雜的表與表之間的關(guān)系,只有簡(jiǎn)單的插入、查詢、刪除、清空等,因?yàn)镠Base在設(shè)計(jì)上就避免了復(fù)雜的表和表之間的關(guān)系。(3)存儲(chǔ)模式:關(guān)系數(shù)據(jù)庫(kù)是基于行模式存儲(chǔ)的。HBase是基于列存儲(chǔ)的,每個(gè)列族都由幾個(gè)文件保存,不同列族的文件是分離的。1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析HBase與傳統(tǒng)1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析(4)數(shù)據(jù)索引:關(guān)系數(shù)據(jù)庫(kù)通??梢葬槍?duì)不同列構(gòu)建復(fù)雜的多個(gè)索引,以提高數(shù)據(jù)訪問(wèn)性能。HBase只有一個(gè)索引——行鍵(5)數(shù)據(jù)維護(hù):在關(guān)系數(shù)據(jù)庫(kù)中,更新操作會(huì)用最新的當(dāng)前值去替換記錄中原來(lái)的舊值,舊值被覆蓋后就不會(huì)存在。而在HBase中執(zhí)行更新操作時(shí),并不會(huì)刪除數(shù)據(jù)舊的版本,而是生成一個(gè)新的版本,舊有的版本仍然保留(6)可伸縮性:關(guān)系數(shù)據(jù)庫(kù)水平擴(kuò)展空間有限。相反,HBase就是為了實(shí)現(xiàn)靈活的水平擴(kuò)展而開(kāi)發(fā)的,能夠輕易地通過(guò)在集群中增加或者減少硬件數(shù)量來(lái)實(shí)現(xiàn)性能的伸縮1.3 HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的對(duì)比分析(4)數(shù)據(jù)索引:2 HBase訪問(wèn)接口HBase訪問(wèn)接口類型特點(diǎn)場(chǎng)合NativeJavaAPI最常規(guī)和高效的訪問(wèn)方式適合HadoopMapReduce作業(yè)并行批處理HBase表數(shù)據(jù)HBaseShellHBase的命令行工具,最簡(jiǎn)單的接口適合HBase管理使用ThriftGateway利用Thrift序列化技術(shù),支持C++、PHP、Python等多種語(yǔ)言適合其他異構(gòu)系統(tǒng)在線訪問(wèn)HBase表數(shù)據(jù)RESTGateway解除了語(yǔ)言限制支持REST風(fēng)格的HttpAPI訪問(wèn)HBasePig使用PigLatin流式編程語(yǔ)言來(lái)處理HBase中的數(shù)據(jù)適合做數(shù)據(jù)統(tǒng)計(jì)Hive簡(jiǎn)單當(dāng)需要以類似SQL語(yǔ)言方式來(lái)訪問(wèn)HBase的時(shí)候2 HBase訪問(wèn)接口HBase訪問(wèn)接口類型特點(diǎn)場(chǎng)合Nati3 HBase數(shù)據(jù)模型3.1 數(shù)據(jù)模型概述3.2 數(shù)據(jù)模型相關(guān)概念3.3 數(shù)據(jù)坐標(biāo)3.4 概念視圖3.5 物理視圖3.6 面向列的存儲(chǔ)3 HBase數(shù)據(jù)模型3.1 數(shù)據(jù)模型概述3.1 數(shù)據(jù)模型概述HBase是一個(gè)稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時(shí)間戳每個(gè)值是一個(gè)未經(jīng)解釋的字符串,沒(méi)有數(shù)據(jù)類型用戶在表中存儲(chǔ)數(shù)據(jù),每一行都有一個(gè)可排序的行鍵和任意多的列表在水平方向由一個(gè)或者多個(gè)列族組成,一個(gè)列族中可以包含任意多個(gè)列,同一個(gè)列族里面的數(shù)據(jù)存儲(chǔ)在一起列族支持動(dòng)態(tài)擴(kuò)展,可以很輕松地添加一個(gè)列族或列,無(wú)需預(yù)先定義列的數(shù)量以及類型,所有列均以字符串形式存儲(chǔ),用戶需要自行進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換HBase中執(zhí)行更新操作時(shí),并不會(huì)刪除數(shù)據(jù)舊的版本,而是生成一個(gè)新的版本,舊有的版本仍然保留(這是和HDFS只允許追加不允許修改的特性相關(guān)的)3.1 數(shù)據(jù)模型概述HBase是一個(gè)稀疏、多維度、排序的映射3.2 數(shù)據(jù)模型相關(guān)概念表:HBase采用表來(lái)組織數(shù)據(jù),表由行和列組成,列劃分為若干個(gè)列族行:每個(gè)HBase表都由若干行組成,每個(gè)行由行鍵(rowkey)來(lái)標(biāo)識(shí)。列族:一個(gè)HBase表被分組成許多“列族”(ColumnFamily)的集合,它是基本的訪問(wèn)控制單元列限定符:列族里的數(shù)據(jù)通過(guò)列限定符(或列)來(lái)定位單元格:在HBase表中,通過(guò)行、列族和列限定符確定一個(gè)“單元格”(cell),單元格中存儲(chǔ)的數(shù)據(jù)沒(méi)有數(shù)據(jù)類型,總被視為字節(jié)數(shù)組byte[]時(shí)間戳:每個(gè)單元格都保存著同一份數(shù)據(jù)的多個(gè)版本,這些版本采用時(shí)間戳進(jìn)行索引3.2 數(shù)據(jù)模型相關(guān)概念表:HBase采用表來(lái)組織數(shù)據(jù),表由3.3 數(shù)據(jù)坐標(biāo)HBase中需要根據(jù)行鍵、列族、列限定符和時(shí)間戳來(lái)確定一個(gè)單元格,因此,可以視為一個(gè)“四維坐標(biāo)”,即[行鍵,列族,列限定符,時(shí)間戳]鍵值[“201505003”,“Info”,“email”,1174184619081]“xie@”[“201505003”,“Info”,“email”,1174184620720]“you@163.com”3.3 數(shù)據(jù)坐標(biāo)HBase中需要根據(jù)行鍵、列族、列限定符和時(shí)3.4 邏輯視圖

HBase數(shù)據(jù)的邏輯視圖行鍵時(shí)間戳列族contents列族anchor"n.www"t5anchor:=”CNN”t4anchor:my.look.ca="CNN.com"t3contents:html="<html>..."t2contents:html="<html>..."t1contents:html="<html>..."3.4 邏輯視圖HBase數(shù)據(jù)的邏輯視圖行鍵時(shí)間戳列族c3.5 物理視圖

HBase數(shù)據(jù)的物理視圖:基于列的存儲(chǔ)行鍵時(shí)間戳列族contents"n.www"t3contents:html="<html>..."t2contents:html="<html>..."t1contents:html="<html>..."行鍵時(shí)間戳列族anchor"n.www"t5anchor:=”CNN”t4anchor:my.look.ca="CNN.com"列族contents列族anchor3.5 物理視圖HBase數(shù)據(jù)的物理視圖:基于列的存儲(chǔ)行3.6 面向列的存儲(chǔ)

行式數(shù)據(jù)庫(kù)和列式數(shù)據(jù)庫(kù)示意圖3.6 面向列的存儲(chǔ)行式數(shù)據(jù)庫(kù)和列式數(shù)據(jù)庫(kù)示意圖3.6 面向列的存儲(chǔ)

行式存儲(chǔ)結(jié)構(gòu)和列式存儲(chǔ)結(jié)構(gòu)3.6 面向列的存儲(chǔ)行式存儲(chǔ)結(jié)構(gòu)和列式存儲(chǔ)結(jié)構(gòu)4 HBase的實(shí)現(xiàn)原理1 HBase功能組件2 表和Region3 Region的定位4 HBase的實(shí)現(xiàn)原理1 HBase功能組件1 HBase功能組件HBase的實(shí)現(xiàn)包括三個(gè)主要的功能組件:(1)庫(kù)函數(shù):鏈接到每個(gè)客戶端(2)一個(gè)Master主服務(wù)器(3)許多個(gè)Region服務(wù)器主服務(wù)器Master負(fù)責(zé)管理和維護(hù)HBase表的分區(qū)信息,維護(hù)Region服務(wù)器列表,分配Region,負(fù)載均衡Region服務(wù)器負(fù)責(zé)存儲(chǔ)和維護(hù)分配給自己的Region,處理來(lái)自客戶端的讀寫請(qǐng)求客戶端并不是直接從Master主服務(wù)器上讀取數(shù)據(jù),而是在獲得Region的存儲(chǔ)位置信息后,直接從Region服務(wù)器上讀取數(shù)據(jù)客戶端并不依賴Master,而是通過(guò)Zookeeper來(lái)獲得Region位置信息,大多數(shù)客戶端甚至從來(lái)不和Master通信,這種設(shè)計(jì)方式使得Master負(fù)載很小

1 HBase功能組件HBase的實(shí)現(xiàn)包括三個(gè)主要的功能組件2 表和Region一個(gè)HBase表被劃分成多個(gè)Region

一個(gè)Region會(huì)分裂成多個(gè)新的Region開(kāi)始只有一個(gè)Region,后來(lái)不斷分裂Region拆分操作非??欤咏查g,因?yàn)椴鸱种蟮腞egion讀取的仍然是原存儲(chǔ)文件,直到“合并”過(guò)程把存儲(chǔ)文件異步地寫到獨(dú)立的文件之后,才會(huì)讀取新文件2 表和Region一個(gè)HBase表被劃分成多個(gè)Regio2 表和Region圖4-7不同的Region可以分布在不同的Region服務(wù)器上每個(gè)Region默認(rèn)大小是100MB到200MB(2006年以前的硬件配置)每個(gè)Region的最佳大小取決于單臺(tái)服務(wù)器的有效處理能力目前每個(gè)Region最佳大小建議1GB-2GB(2013年以后的硬件配置)同一個(gè)Region不會(huì)被分拆到多個(gè)Region服務(wù)器每個(gè)Region服務(wù)器存儲(chǔ)10-1000個(gè)Region2 表和Region圖4-7不同的Region可以分布在不3 Region的定位

HBase的三層結(jié)構(gòu)元數(shù)據(jù)表,又名.META.表,存儲(chǔ)了Region和Region服務(wù)器的映射關(guān)系當(dāng)HBase表很大時(shí),.META.表也會(huì)被分裂成多個(gè)Region根數(shù)據(jù)表,又名-ROOT-表,記錄所有元數(shù)據(jù)的具體位置-ROOT-表只有唯一一個(gè)Region,名字是在程序中被寫死的Zookeeper文件記錄了-ROOT-表的位置3 Region的定位HBase的三層結(jié)構(gòu)元數(shù)據(jù)表,又名3 Region的定位

HBase的三層結(jié)構(gòu)中各層次的名稱和作用層次名稱作用第一層Zookeeper文件記錄了-ROOT-表的位置信息第二層-ROOT-表記錄了.META.表的Region位置信息-ROOT-表只能有一個(gè)Region。通過(guò)-ROOT-表,就可以訪問(wèn).META.表中的數(shù)據(jù)第三層.META.表記錄了用戶數(shù)據(jù)表的Region位置信息,.META.表可以有多個(gè)Region,保存了HBase中所有用戶數(shù)據(jù)表的Region位置信息3 Region的定位HBase的三層結(jié)構(gòu)中各層次的名稱3 Region的定位客戶端訪問(wèn)數(shù)據(jù)時(shí)的“三級(jí)尋址”為了加速尋址,客戶端會(huì)緩存位置信息,同時(shí),需要解決緩存失效問(wèn)題尋址過(guò)程客戶端只需要詢問(wèn)Zookeeper服務(wù)器,不需要連接Master服務(wù)器3 Re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論