真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

nosql第二章課后答案,nosql第二章課后題

nosql數(shù)據(jù)庫是什么 具有代表性以key-value的形式存儲(chǔ)的

什么是NoSQL

十年的云岡網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整云岡建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“云岡網(wǎng)站設(shè)計(jì)”,“云岡網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

大家有沒有聽說過“NoSQL”呢?近年,這個(gè)詞極受關(guān)注??吹健癗oSQL”這個(gè)詞,大家可能會(huì)誤以為是“No!SQL”的縮寫,并深感憤怒:“SQL怎么會(huì)沒有必要了呢?”但實(shí)際上,它是“Not Only SQL”的縮寫。它的意義是:適用關(guān)系型數(shù)據(jù)庫的時(shí)候就使用關(guān)系型數(shù)據(jù)庫,不適用的時(shí)候也沒有必要非使用關(guān)系型數(shù)據(jù)庫不可,可以考慮使用更加合適的數(shù)據(jù)存儲(chǔ)。

為彌補(bǔ)關(guān)系型數(shù)據(jù)庫的不足,各種各樣的NoSQL數(shù)據(jù)庫應(yīng)運(yùn)而生。

為了更好地了解本書所介紹的NoSQL數(shù)據(jù)庫,對(duì)關(guān)系型數(shù)據(jù)庫的理解是必不可少的。那么,就讓我們先來看一看關(guān)系型數(shù)據(jù)庫的歷史、分類和特征吧。

關(guān)系型數(shù)據(jù)庫簡(jiǎn)史

1969年,埃德加?6?1弗蘭克?6?1科德(Edgar Frank Codd)發(fā)表了劃時(shí)代的論文,首次提出了關(guān)系數(shù)據(jù)模型的概念。但可惜的是,刊登論文的《IBM Research Report》只是IBM公司的內(nèi)部刊物,因此論文反響平平。1970年,他再次在刊物《Communication of the ACM》上發(fā)表了題為“A Relational Model of Data for Large Shared Data banks”(大型共享數(shù)據(jù)庫的關(guān)系模型)的論文,終于引起了大家的關(guān)注。

科德所提出的關(guān)系數(shù)據(jù)模型的概念成為了現(xiàn)今關(guān)系型數(shù)據(jù)庫的基礎(chǔ)。當(dāng)時(shí)的關(guān)系型數(shù)據(jù)庫由于硬件性能低劣、處理速度過慢而遲遲沒有得到實(shí)際應(yīng)用。但之后隨著硬件性能的提升,加之使用簡(jiǎn)單、性能優(yōu)越等優(yōu)點(diǎn),關(guān)系型數(shù)據(jù)庫得到了廣泛的應(yīng)用。

通用性及高性能

雖然本書是講解NoSQL數(shù)據(jù)庫的,但有一個(gè)重要的大前提,請(qǐng)大家一定不要誤解。這個(gè)大前提就是“關(guān)系型數(shù)據(jù)庫的性能絕對(duì)不低,它具有非常好的通用性和非常高的性能”。毫無疑問,對(duì)于絕大多數(shù)的應(yīng)用來說它都是最有效的解決方案。

突出的優(yōu)勢(shì)

關(guān)系型數(shù)據(jù)庫作為應(yīng)用廣泛的通用型數(shù)據(jù)庫,它的突出優(yōu)勢(shì)主要有以下幾點(diǎn):

保持?jǐn)?shù)據(jù)的一致性(事務(wù)處理)

由于以標(biāo)準(zhǔn)化為前提,數(shù)據(jù)更新的開銷很小(相同的字段基本上都只有一處)

可以進(jìn)行JOIN等復(fù)雜查詢

存在很多實(shí)際成果和專業(yè)技術(shù)信息(成熟的技術(shù))

這其中,能夠保持?jǐn)?shù)據(jù)的一致性是關(guān)系型數(shù)據(jù)庫的最大優(yōu)勢(shì)。在需要嚴(yán)格保證數(shù)據(jù)一致性和處理完整性的情況下,用關(guān)系型數(shù)據(jù)庫是肯定沒有錯(cuò)的。但是有些情況不需要JOIN,對(duì)上述關(guān)系型數(shù)據(jù)庫的優(yōu)點(diǎn)也沒有什么特別需要,這時(shí)似乎也就沒有必要拘泥于關(guān)系型數(shù)據(jù)庫了。

關(guān)系型數(shù)據(jù)庫的不足

不擅長(zhǎng)的處理

就像之前提到的那樣,關(guān)系型數(shù)據(jù)庫的性能非常高。但是它畢竟是一個(gè)通用型的數(shù)據(jù)庫,并不能完全適應(yīng)所有的用途。具體來說它并不擅長(zhǎng)以下處理:

大量數(shù)據(jù)的寫入處理

為有數(shù)據(jù)更新的表做索引或表結(jié)構(gòu)(schema)變更

字段不固定時(shí)應(yīng)用

對(duì)簡(jiǎn)單查詢需要快速返回結(jié)果的處理

。。。。。。

NoSQL數(shù)據(jù)庫

為了彌補(bǔ)關(guān)系型數(shù)據(jù)庫的不足(特別是最近幾年),NoSQL數(shù)據(jù)庫出現(xiàn)了。關(guān)系型數(shù)據(jù)庫應(yīng)用廣泛,能進(jìn)行事務(wù)處理和JOIN等復(fù)雜處理。相對(duì)地,NoSQL數(shù)據(jù)庫只應(yīng)用在特定領(lǐng)域,基本上不進(jìn)行復(fù)雜的處理,但它恰恰彌補(bǔ)了之前所列舉的關(guān)系型數(shù)據(jù)庫的不足之處。

易于數(shù)據(jù)的分散

如前所述,關(guān)系型數(shù)據(jù)庫并不擅長(zhǎng)大量數(shù)據(jù)的寫入處理。原本關(guān)系型數(shù)據(jù)庫就是以JOIN為前提的,就是說,各個(gè)數(shù)據(jù)之間存在關(guān)聯(lián)是關(guān)系型數(shù)據(jù)庫得名的主要原因。為了進(jìn)行JOIN處理,關(guān)系型數(shù)據(jù)庫不得不把數(shù)據(jù)存儲(chǔ)在同一個(gè)服務(wù)器內(nèi),這不利于數(shù)據(jù)的分散。相反,NoSQL數(shù)據(jù)庫原本就不支持JOIN處理,各個(gè)數(shù)據(jù)都是獨(dú)立設(shè)計(jì)的,很容易把數(shù)據(jù)分散到多個(gè)服務(wù)器上。由于數(shù)據(jù)被分散到了多個(gè)服務(wù)器上,減少了每個(gè)服務(wù)器上的數(shù)據(jù)量,即使要進(jìn)行大量數(shù)據(jù)的寫入操作,處理起來也更加容易。同理,數(shù)據(jù)的讀入操作當(dāng)然也同樣容易。

提升性能和增大規(guī)模

下面說一點(diǎn)題外話,如果想要使服務(wù)器能夠輕松地處理更大量的數(shù)據(jù),那么只有兩個(gè)選擇:一是提升性能,二是增大規(guī)模。下面我們來整理一下這兩者的不同。

首先,提升性能指的就是通過提升現(xiàn)行服務(wù)器自身的性能來提高處理能力。這是非常簡(jiǎn)單的方法,程序方面也不需要進(jìn)行變更,但需要一些費(fèi)用。若要購(gòu)買性能翻倍的服務(wù)器,需要花費(fèi)的資金往往不只是原來的2倍,可能需要多達(dá)5到10倍。這種方法雖然簡(jiǎn)單,但是成本較高。

另一方面,增大規(guī)模指的是使用多臺(tái)廉價(jià)的服務(wù)器來提高處理能力。它需要對(duì)程序進(jìn)行變更,但由于使用廉價(jià)的服務(wù)器,可以控制成本。另外,以后只要依葫蘆畫瓢增加廉價(jià)服務(wù)器的數(shù)量就可以了。

不對(duì)大量數(shù)據(jù)進(jìn)行處理的話就沒有使用的必要嗎?

NoSQL數(shù)據(jù)庫基本上來說為了“使大量數(shù)據(jù)的寫入處理更加容易(讓增加服務(wù)器數(shù)量更容易)”而設(shè)計(jì)的。但如果不是對(duì)大量數(shù)據(jù)進(jìn)行操作的話,NoSQL數(shù)據(jù)庫的應(yīng)用就沒有意義嗎?

答案是否定的。的確,它在處理大量數(shù)據(jù)方面很有優(yōu)勢(shì)。但實(shí)際上NoSQL數(shù)據(jù)庫還有各種各樣的特點(diǎn),如果能夠恰當(dāng)?shù)乩眠@些特點(diǎn)將會(huì)是非常有幫助。具體的例子將會(huì)在第2章和第3章進(jìn)行介紹,這些用途將會(huì)讓你感受到利用NoSQL的好處。

希望順暢地對(duì)數(shù)據(jù)進(jìn)行緩存(Cache)處理

希望對(duì)數(shù)組類型的數(shù)據(jù)進(jìn)行高速處理

希望進(jìn)行全部保存

多樣的NoSQL數(shù)據(jù)庫

NoSQL數(shù)據(jù)庫存在著“key-value存儲(chǔ)”、“文檔型數(shù)據(jù)庫”、“列存儲(chǔ)數(shù)據(jù)庫”等各種各樣的種類,每種數(shù)據(jù)庫又包含各自的特點(diǎn)。下一節(jié)讓我們一起來了解一下NoSQL數(shù)據(jù)庫的種類和特點(diǎn)。

NoSQL數(shù)據(jù)庫是什么

NoSQL說起來簡(jiǎn)單,但實(shí)際上到底有多少種呢?我在提筆的時(shí)候,到NoSQL的官方網(wǎng)站上確認(rèn)了一下,竟然已經(jīng)有122種了。另外官方網(wǎng)站上也介紹了本書沒有涉及到的圖形數(shù)據(jù)庫和對(duì)象數(shù)據(jù)庫等各個(gè)類別。不知不覺間,原來已經(jīng)出現(xiàn)了這么多的NoSQL數(shù)據(jù)庫啊。

本節(jié)將為大家介紹具有代表性的NoSQL數(shù)據(jù)庫。

key-value存儲(chǔ)

這是最常見的NoSQL數(shù)據(jù)庫,它的數(shù)據(jù)是以key-value的形式存儲(chǔ)的。雖然它的處理速度非??欤腔旧现荒芡ㄟ^key的完全一致查詢獲取數(shù)據(jù)。根據(jù)數(shù)據(jù)的保存方式可以分為臨時(shí)性、永久性和兩者兼具三種。

臨時(shí)性

memcached屬于這種類型。所謂臨時(shí)性就是 “數(shù)據(jù)有可能丟失”的意思。memcached把所有數(shù)據(jù)都保存在內(nèi)存中,這樣保存和讀取的速度非常快,但是當(dāng)memcached停止的時(shí)候,數(shù)據(jù)就不存在了。由于數(shù)據(jù)保存在內(nèi)存中,所以無法操作超出內(nèi)存容量的數(shù)據(jù)(舊數(shù)據(jù)會(huì)丟失)。

在內(nèi)存中保存數(shù)據(jù)

可以進(jìn)行非??焖俚谋4婧妥x取處理

數(shù)據(jù)有可能丟失

永久性

Tokyo Tyrant、Flare、ROMA等屬于這種類型。和臨時(shí)性相反,所謂永久性就是“數(shù)據(jù)不會(huì)丟失”的意思。這里的key-value存儲(chǔ)不像memcached那樣在內(nèi)存中保存數(shù)據(jù),而是把數(shù)據(jù)保存在硬盤上。與memcached在內(nèi)存中處理數(shù)據(jù)比起來,由于必然要發(fā)生對(duì)硬盤的IO操作,所以性能上還是有差距的。但數(shù)據(jù)不會(huì)丟失是它最大的優(yōu)勢(shì)。

在硬盤上保存數(shù)據(jù)

可以進(jìn)行非??焖俚谋4婧妥x取處理(但無法與memcached相比)

數(shù)據(jù)不會(huì)丟失

兩者兼具

Redis屬于這種類型。Redis有些特殊,臨時(shí)性和永久性兼具,且集合了臨時(shí)性key-value存儲(chǔ)和永久性key-value存儲(chǔ)的優(yōu)點(diǎn)。Redis首先把數(shù)據(jù)保存到內(nèi)存中,在滿足特定條件(默認(rèn)是15分鐘一次以上,5分鐘內(nèi)10個(gè)以上,1分鐘內(nèi)10000個(gè)以上的key發(fā)生變更)的時(shí)候?qū)?shù)據(jù)寫入到硬盤中。這樣既確保了內(nèi)存中數(shù)據(jù)的處理速度,又可以通過寫入硬盤來保證數(shù)據(jù)的永久性。這種類型的數(shù)據(jù)庫特別適合于處理數(shù)組類型的數(shù)據(jù)。

同時(shí)在內(nèi)存和硬盤上保存數(shù)據(jù)

可以進(jìn)行非常快速的保存和讀取處理

保存在硬盤上的數(shù)據(jù)不會(huì)消失(可以恢復(fù))

適合于處理數(shù)組類型的數(shù)據(jù)

面向文檔的數(shù)據(jù)庫

MongoDB、CouchDB屬于這種類型。它們屬于NoSQL數(shù)據(jù)庫,但與key-value存儲(chǔ)相異。

不定義表結(jié)構(gòu)

面向文檔的數(shù)據(jù)庫具有以下特征:即使不定義表結(jié)構(gòu),也可以像定義了表結(jié)構(gòu)一樣使用。關(guān)系型數(shù)據(jù)庫在變更表結(jié)構(gòu)時(shí)比較費(fèi)事,而且為了保持一致性還需修改程序。然而NoSQL數(shù)據(jù)庫則可省去這些麻煩(通常程序都是正確的),確實(shí)是方便快捷。

可以使用復(fù)雜的查詢條件

跟key-value存儲(chǔ)不同的是,面向文檔的數(shù)據(jù)庫可以通過復(fù)雜的查詢條件來獲取數(shù)據(jù)。雖然不具備事務(wù)處理和JOIN這些關(guān)系型數(shù)據(jù)庫所具有的處理能力,但除此以外的其他處理基本上都能實(shí)現(xiàn)。這是非常容易使用的NoSQL數(shù)據(jù)庫。

不需要定義表結(jié)構(gòu)

可以利用復(fù)雜的查詢條件

面向列的數(shù)據(jù)庫

Cassandra、Hbase、HyperTable屬于這種類型。由于近年來數(shù)據(jù)量出現(xiàn)爆發(fā)性增長(zhǎng),這種類型的NoSQL數(shù)據(jù)庫尤其引人注目。

面向行的數(shù)據(jù)庫和面向列的數(shù)據(jù)庫

普通的關(guān)系型數(shù)據(jù)庫都是以行為單位來存儲(chǔ)數(shù)據(jù)的,擅長(zhǎng)進(jìn)行以行為單位的讀入處理,比如特定條件數(shù)據(jù)的獲取。因此,關(guān)系型數(shù)據(jù)庫也被稱為面向行的數(shù)據(jù)庫。相反,面向列的數(shù)據(jù)庫是以列為單位來存儲(chǔ)數(shù)據(jù)的,擅長(zhǎng)以列為單位讀入數(shù)據(jù)。

高擴(kuò)展性

面向列的數(shù)據(jù)庫具有高擴(kuò)展性,即使數(shù)據(jù)增加也不會(huì)降低相應(yīng)的處理速度(特別是寫入速度),所以它主要應(yīng)用于需要處理大量數(shù)據(jù)的情況。另外,利用面向列的數(shù)據(jù)庫的優(yōu)勢(shì),把它作為批處理程序的存儲(chǔ)器來對(duì)大量數(shù)據(jù)進(jìn)行更新也是非常有用的。但由于面向列的數(shù)據(jù)庫跟現(xiàn)行數(shù)據(jù)庫存儲(chǔ)的思維方式有很大不同,應(yīng)用起來十分困難。

高擴(kuò)展性(特別是寫入處理)

應(yīng)用十分困難

最近,像Twitter和Facebook這樣需要對(duì)大量數(shù)據(jù)進(jìn)行更新和查詢的網(wǎng)絡(luò)服務(wù)不斷增加,面向列的數(shù)據(jù)庫的優(yōu)勢(shì)對(duì)其中一些服務(wù)是非常有用的,但是由于這與本書所要介紹的內(nèi)容關(guān)系不大,就不進(jìn)行詳細(xì)介紹了。

總結(jié):

NoSQL并不是No-SQL,而是指Not Only SQL。

NoSQL的出現(xiàn)是為了彌補(bǔ)SQL數(shù)據(jù)庫因?yàn)槭聞?wù)等機(jī)制帶來的對(duì)海量數(shù)據(jù)、高并發(fā)請(qǐng)求的處理的性能上的欠缺。

NoSQL不是為了替代SQL而出現(xiàn)的,它是一種替補(bǔ)方案,而不是解決方案的首選。

絕大多數(shù)的NoSQL產(chǎn)品都是基于大內(nèi)存和高性能隨機(jī)讀寫的(比如具有更高性能的固態(tài)硬盤陣列),一般的小型企業(yè)在選擇NoSQL時(shí)一定要慎重!不要為了NoSQL而NoSQL,可能會(huì)導(dǎo)致花了冤枉錢又耽擱了項(xiàng)目進(jìn)程。

NoSQL不是萬能的,但在大型項(xiàng)目中,你往往需要它!

什么是nosql非結(jié)構(gòu)化數(shù)據(jù)庫

基本含義NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫運(yùn)用,這一概念無疑是一種全新的思維的注入。NoSQLNoSQL數(shù)據(jù)庫的四大分類鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫這一類數(shù)據(jù)庫主要會(huì)使用到一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)。Key/value模型對(duì)于IT系統(tǒng)來說的優(yōu)勢(shì)在于簡(jiǎn)單、易部署。但是如果DBA只對(duì)部分值進(jìn)行查詢或更新的時(shí)候,Key/value就顯得效率低下了。[3] 舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.列存儲(chǔ)數(shù)據(jù)庫。這部分?jǐn)?shù)據(jù)庫通常是用來應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在,但是它們的特點(diǎn)是指向了多個(gè)列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.文檔型數(shù)據(jù)庫文檔型數(shù)據(jù)庫的靈感是來自于Lotus Notes辦公軟件的,而且它同第一種鍵值存儲(chǔ)相類似。該類型的數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲(chǔ),比如JSON。文檔型數(shù)據(jù)庫可 以看作是鍵值數(shù)據(jù)庫的升級(jí)版,允許之間嵌套鍵值。而且文檔型數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高。如:CouchDB, MongoDb. 國(guó)內(nèi)也有文檔型數(shù)據(jù)庫SequoiaDB,已經(jīng)開源。圖形(Graph)數(shù)據(jù)庫圖形結(jié)構(gòu)的數(shù)據(jù)庫同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同,它是使用靈活的圖形模型,并且能夠擴(kuò)展到多個(gè)服務(wù)器上。NoSQL數(shù)據(jù)庫沒有標(biāo)準(zhǔn)的查詢語言(SQL),因此進(jìn)行數(shù)據(jù)庫查詢需要制定數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫都有REST式的數(shù)據(jù)接口或者查詢API。[2] 如:Neo4J, InfoGrid, Infinite Graph.因此,我們總結(jié)NoSQL數(shù)據(jù)庫在以下的這幾種情況下比較適用:1、數(shù)據(jù)模型比較簡(jiǎn)單;2、需要靈活性更強(qiáng)的IT系統(tǒng);3、對(duì)數(shù)據(jù)庫性能要求較高;4、不需要高度的數(shù)據(jù)一致性;5、對(duì)于給定key,比較容易映射復(fù)雜值的環(huán)境。

NoSQL-HDFS-基本概念

Hadoop

文件系統(tǒng):文件系統(tǒng)是用來存儲(chǔ)和管理文件,并且提供文件的查詢、增加、刪除等操作。

直觀上的體驗(yàn):在shell窗口輸入 ls 命令,就可以看到當(dāng)前目錄下的文件夾、文件。

文件存儲(chǔ)在哪里?硬盤

一臺(tái)只有250G硬盤的電腦,如果需要存儲(chǔ)500G的文件可以怎么辦?先將電腦硬盤擴(kuò)容至少250G,再將文件分割成多塊,放到多塊硬盤上儲(chǔ)存。

通過 hdfs dfs -ls 命令可以查看分布式文件系統(tǒng)中的文件,就像本地的ls命令一樣。

HDFS在客戶端上提供了查詢、新增和刪除的指令,可以實(shí)現(xiàn)將分布在多臺(tái)機(jī)器上的文件系統(tǒng)進(jìn)行統(tǒng)一的管理。

在分布式文件系統(tǒng)中,一個(gè)大文件會(huì)被切分成塊,分別存儲(chǔ)到幾臺(tái)機(jī)器上。結(jié)合上文中提到的那個(gè)存儲(chǔ)500G大文件的那個(gè)例子,這500G的文件會(huì)按照一定的大小被切分成若干塊,然后分別存儲(chǔ)在若干臺(tái)機(jī)器上,然后提供統(tǒng)一的操作接口。

看到這里,不少人可能會(huì)覺得,分布式文件系統(tǒng)不過如此,很簡(jiǎn)單嘛。事實(shí)真的是這樣的么?

潛在問題

假如我有一個(gè)1000臺(tái)機(jī)器組成的分布式系統(tǒng),一臺(tái)機(jī)器每天出現(xiàn)故障的概率是0.1%,那么整個(gè)系統(tǒng)每天出現(xiàn)故障的概率是多大呢?答案是(1-0.1%)^1000=63%,因此需要提供一個(gè)容錯(cuò)機(jī)制來保證發(fā)生差錯(cuò)時(shí)文件依然可以讀出,這里暫時(shí)先不展開介紹。

如果要存儲(chǔ)PB級(jí)或者EB級(jí)的數(shù)據(jù),成千上萬臺(tái)機(jī)器組成的集群是很常見的,所以說分布式系統(tǒng)比單機(jī)系統(tǒng)要復(fù)雜得多呀。

這是一張HDFS的架構(gòu)簡(jiǎn)圖:

client通過nameNode了解數(shù)據(jù)在哪些DataNode上,從而發(fā)起查詢。此外,不僅是查詢文件,寫入文件的時(shí)候也是先去請(qǐng)教N(yùn)ameNode,看看應(yīng)該往哪個(gè)DateNode中去寫。

為了某一份數(shù)據(jù)只寫入到一個(gè)Datanode中,而這個(gè)Datanode因?yàn)槟承┰虺鲥e(cuò)無法讀取的問題,需要通過冗余備份的方式來進(jìn)行容錯(cuò)處理。因此,HDFS在寫入一個(gè)數(shù)據(jù)塊的時(shí)候,不會(huì)僅僅寫入一個(gè)DataNode,而是會(huì)寫入到多個(gè)DataNode中,這樣,如果其中一個(gè)DataNode壞了,還可以從其余的DataNode中拿到數(shù)據(jù),保證了數(shù)據(jù)不丟失。

實(shí)際上,每個(gè)數(shù)據(jù)塊在HDFS上都會(huì)保存多份,保存在不同的DataNode上。這種是犧牲一定存儲(chǔ)空間換取可靠性的做法。

接下來我們來看一下完整的文件寫入的流程:

大文件要寫入HDFS,client端根據(jù)配置將大文件分成固定大小的塊,然后再上傳到HDFS。

讀取文件的流程:

1、client詢問NameNode,我要讀取某個(gè)路徑下的文件,麻煩告訴我這個(gè)文件都在哪些DataNode上?

2、NameNode回復(fù)client,這個(gè)路徑下的文件被切成了3塊,分別在DataNode1、DataNode3和DataNode4上

3、client去找DataNode1、DataNode3和DataNode4,拿到3個(gè)文件塊,通過stream讀取并且整合起來

文件寫入的流程:

1、client先將文件分塊,然后詢問NameNode,我要寫入一個(gè)文件到某個(gè)路徑下,文件有3塊,應(yīng)該怎么寫?

2、NameNode回復(fù)client,可以分別寫到DataNode1、DataNode2、DataNode3、DataNode4上,記住,每個(gè)塊重復(fù)寫3份,總共是9份

3、client找到DataNode1、DataNode2、DataNode3、DataNode4,把數(shù)據(jù)寫到他們上面

出于容錯(cuò)的考慮,每個(gè)數(shù)據(jù)塊有3個(gè)備份,但是3個(gè)備份快都直接由client端直接寫入勢(shì)必會(huì)帶來client端過重的寫入壓力,這個(gè)點(diǎn)是否有更好的解決方案呢?回憶一下mysql主備之間是通過binlog文件進(jìn)行同步的,HDFS當(dāng)然也可以借鑒這個(gè)思想,數(shù)據(jù)其實(shí)只需要寫入到一個(gè)datanode上,然后由datanode之間相互進(jìn)行備份同步,減少了client端的寫入壓力,那么至于是一個(gè)datanode寫入成功即成功,還是需要所有的參與備份的datanode返回寫入成功才算成功,是可靠性配置的策略,當(dāng)然這個(gè)設(shè)置會(huì)影響到數(shù)據(jù)寫入的吞吐率,我們可以看到可靠性和效率永遠(yuǎn)是“魚和熊掌不可兼得”的。

潛在問題

NameNode確實(shí)會(huì)回放editlog,但是不是每次都從頭回放,它會(huì)先加載一個(gè)fsimage,這個(gè)文件是之前某一個(gè)時(shí)刻整個(gè)NameNode的文件元數(shù)據(jù)的內(nèi)存快照,然后再在這個(gè)基礎(chǔ)上回放editlog,完成后,會(huì)清空editlog,再把當(dāng)前文件元數(shù)據(jù)的內(nèi)存狀態(tài)寫入fsimage,方便下一次加載。

這樣,全量回放就變成了增量回放,但是如果NameNode長(zhǎng)時(shí)間未重啟過,editlog依然會(huì)比較大,恢復(fù)的時(shí)間依然比較長(zhǎng),這個(gè)問題怎么解呢?

SecondNameNode是一個(gè)NameNode內(nèi)的定時(shí)任務(wù)線程,它會(huì)定期地將editlog寫入fsimage,然后情況原來的editlog,從而保證editlog的文件大小維持在一定大小。

NameNode掛了, SecondNameNode并不能替代NameNode,所以如果集群中只有一個(gè)NameNode,它掛了,整個(gè)系統(tǒng)就掛了。hadoop2.x之前,整個(gè)集群只能有一個(gè)NameNode,是有可能發(fā)生單點(diǎn)故障的,所以hadoop1.x有本身的不穩(wěn)定性。但是hadoop2.x之后,我們可以在集群中配置多個(gè)NameNode,就不會(huì)有這個(gè)問題了,但是配置多個(gè)NameNode,需要注意的地方就更多了,系統(tǒng)就更加復(fù)雜了。

俗話說“一山不容二虎”,兩個(gè)NameNode只能有一個(gè)是活躍狀態(tài)active,另一個(gè)是備份狀態(tài)standby,我們看一下兩個(gè)NameNode的架構(gòu)圖。

兩個(gè)NameNode通過JournalNode實(shí)現(xiàn)同步editlog,保持狀態(tài)一致可以相互替換。

因?yàn)閍ctive的NameNode掛了之后,standby的NameNode要馬上接替它,所以它們的數(shù)據(jù)要時(shí)刻保持一致,在寫入數(shù)據(jù)的時(shí)候,兩個(gè)NameNode內(nèi)存中都要記錄數(shù)據(jù)的元信息,并保持一致。這個(gè)JournalNode就是用來在兩個(gè)NameNode中同步數(shù)據(jù)的,并且standby NameNode實(shí)現(xiàn)了SecondNameNode的功能。

進(jìn)行數(shù)據(jù)同步操作的過程如下:

active NameNode有操作之后,它的editlog會(huì)被記錄到JournalNode中,standby NameNode會(huì)從JournalNode中讀取到變化并進(jìn)行同步,同時(shí)standby NameNode會(huì)監(jiān)聽記錄的變化。這樣做的話就是實(shí)時(shí)同步了,并且standby NameNode就實(shí)現(xiàn)了SecondNameNode的功能。

優(yōu)點(diǎn):

缺點(diǎn):


本文題目:nosql第二章課后答案,nosql第二章課后題
轉(zhuǎn)載來源:http://weahome.cn/article/dssdicd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部