【什么是大數(shù)據(jù)、大數(shù)據(jù)技術(shù)】
大數(shù)據(jù),又稱巨量資料,指的是所涉及的數(shù)據(jù)資料量規(guī)模巨大到無法在合理時(shí)間內(nèi)通過傳統(tǒng)的應(yīng)用軟件工具進(jìn)行抓取、收集、管理、分析處理。簡單來說,大數(shù)據(jù)就是海量數(shù)據(jù)的高效處理
大數(shù)據(jù)技術(shù),從本質(zhì)上講是從類型各異、內(nèi)容龐大的數(shù)據(jù)中快速獲得有價(jià)值信息的技術(shù)。目前,隨著大數(shù)據(jù)領(lǐng)域被廣泛關(guān)注,大量新的技術(shù)已經(jīng)開始涌現(xiàn)出來,而這些技術(shù)將成為大數(shù)據(jù)采集、存儲(chǔ)、分析、表現(xiàn)的重要工具。
大數(shù)據(jù)處理的關(guān)鍵技術(shù)主要包括:數(shù)據(jù)采集、數(shù)據(jù)預(yù)處理(數(shù)據(jù)清理、數(shù)據(jù)集成、數(shù)據(jù)變換等)、大數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析和挖掘、數(shù)據(jù)的呈現(xiàn)與應(yīng)用(數(shù)據(jù)可視化、數(shù)據(jù)安全與隱私等)。
【大數(shù)據(jù)的4V特征(Volume、Variety、Value、Velocity)】
1、數(shù)據(jù)體量巨大(Volume)。包括采集、存儲(chǔ)和計(jì)算的量都非常大。大數(shù)據(jù)的起始計(jì)量單位至少是P(1000個(gè)T)、E(100萬個(gè)T)或Z(10億個(gè)T)。
2、數(shù)據(jù)類型繁多(Variety)。這種類型的多樣性也讓數(shù)據(jù)被分為結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。相對(duì)于以往便于存儲(chǔ)的以文本為主的結(jié)構(gòu)化數(shù)據(jù),非結(jié)構(gòu)化數(shù)據(jù)越來越多,包括網(wǎng)絡(luò)日志、音頻、視頻、圖片、地理位置信息等,這些多類型的數(shù)據(jù)對(duì)數(shù)據(jù)的處理能力提出了更高要求。
3、價(jià)值密度低(Value)。價(jià)值密度的高低與數(shù)據(jù)總量的大小成反比。以視頻為例,一部1小時(shí)的視頻,在連續(xù)不間斷的監(jiān)控中,有用數(shù)據(jù)可能僅有一二秒。如何通過強(qiáng)大的機(jī)器算法更迅速地完成數(shù)據(jù)的價(jià)值“提純”成為目前大數(shù)據(jù)背景下亟待解決的難題。
4、處理速度快(Velocity)。數(shù)據(jù)增長速度快,處理速度也快,時(shí)效性要求高。比如搜索引擎要求幾分鐘前的新聞能夠被用戶查詢到,個(gè)性化推薦算法盡可能要求實(shí)時(shí)完成推薦。這是大數(shù)據(jù)區(qū)別于傳統(tǒng)數(shù)據(jù)挖掘的顯著特征。
【什么是云計(jì)算】
云計(jì)算(Cloud Computing)是分布式計(jì)算(Distributed Computing)、并行計(jì)算(Parallel Computing)、效用計(jì)算(Utility Computing)、 網(wǎng)絡(luò)存儲(chǔ)(Network Storage Technologies)、虛擬化(Virtualization)、負(fù)載均衡(Load Balance)、熱備冗余(High Available)等傳統(tǒng)計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)發(fā)展融合的產(chǎn)物。
云計(jì)算中的“云”是指通過 Internet(“云”)交付計(jì)算服務(wù)器、存儲(chǔ)和帶寬資源等服務(wù)。“云”將計(jì)算資源集中起來,并通過專門軟件實(shí)現(xiàn)自動(dòng)管理。用戶可以動(dòng)態(tài)申請(qǐng)部分資源,支持各種業(yè)務(wù)的運(yùn)轉(zhuǎn),無需自己搭建服務(wù)器而從“云”獲取計(jì)算和存儲(chǔ)能力,從而提高效率、降低成本,可以更專注于重要的業(yè)務(wù)目標(biāo)以及創(chuàng)新。提供這些計(jì)算服務(wù)的公司稱為云提供商,他們通?;谟脩羰褂脤?duì)云計(jì)算服務(wù)進(jìn)行收費(fèi),類似于家用水電的計(jì)費(fèi)方式。
云計(jì)算早期,就是簡單一點(diǎn)的分布式計(jì)算,解決任務(wù)分發(fā),將計(jì)算結(jié)果合并,也叫網(wǎng)格計(jì)算。很多大企業(yè)早期可能也只是想解決自己的效率與計(jì)算問題,到后來這個(gè)能力也可以提供給外部使用,所以就出現(xiàn)了公共云(public cloud)計(jì)算 ,把計(jì)算機(jī)的計(jì)算能力直接放在網(wǎng)上賣出去。未來的云計(jì)算,就像我們使用水電煤氣一樣,我們從來不會(huì)想著去建電廠,也不關(guān)心電廠在哪里,只要插上插頭,就能用電。簡單來說,云計(jì)算是硬件資源的虛擬化。
【云計(jì)算有哪些特點(diǎn)】
1.超大規(guī)模
“云”具有相當(dāng)?shù)囊?guī)模,Google的云計(jì)算擁有100多萬臺(tái)服務(wù)器,Amazon、Microsoft、Yahoo等擁有幾十萬臺(tái)服務(wù)器。所以“云”可以為用戶提供超強(qiáng)的計(jì)算和存儲(chǔ)能力。
2.費(fèi)用低
“云”就是一個(gè)龐大的資源池,用戶可以按需購買資源,像水電煤那樣計(jì)費(fèi)。無需在購買硬件和軟件以及設(shè)置和運(yùn)行現(xiàn)場數(shù)據(jù)中心(包括服務(wù)器機(jī)架、用于供電和冷卻的全天不間斷電力、管理基礎(chǔ)結(jié)構(gòu)的 IT 專家)上進(jìn)行額外的資金投入。
3.高伸縮性
“云”的規(guī)模可以動(dòng)態(tài)伸縮,具備彈性擴(kuò)展能力,以滿足應(yīng)用或者用戶增長的需要。例如更多或更少的計(jì)算能力、存儲(chǔ)空間、帶寬。因此通常只需點(diǎn)擊幾下鼠標(biāo),即可在數(shù)分鐘內(nèi)調(diào)配海量計(jì)算資源,賦予企業(yè)非常大的靈活性,并消除了容量規(guī)劃的壓力。
4.通用性
“云”不是針對(duì)特定的服務(wù),同一片“云”可以支撐各種各樣的服務(wù)。
5.虛擬化
云計(jì)算支持用戶在任意位置、使用各種終端獲取應(yīng)用服務(wù)。所請(qǐng)求的資源來自“云”,而不是固定的有形的實(shí)體。應(yīng)用在“云”中某處運(yùn)行,但實(shí)際上用戶無需了解、也不用擔(dān)心應(yīng)用運(yùn)行的具體位置。只需要一臺(tái)筆記本或者一個(gè)手機(jī),就可以通過網(wǎng)絡(luò)服務(wù)來實(shí)現(xiàn)我們需要的一切,甚至包括超級(jí)計(jì)算這樣的任務(wù)。
6.可靠性
“云”采用數(shù)據(jù)多副本容錯(cuò)、計(jì)算節(jié)點(diǎn)同構(gòu)可互換等多種手段保障服務(wù)可靠性。
【云服務(wù)類型:IaaS、PaaS、SaaS】
1、基礎(chǔ)結(jié)構(gòu)即服務(wù) (IaaS)
云計(jì)算服務(wù)的最基本類別。使用 IaaS 時(shí),以即用即付的方式從服務(wù)提供商處租用IT基礎(chǔ)結(jié)構(gòu),如服務(wù)器和虛擬機(jī)(VM)、存儲(chǔ)空間、網(wǎng)絡(luò)和操作系統(tǒng)。
2、平臺(tái)即服務(wù) (PaaS)
平臺(tái)即服務(wù) (PaaS) 是指云計(jì)算服務(wù),它們可以按需提供開發(fā)、測試、交付和管理軟件應(yīng)用程序所需的環(huán)境。PaaS 旨在讓開發(fā)人員能夠更輕松地快速創(chuàng)建 Web 或移動(dòng)應(yīng)用,而無需考慮對(duì)開發(fā)所必需的服務(wù)器、存儲(chǔ)空間、網(wǎng)絡(luò)和數(shù)據(jù)庫基礎(chǔ)結(jié)構(gòu)進(jìn)行設(shè)置或管理。
3、軟件即服務(wù) (SaaS)
軟件即服務(wù) (SaaS) 是通過 Internet 交付軟件應(yīng)用程序的方法,通常以訂閱為基礎(chǔ)按需提供。使用 SaaS 時(shí),云提供商托管并管理軟件應(yīng)用程序和基礎(chǔ)結(jié)構(gòu),并負(fù)責(zé)軟件升級(jí)和安全修補(bǔ)等維護(hù)工作。用戶(通常使用電話、平板電腦或 PC 上的 Web 瀏覽器)通過 Internet 連接到應(yīng)用程序。
【云部署類型:公共、私有、混合】
1、公有云
公有云為第三方云服務(wù)提供商所擁有和運(yùn)營,他們通過 Internet 提供其計(jì)算資源(如服務(wù)器和存儲(chǔ)空間)。Microsoft Azure 是公有云的一個(gè)示例。在公有云中,所有硬件、軟件和其他支持性基礎(chǔ)結(jié)構(gòu)均為云提供商所擁有和管理。使用 Web 瀏覽器訪問這些服務(wù)和帳戶管理。
2、私有云
私有云是指專供一個(gè)企業(yè)或組織使用的云計(jì)算資源。私有云可以實(shí)際位于公司的現(xiàn)場數(shù)據(jù)中心之上。私有云對(duì)數(shù)據(jù)保密、數(shù)據(jù)安全、服務(wù)質(zhì)量都能有效控制,其最大的特點(diǎn)是安全性與私有化,是訂制化解決方案的根本,對(duì)于對(duì)數(shù)據(jù)安全與穩(wěn)定有要求的企業(yè)來說是非常好的選擇。
3、混合云
混合云組合了公有云的方便便捷與私有云的安全穩(wěn)定的特點(diǎn),企業(yè)出于安全考慮會(huì)希望將數(shù)據(jù)存放在私有云上面,同時(shí)又希望能使用公有云的資源,混合云為企業(yè)提供更大的靈活性和更多的部署選項(xiàng)。
【云計(jì)算的安全如何保證】
公有云的數(shù)據(jù)安全不是一個(gè)孤立的問題,廣義的安全,也包括數(shù)據(jù)的完整性、數(shù)據(jù)的私密性。
1、網(wǎng)絡(luò)安全防護(hù):高吞吐量的 DDoS 外網(wǎng)防護(hù)更完善的防火墻,入侵檢測,WAF更完善的流量清洗規(guī)則。
2、數(shù)據(jù)庫安全防護(hù):高可用:主備切換數(shù)據(jù)零丟失高可靠:同城雙活,異地備份安全性:訪問控制,IP白名單。
3、存儲(chǔ)安全防護(hù):高可靠:超大容量,三份備份,異地同步安全性:訪問控制,防盜鏈。
4、運(yùn)維安全:數(shù)據(jù)對(duì)運(yùn)維也是機(jī)密的,需要流程保障不斷更新的虛擬機(jī)和容器鏡像建設(shè)漏洞不斷更新的病毒庫
【大數(shù)據(jù)與云計(jì)算的關(guān)系】
1、云計(jì)算為大數(shù)據(jù)提供了有力的工具和途徑。云計(jì)算強(qiáng)大的計(jì)算能力和數(shù)據(jù)存儲(chǔ)能力能夠?yàn)榇髷?shù)據(jù)處理分析帶來豐富性和多元性,使其能夠提供更為便捷的服務(wù)。
2、大數(shù)據(jù)為云計(jì)算提供了很有價(jià)值的用武之地。大數(shù)據(jù)本身帶來的多元化應(yīng)用使得云計(jì)算具有了強(qiáng)大的實(shí)際應(yīng)用能力。
3、大數(shù)據(jù)為云計(jì)算深入到行業(yè)應(yīng)用提供了強(qiáng)有力的切入點(diǎn)。
4、大數(shù)據(jù)更靠近應(yīng)用,比云計(jì)算更容易落地,大數(shù)據(jù)需求明顯,處在價(jià)值鏈的上游,可有效利用已大量建設(shè)的云計(jì)算資源。
云計(jì)算作為計(jì)算資源的底層,支撐著上層的大數(shù)據(jù)處理,而大數(shù)據(jù)的發(fā)展趨勢是,實(shí)時(shí)交互式的查詢效率和分析能力。云計(jì)算和大數(shù)據(jù)勢相輔相成、優(yōu)勢相長的關(guān)系,二者結(jié)合能夠提升對(duì)方的實(shí)用價(jià)值,并在對(duì)方的計(jì)算發(fā)展過程中相互促進(jìn),實(shí)現(xiàn)了傳統(tǒng)信息處理和分析技術(shù)無法理解和比擬的功能和優(yōu)勢。
【大數(shù)據(jù)思維】
1、要分析所有數(shù)據(jù),而不是少量的隨機(jī)數(shù)據(jù)樣本。在大數(shù)據(jù)時(shí)代的第一個(gè)轉(zhuǎn)變就是利用所有數(shù)據(jù),而不再僅僅依靠一小部分?jǐn)?shù)據(jù)。采樣分析的精確性隨著采樣隨機(jī)性的增加而大幅提高,但與樣本數(shù)量的增加關(guān)系不大。因此樣本選擇的隨機(jī)性比樣本數(shù)量更加重要。大數(shù)據(jù)的方法不采用隨機(jī)分析法,而是采用所有數(shù)據(jù),即樣本=總體。
2、要追求數(shù)據(jù)的紛繁復(fù)雜,而不是精確性。在“小數(shù)據(jù)”時(shí)代,最重要的就是減少測量的錯(cuò)誤,因?yàn)槭占男畔⑤^少,所以必須保證記錄盡可能精確,否則細(xì)微的錯(cuò)誤會(huì)被放大。大數(shù)據(jù)為了擴(kuò)大數(shù)據(jù)規(guī)模允許不精確。大數(shù)據(jù)的簡單算法比小數(shù)據(jù)的復(fù)雜算法更加有效。大數(shù)據(jù)要求我們接受紛繁性,放棄對(duì)精確性的追求,在大數(shù)據(jù)時(shí)代我們無法獲得精確性。
3、要關(guān)注事物的相關(guān)關(guān)系,而不是因果關(guān)系。通過監(jiān)控一個(gè)現(xiàn)象的良好的關(guān)聯(lián)物,相關(guān)關(guān)系可以幫助我們捕捉現(xiàn)在和預(yù)測未來。大數(shù)據(jù)的相關(guān)關(guān)系分析法更加準(zhǔn)確、更快,而且不易受傳統(tǒng)思維模式和特定領(lǐng)域里隱含的固有偏見的影響。建立在相關(guān)關(guān)系分析法上基礎(chǔ)上的預(yù)測是大數(shù)據(jù)的核心。
【大數(shù)據(jù)的數(shù)據(jù)分類】
1、結(jié)構(gòu)化數(shù)據(jù):即行數(shù)據(jù),存儲(chǔ)在數(shù)據(jù)庫里,可以用二維表結(jié)構(gòu)來邏輯表達(dá)實(shí)現(xiàn)的數(shù)據(jù)。任何一列遵循范式,數(shù)據(jù)項(xiàng)不可再分,同一列數(shù)據(jù)具有相同的數(shù)據(jù)類型。所有的關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)均為結(jié)構(gòu)化數(shù)據(jù)(如Oracle,DB2,MySQL,SQLServer)
2、非結(jié)構(gòu)化數(shù)據(jù):不方便用數(shù)據(jù)庫二維邏輯表來表現(xiàn)的數(shù)據(jù),包括所有格式的辦公文檔、文本、圖片、XML、HTML、各類報(bào)表、圖像和音頻/視頻信息等,沒有固定結(jié)構(gòu)的數(shù)據(jù),通常保存為不同類型的文件。
3、半結(jié)構(gòu)化數(shù)據(jù):介于完全結(jié)構(gòu)化數(shù)據(jù)(如關(guān)系型數(shù)據(jù)庫、面向?qū)ο髷?shù)據(jù)庫中的數(shù)據(jù))和完全無結(jié)構(gòu)的數(shù)據(jù)(如聲音、圖像文件等)之間的數(shù)據(jù)。每條記錄可能會(huì)有預(yù)定義的規(guī)范,但是允許每條記錄包含不同的信息、字段數(shù)、字段名、字段類型,也允許嵌套格式。HTML文檔就屬于半結(jié)構(gòu)化數(shù)據(jù)。它一般是自描述的,數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容混在一起,沒有明顯的區(qū)分。
【企業(yè)級(jí)大數(shù)據(jù)運(yùn)營流程】
針對(duì)企業(yè)內(nèi)外部的各類數(shù)據(jù)源,通過數(shù)據(jù)采集、預(yù)處理、數(shù)據(jù)存儲(chǔ)及數(shù)據(jù)加工處理,為不同應(yīng)用及使用對(duì)象提供多種數(shù)據(jù)服務(wù)。
數(shù)據(jù)源:整合的業(yè)務(wù)數(shù)據(jù)來源于B/O/M三域支撐系統(tǒng)、業(yè)務(wù)平臺(tái)等內(nèi)部系統(tǒng)數(shù)據(jù)源,以及互聯(lián)網(wǎng)頁,政府?dāng)?shù)據(jù)等外部數(shù)據(jù)源。
數(shù)據(jù)采集:將不同來源、不同特征的數(shù)據(jù)源通過不同的方式進(jìn)行抽取和收集。
數(shù)據(jù)處理:通過數(shù)處理對(duì)采集來的數(shù)據(jù)進(jìn)行必要的裁剪、整理、匯總計(jì)算。
數(shù)據(jù)存儲(chǔ):將經(jīng)過預(yù)處理的數(shù)據(jù)裝載到分析平臺(tái)、并根據(jù)處理需要進(jìn)行數(shù)據(jù)分層存儲(chǔ)。
數(shù)據(jù)治理:按照不同的數(shù)據(jù)架構(gòu)、數(shù)據(jù)質(zhì)量規(guī)則、安全規(guī)則等進(jìn)行數(shù)據(jù)治理。
數(shù)據(jù)挖掘:針對(duì)不同的應(yīng)用場景需求通過挖掘算法建立模型,挖掘數(shù)據(jù)間的潛在關(guān)系與價(jià)值。
數(shù)據(jù)應(yīng)用:面向不同應(yīng)用及使用對(duì)象,提供接口數(shù)據(jù)、頁面訪問等多種數(shù)據(jù)服務(wù)。
【大數(shù)據(jù)的預(yù)處理及存儲(chǔ)管理技術(shù)】
數(shù)據(jù)預(yù)處理主要完成對(duì)已接收數(shù)據(jù)的辨析、抽取、清洗等操作。
1、抽取:因獲取的數(shù)據(jù)可能具有多種結(jié)構(gòu)和類型,數(shù)據(jù)抽取過程可以幫助我們將這些復(fù)雜的數(shù)據(jù)轉(zhuǎn)化為單一的或者便于處理的構(gòu)型,以達(dá)到快速分析處理的目的。
2、清洗:對(duì)于大數(shù)據(jù),并不全是有價(jià)值的,有些數(shù)據(jù)并不是我們所關(guān)心的內(nèi)容,而另一些數(shù)據(jù)則是完全錯(cuò)誤的干擾項(xiàng),因此要對(duì)數(shù)據(jù)通過過濾“去噪”從而提取出有效數(shù)據(jù)。
大數(shù)據(jù)存儲(chǔ)與管理要用存儲(chǔ)器把采集到的數(shù)據(jù)存儲(chǔ)起來,建立相應(yīng)的數(shù)據(jù)庫,并進(jìn)行管理和調(diào)用。重點(diǎn)解決復(fù)雜結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化大數(shù)據(jù)管理與處理技術(shù)。其中非關(guān)系型數(shù)據(jù)庫主要指的是NOSQL數(shù)據(jù),分為鍵值庫,列存儲(chǔ)數(shù)據(jù)庫,圖數(shù)據(jù)庫以及文檔數(shù)據(jù)庫等類型。關(guān)系型數(shù)據(jù)庫包含了傳統(tǒng)關(guān)系數(shù)據(jù)庫系統(tǒng)以及NewSQL數(shù)據(jù)庫。
【大數(shù)據(jù)的分析及挖掘技術(shù)】
數(shù)據(jù)挖掘就是從大量的、不完全的、有噪聲的、模糊的、隨機(jī)的實(shí)際應(yīng)用數(shù)據(jù)中,提取隱含在其中的、人們事先不知道的、但又是潛在有用的信息和知識(shí)的過程。根據(jù)挖掘方法分,可粗分為:機(jī)器學(xué)習(xí)方法、統(tǒng)計(jì)方法、神經(jīng)網(wǎng)絡(luò)方法和數(shù)據(jù)庫方法。機(jī)器學(xué)習(xí)中,可細(xì)分為:歸納學(xué)習(xí)方法(決策樹、規(guī)則歸納等)、基于范例學(xué)習(xí)、遺傳算法等。統(tǒng)計(jì)方法中,可細(xì)分為:回歸分析(多元回歸、自回歸等)、判別分析(貝葉斯判別、費(fèi)歇爾判別、非參數(shù)判別等)、聚類分析(系統(tǒng)聚類、動(dòng)態(tài)聚類等)、探索性分析(主元分析法、相關(guān)分析法等)等。神經(jīng)網(wǎng)絡(luò)方法中,可細(xì)分為:前向神經(jīng)網(wǎng)絡(luò)(BP算法等)、自組織神經(jīng)網(wǎng)絡(luò)(自組織特征映射、競爭學(xué)習(xí)等)等。數(shù)據(jù)庫方法主要是多維數(shù)據(jù)分析或OLAP方法,另外還有面向?qū)傩缘臍w納方法。
【批處理與流處理的差異】
批處理與流處理的不同,主要是數(shù)據(jù)獲取的方式不同。流處理的數(shù)據(jù),就像流水一樣,一直在系統(tǒng)中流動(dòng)處理。批處理的數(shù)據(jù),則是暫存于數(shù)據(jù)庫中的離線數(shù)據(jù),后期定時(shí)定量的一批一批的處理。
批處理的優(yōu)點(diǎn)是支持對(duì)歷史時(shí)序數(shù)據(jù)的處理,實(shí)現(xiàn)簡單。但是批處理具有查詢數(shù)據(jù)量大,非實(shí)時(shí)的缺點(diǎn),因此批處理不適合對(duì)處理時(shí)間要求較高的場合。流式處理的優(yōu)點(diǎn)是數(shù)據(jù)實(shí)時(shí)計(jì)算,無需查詢?cè)紨?shù)據(jù),無需針對(duì)整個(gè)數(shù)據(jù)集執(zhí)行操作,而是對(duì)通過系統(tǒng)傳輸?shù)拿總€(gè)數(shù)據(jù)項(xiàng)執(zhí)行操作。但是流式處理需要特殊處理寫入的歷史數(shù)據(jù),也需要處理運(yùn)算過程中崩潰的計(jì)算單元。流處理很適合用來處理必須對(duì)變動(dòng)或峰值做出響應(yīng),并且關(guān)注一段時(shí)間內(nèi)變化趨勢的數(shù)據(jù)。
【什么是Hadoop】
Hadoop是一個(gè)由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開發(fā)分布式程序,充分利用集群的威力進(jìn)行高速運(yùn)算和存儲(chǔ)。Hadoop實(shí)現(xiàn)了一個(gè)分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯(cuò)性的特點(diǎn),并且設(shè)計(jì)用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應(yīng)用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集(large data set)的應(yīng)用程序。Hadoop的框架最核心的設(shè)計(jì)就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲(chǔ),而MapReduce為海量的數(shù)據(jù)提供了計(jì)算。
【Hadoop的起源】
Hadoop起源于Apache Nutch(一個(gè)開源的網(wǎng)絡(luò)搜索引擎),是Apach Lucene(文本搜索引擎庫,創(chuàng)始人Doug Cutting)的一部分。在2002-2004年間谷歌發(fā)布了三大論文介紹了其云計(jì)算的核心組成部分GFS(Google File System)、MapReduce以及BigTable。谷歌在自身多年的搜索引擎業(yè)務(wù)中構(gòu)建了突破性的GFS,從此文件系統(tǒng)進(jìn)入分布式時(shí)代。除此之外,Google在GFS上如何快速分析和處理數(shù)據(jù)方面開創(chuàng)了MapReduce并行計(jì)算框架,讓以往的高端服務(wù)器計(jì)算變?yōu)榱畠r(jià)的x86集群計(jì)算,也讓許多互聯(lián)網(wǎng)公司能夠從IOE(IBM小型機(jī)、Oracle數(shù)據(jù)庫以及EMC存儲(chǔ))中解脫出來,Google雖然沒有將其核心技術(shù)開源,但是這三篇論文已經(jīng)向開源社區(qū)指明了方向。得益于Google的啟發(fā),Doug Cutting使用Java語言對(duì)Google的云計(jì)算核心技術(shù)(主要是GFS和MapReduce)做了開源的實(shí)現(xiàn)。后來,Apache基金會(huì)整合Doug Cutting以及其他IT公司(如Facebook等)的貢獻(xiàn)成果,開發(fā)并推出了Hadoop生態(tài)系統(tǒng)。
【Hadoop的四大特性】
1、 可擴(kuò)展(Scalable):hadoop的分布式存儲(chǔ)和分布式計(jì)算是在集群節(jié)點(diǎn)完成的,可以方便地?cái)U(kuò)展到數(shù)以千計(jì)的節(jié)點(diǎn)中。
2、 低成本(Economical):可以通過普通機(jī)器組成的服務(wù)器群來分發(fā)以及處理數(shù)據(jù)。這些服務(wù)器群總計(jì)可達(dá)數(shù)千個(gè)節(jié)點(diǎn)。而且每個(gè)節(jié)點(diǎn)都是運(yùn)行在開源操作系統(tǒng)Linux上面的。
3、 高效率(Efficient):通過分發(fā)數(shù)據(jù),hadoop可以在數(shù)據(jù)所在的節(jié)點(diǎn)上并行地(parallel)處理它們,這使得數(shù)據(jù)處理非常的快速。
4、 高可靠性(Reliable):hadoop能自動(dòng)地維護(hù)數(shù)據(jù)的多份復(fù)制,并且在任務(wù)失敗后能自動(dòng)地重新部署(redeploy)計(jì)算任務(wù)。
【Hadoop生態(tài)圈主要項(xiàng)目】
Hadoop Common:一組分布式文件系統(tǒng)和通用I/O的組件與接口(序列化、Java RPC和持久化數(shù)據(jù)結(jié)構(gòu)),用于支持其他Hadoop模塊。
MapReduce:并行計(jì)算框架,非常適合在大量計(jì)算機(jī)組成的分布式并行環(huán)境里進(jìn)行數(shù)據(jù)處理。
HDFS:分布式文件系統(tǒng),有著高容錯(cuò)性特點(diǎn),設(shè)計(jì)用來部署在低廉的硬件上,適合那些有著超大數(shù)據(jù)集的應(yīng)用程序。
Zookeeper:一個(gè)分布式、高性能的協(xié)調(diào)服務(wù),提供分布式鎖之類的基本服務(wù)用于構(gòu)建分布式應(yīng)用。
HBase:一個(gè)分布式、按列存儲(chǔ)數(shù)據(jù)庫,使用HDFS作為底層存儲(chǔ),同時(shí)支持MapReduce的批量式計(jì)算和點(diǎn)查詢(隨機(jī)讀?。?。
Pig:一種數(shù)據(jù)流語言和運(yùn)行環(huán)境,用以檢索非常大的數(shù)據(jù)集,運(yùn)行在MapReduce和HDFS的集群上。
Hive:數(shù)據(jù)倉庫工具,提供基于SQL的查詢語言(運(yùn)行時(shí)翻譯成MapReduce作業(yè))用于數(shù)據(jù)的離線分析。
Mahout:一個(gè)在Hadoop上運(yùn)行的可擴(kuò)展的機(jī)器學(xué)習(xí)算法和數(shù)據(jù)挖掘類庫。
Avro:一種支持高效、跨語言的RPC以及永久存儲(chǔ)數(shù)據(jù)的序列化系統(tǒng)。
Sqoop:在傳統(tǒng)數(shù)據(jù)庫和HDFS之間高效傳輸數(shù)據(jù)的工具。
【HDFS 概覽】
HDFS是一個(gè)Apache Software Foundation項(xiàng)目,是Apache Hadoop項(xiàng)目的一個(gè)子項(xiàng)目。HDFS非常適于存儲(chǔ)和管理大型數(shù)據(jù)(GB、TB、PB級(jí)),HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。HDFS放寬了一部分POSIX約束,來實(shí)現(xiàn)流式讀取文件系統(tǒng)數(shù)據(jù)的目的。
HDFS的設(shè)計(jì)思想“一次寫入,多次讀?。╳rite-once-read-many)”,一個(gè)數(shù)據(jù)集一旦由數(shù)據(jù)源生成,就會(huì)被復(fù)制分發(fā)到不同的存儲(chǔ)節(jié)點(diǎn)中,然后響應(yīng)各種各樣的數(shù)據(jù)分析任務(wù)請(qǐng)求。HDFS處理的應(yīng)用一般是批處理,而不是用戶交互式處理,注重的是數(shù)據(jù)的吞吐量而不是數(shù)據(jù)的訪問速度。
HDFS特點(diǎn):高容錯(cuò)性、高吞吐量、故障的檢測和自動(dòng)快速恢復(fù)、流式的數(shù)據(jù)訪問、大數(shù)據(jù)集、一次寫入,多次讀寫
HDFS不適用的場景:不適合大量小文件的存儲(chǔ)、不適合隨機(jī)讀寫、不支持對(duì)文件隨機(jī)修改。
【Hadoop構(gòu)造模塊】
運(yùn)行Hadoop的意思其實(shí)就是運(yùn)行一組守護(hù)進(jìn)程(daemons),每個(gè)進(jìn)程都有各自的角色,有的僅運(yùn)行在單個(gè)服務(wù)器上,有的則運(yùn)行在集群多個(gè)服務(wù)器上,包括:
NameNode:整個(gè)文件系統(tǒng)的管理節(jié)點(diǎn),負(fù)責(zé)文件系統(tǒng)名字空間(NameSpace)的管理與維護(hù),同時(shí)負(fù)責(zé)客戶端文件操作的控制以及具體存儲(chǔ)任務(wù)的管理與分配。
Secondary NameNode:負(fù)責(zé)監(jiān)控HDFS狀態(tài)的輔助后臺(tái)程序,與NameNode通訊,定期保存HDFS元數(shù)據(jù)快照。
DataNode:提供真實(shí)文件數(shù)據(jù)的存儲(chǔ)服務(wù),負(fù)責(zé)處理文件系統(tǒng)客戶端的讀寫請(qǐng)求。
JobTracker:每個(gè)集群只有一個(gè)JobTracker守護(hù)進(jìn)程,是用于處理作業(yè)的后臺(tái)程序,決定有哪些文件參與作業(yè)處理,分配task執(zhí)行的節(jié)點(diǎn),監(jiān)控task并重啟失敗的task。
TaskTracker:管理各自所在節(jié)點(diǎn)上的task,與DataNode進(jìn)行數(shù)據(jù)交互負(fù)責(zé)執(zhí)行具體的任務(wù)。
【HDFS架構(gòu)】
HDFS采用master/slave架構(gòu)。一個(gè)HDFS集群是由一個(gè)Namenode和一定數(shù)目的Datanodes組成。Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的名字空間(namespace)以及客戶端對(duì)文件的訪問。集群中的Datanode一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理它所在節(jié)點(diǎn)上的存儲(chǔ)。HDFS暴露了文件系統(tǒng)的名字空間,用戶能夠以文件的形式在上面存儲(chǔ)數(shù)據(jù)。從內(nèi)部看,一個(gè)文件其實(shí)被分成一個(gè)或多個(gè)數(shù)據(jù)塊,這些塊存儲(chǔ)在一組Datanode上。Namenode執(zhí)行文件系統(tǒng)的名字空間操作,比如打開、關(guān)閉、重命名文件或目錄。它也負(fù)責(zé)確定數(shù)據(jù)塊到具體Datanode節(jié)點(diǎn)的映射。Datanode負(fù)責(zé)處理文件系統(tǒng)客戶端的讀寫請(qǐng)求。在Namenode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。

【HDFS的高可用(HA)機(jī)制】
Hadoop2.X版本之前,NameNode是HDFS集群的單點(diǎn)故障點(diǎn)(SPOF)
影響HDFS集群不可用主要包括兩種情況:1、類似機(jī)器宕機(jī)這樣的意外情況將導(dǎo)致集群不可用,只有重啟NameNode之后才可使用。2、計(jì)劃內(nèi)的軟件或硬件升級(jí)(NameNode節(jié)點(diǎn)),將導(dǎo)致集群在短時(shí)間范圍內(nèi)不可用
一個(gè)典型的HA(High Availability)集群,兩個(gè)單獨(dú)的機(jī)器配置為NameNode,在任何時(shí)候,一個(gè)NameNode處于活動(dòng)狀態(tài),另一個(gè)處于待機(jī)狀態(tài),活動(dòng)NameNode負(fù)責(zé)處理集群中所有客戶端的操作,待機(jī)時(shí)僅僅作為一個(gè)Slave,保持足夠的狀態(tài),如果有必要提供一個(gè)快速的故障轉(zhuǎn)移機(jī)制。
為了提供快速的故障轉(zhuǎn)移,必須保證備用節(jié)點(diǎn)有最新的集群中塊的位置信息,為了達(dá)到這一點(diǎn),DataNode節(jié)點(diǎn)需要配置兩個(gè)NameNode的位置,同時(shí)發(fā)送塊的位置信息和心跳信息到兩個(gè)NameNode。
同時(shí)為了防止"腦裂場景"的出現(xiàn),必須為共享存儲(chǔ)配置至少一個(gè)fencing方法。在宕機(jī)期間,如果不能確定之間的活動(dòng)節(jié)點(diǎn)已經(jīng)放棄活動(dòng)狀態(tài),fencing進(jìn)程負(fù)責(zé)中斷以前的活動(dòng)節(jié)點(diǎn)編輯存儲(chǔ)的共享訪問,這可以防止任何進(jìn)一步的修改名字空間,允許新的活動(dòng)節(jié)點(diǎn)安全地進(jìn)行故障轉(zhuǎn)移。
【HDFS的心跳機(jī)制】
主節(jié)點(diǎn)和從節(jié)點(diǎn)之間的通信是通過心跳機(jī)制(HeartBeat)實(shí)現(xiàn)的,如NameNode與DataNode之間,JobTracker和TaskTracker之間。所謂“心跳”是一種形象化描述,指的是持續(xù)的按照一定頻率在運(yùn)行,類似于心臟在永無休止的跳動(dòng)??蛻舳嗣扛魩追昼姲l(fā)送一個(gè)固定信息給服務(wù)端,服務(wù)端收到后回復(fù)一個(gè)固定信息如果服務(wù)端幾分鐘內(nèi)沒有收到客戶端信息則視客戶端斷開。Namenode周期性地從集群中的每個(gè)Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告(Blockreport)。接收到心跳信號(hào)意味著該Datanode節(jié)點(diǎn)工作正常。Tasktracker周期性的向JobTracker發(fā)送心跳匯報(bào)節(jié)點(diǎn)和任務(wù)狀態(tài)信息,及時(shí)讓Jobtracker獲取各個(gè)節(jié)點(diǎn)上的資源使用情況和任務(wù)運(yùn)行狀態(tài)。
【HDFS 聯(lián)邦(Federation)】
HDFS Federation是解決NameNode單點(diǎn)問題的一種水平橫向擴(kuò)展方案。主要解決幾個(gè)問題:
1、命名空間的擴(kuò)展。在HDFS Federation的情況下,元數(shù)據(jù)的管理與存放被分隔開,但真實(shí)數(shù)據(jù)的存儲(chǔ)還是共用。隨著集群使用時(shí)間的加長,HDFS上存放的數(shù)據(jù)也將會(huì)越來越多.這個(gè)時(shí)候如果還是將所有的數(shù)據(jù)都往一個(gè)NameNode上存放,這個(gè)文件系統(tǒng)會(huì)顯得非常的龐大。這時(shí)候可以進(jìn)行橫向擴(kuò)展,把一些大的目錄分離出去,使得每個(gè)NameNode下的數(shù)據(jù)看起來更加的精簡。
2、性能提升。當(dāng)NameNode所持有的數(shù)據(jù)量達(dá)到了一個(gè)非常大規(guī)模的量級(jí)的時(shí)候(比如超過1億個(gè)文件),NameNode的處理效率會(huì)受到影響,比較容易會(huì)陷入繁忙的狀態(tài)。而整個(gè)集群將受限于一個(gè)單點(diǎn)NameNode的處理效率,從而影響集群整體的吞吐量。采多NameNode機(jī)制可以減輕壓力。
3、資源的隔離。通過多個(gè)命名空間,將關(guān)鍵數(shù)據(jù)文件目錄移到不同的NameNode上,避免這些關(guān)鍵數(shù)據(jù)的讀寫操作受到其他普通文件讀寫操作的影響,也就是說這些NameNode將會(huì)只處理特定的關(guān)鍵的任務(wù)所發(fā)來的請(qǐng)求,而屏蔽了其他普通任務(wù)的文件讀寫請(qǐng)求,以此做到了資源的隔離。
【HDFS安全模式】
安全模式主要是為了系統(tǒng)啟動(dòng)的時(shí)候檢查各個(gè)DataNode上數(shù)據(jù)塊的有效性,同時(shí)根據(jù)策略進(jìn)行必要的復(fù)制或者刪除部分?jǐn)?shù)據(jù)塊。
設(shè)計(jì)安全模式的目的在于:HDFS啟動(dòng)過程中,NameNode還無法獲取DataNode上各數(shù)據(jù)塊的狀態(tài),無法保證可以正常對(duì)外提供數(shù)據(jù)存儲(chǔ)服務(wù)。為保護(hù)系統(tǒng)安全和數(shù)據(jù)的完整,在此期間不對(duì)外提供服務(wù)(不允許對(duì)文件修改、刪除)。待NameNode完全獲知各DataNode上各數(shù)據(jù)塊的狀態(tài),并根據(jù)策略完成必要的復(fù)制或刪除數(shù)據(jù)塊后,再退出安全模式,對(duì)外開始提供服務(wù)。何時(shí)退出安全模式?啟動(dòng)過程中,各DataNode向NameNode上報(bào)各個(gè)數(shù)據(jù)塊的狀態(tài)(含副本數(shù))。當(dāng)NameNode檢測到達(dá)到最小副本數(shù)(dfs.replication.min)的數(shù)據(jù)塊比率達(dá)到99.9%(可通過參數(shù)配置)時(shí),自動(dòng)退出安全模式。
【Hadoop的三種運(yùn)行模式】
1、單機(jī)(本地)模式
這種模式在一臺(tái)單機(jī)上運(yùn)行,沒有分布式文件系統(tǒng),而是直接讀寫本地操作系統(tǒng)的文件系統(tǒng)。在單機(jī)模式(standalone)中不會(huì)存在守護(hù)進(jìn)程,所有東西都運(yùn)行在一個(gè)JVM上。單機(jī)模式適用于開發(fā)過程中運(yùn)行MapReduce程序,在單機(jī)模式下調(diào)試MR程序非常高效方便,這也是最少使用的一個(gè)模式。
2、偽分布式模式
這種模式在一臺(tái)單機(jī)上運(yùn)行,但用不同的Java進(jìn)程模仿分布式運(yùn)行中的各類節(jié)點(diǎn),模擬一個(gè)小規(guī)模的集群。偽分布式適用于開發(fā)和測試環(huán)境,在這個(gè)模式中,所有守護(hù)進(jìn)程都在同一臺(tái)機(jī)器上運(yùn)行。
3、完全分布式模式
這種模式通常被用于生產(chǎn)環(huán)境,使用N臺(tái)主機(jī)組成一個(gè)Hadoop集群,Hadoop守護(hù)進(jìn)程運(yùn)行在各臺(tái)主機(jī)之上。這里會(huì)存在Namenode運(yùn)行的主機(jī),Datanode運(yùn)行的主機(jī),以及resourcemanager運(yùn)行的主機(jī)等。在分布式環(huán)境下,主節(jié)點(diǎn)和從節(jié)點(diǎn)會(huì)分開。
【HDFS元數(shù)據(jù)】
NameNode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的名字空間和文件數(shù)據(jù)塊映射等元數(shù)據(jù)。如果NameNode宕機(jī),那么整個(gè)集群就癱瘓了,所以需要對(duì)這些元數(shù)據(jù)進(jìn)行持久化存儲(chǔ)。
元數(shù)據(jù),正所謂數(shù)據(jù)的數(shù)據(jù),包含有三類重要信息:
第一類是文件和目錄自身的屬性信息,例如文件名、目錄名、父目錄信息、文件大小、創(chuàng)建時(shí)間、修改時(shí)間等。
第二類記錄文件內(nèi)容存儲(chǔ)相關(guān)信息,例如文件塊情況、副本個(gè)數(shù)、每個(gè)副本所在的Data Node 信息等。
第三類用來記錄HDFS中所有DataNode信息,用于DataNode管理。
HDFS元數(shù)據(jù)存儲(chǔ)機(jī)制:內(nèi)存中有一份完整的元數(shù)據(jù)(內(nèi)存meta data),磁盤有一個(gè)“準(zhǔn)完整”的元數(shù)據(jù)鏡像(fsimage)文件(在namenode的工作目錄中)、以及用于銜接內(nèi)存metadata和持久化元數(shù)據(jù)鏡像fsimage之間的操作日志(edits文件),當(dāng)客戶 端對(duì)hdfs中的文件進(jìn)行新增或者修改操作,操作記錄首先被記入edits日志文件中,當(dāng)客戶端操作成功 后,相應(yīng)的元數(shù)據(jù)會(huì)更新到內(nèi)存meta.data中。
【HDFS元數(shù)據(jù)持久化原理】
上一篇說到HDFS文件系統(tǒng)的命名空間等元數(shù)據(jù)是由NameNode來存儲(chǔ)的,元數(shù)據(jù)保存著HDFS系統(tǒng)的重要信息。
NameNode用事務(wù)日志(EditsLog)來持久化每一個(gè)對(duì)文件系統(tǒng)的元數(shù)據(jù)的改變,即對(duì)元數(shù)據(jù)的每一步操作都會(huì)被記錄到EditsLog中.NameNode在本地文件系統(tǒng)中用一個(gè)文件來存儲(chǔ)這個(gè)EditsLog,完整的文件系統(tǒng)名字空間、文件塊的映射和文件系統(tǒng)的配置都存在一個(gè)叫Fsimage的文件中,F(xiàn)simage也是在NameNode的本地文件系統(tǒng)中。CheckPoint(檢查點(diǎn)):當(dāng)NameNode啟動(dòng)的時(shí)候,它會(huì)從磁盤中讀取Fsimage和EditsLog文件,然后將新的元數(shù)據(jù)刷新到本地磁盤中,生成一個(gè)新的Fsimage文件,至此EditsLog文件已經(jīng)被處理并持久化的Fsimage中,任何對(duì)Fsimage和EditsLog的更新都會(huì)同步地更新每一個(gè)副本。如果NameNode宕機(jī)或是重啟,內(nèi)存中沒有元數(shù)據(jù),那hdfs重新啟動(dòng)的時(shí)候,數(shù)據(jù)就從fsimage和edits這兩個(gè)文件中加載,恢復(fù)系統(tǒng)之前的狀態(tài)。
【HDFS讀寫流程】
HDFS采用master/slave架構(gòu)。一個(gè)HDFS集群是由多個(gè)Namenode和一定數(shù)目的Datanodes組成。Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的名字空間(namespace)以及客戶端對(duì)文件的訪問。集群中的Datanode一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理它所在節(jié)點(diǎn)上的存儲(chǔ)。HDFS中的文件是一次性寫入的,并且嚴(yán)格要求在任何時(shí)候只能有一個(gè)寫入者。
文件寫入過程:1.Client向NameNode發(fā)起文件寫入的請(qǐng)求。2 .NameNode根據(jù)文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。3. Client將文件劃分為多個(gè)Block,根據(jù)DataNode的地址信息,按順序?qū)懭氲矫恳粋€(gè)DataNode塊中。
文件讀取過程:1. Client向NameNode發(fā)起文件讀取的請(qǐng)求。2. NameNode返回文件存儲(chǔ)的DataNode的信息。3. Client讀取文件信息。
【HDFS副本機(jī)制】
副本技術(shù)即分布式數(shù)據(jù)復(fù)制技術(shù),是分布式計(jì)算的一個(gè)重要組成部分。該技術(shù)允許數(shù)據(jù)在多個(gè)服務(wù)器端共享,一個(gè)本地服務(wù)器可以存取不同物理地點(diǎn)的遠(yuǎn)程服務(wù)器上的數(shù)據(jù),也可以使所有的服務(wù)器均持有數(shù)據(jù)的拷貝。副本機(jī)制有一下優(yōu)點(diǎn):
1、提高系統(tǒng)可靠性,系統(tǒng)不可避免的會(huì)產(chǎn)生故障和錯(cuò)誤,擁有多個(gè)副本的文件系統(tǒng)不會(huì)導(dǎo)致無法訪問的情況,從而提高了系統(tǒng)的可用性。另外,系統(tǒng)可以通過其他完好的副本對(duì)發(fā)生錯(cuò)誤的副本進(jìn)行修復(fù),從而提高了系統(tǒng)的容錯(cuò)性。2、負(fù)載均衡,副本可以對(duì)系統(tǒng)的負(fù)載量進(jìn)行擴(kuò)展。多個(gè)副本存放在不同的服務(wù)器上,可有效的分擔(dān)工作量,從而將較大的工作量有效的分布在不同的站點(diǎn)上。
提高訪問效率:將副本創(chuàng)建在訪問頻度較大的區(qū)域,即副本在訪問節(jié)點(diǎn)的附近,相應(yīng)減小了其通信開銷,從而提高了整體的訪問效率。
HDFS中的默認(rèn)三副本機(jī)制(三個(gè)以上的隨機(jī)存儲(chǔ)) ,第一副本:如果上傳節(jié)點(diǎn)是DN,則上傳該節(jié)點(diǎn);如果上傳節(jié)點(diǎn)是NN,則隨機(jī)選擇DN ;第二副本:放置在不同機(jī)架的DN上 ;第三副本:放置在與第二副本相同機(jī)架的不同DN上
【Hadoop機(jī)架感知策略】
在分布式集群下,由于機(jī)架的的槽位和交換機(jī)網(wǎng)口數(shù)量的限制,使得集群上的機(jī)器不得不跨越機(jī)架,通常一個(gè)大型的集群會(huì)跨越很多機(jī)架。一般情況機(jī)架內(nèi)機(jī)器的通訊會(huì)快于跨機(jī)架機(jī)器之間的通訊,并且機(jī)架之間機(jī)器的網(wǎng)絡(luò)通信通常受到上層交換機(jī)間網(wǎng)絡(luò)帶寬的限制。通過機(jī)架感知,可以帶來性能和安全性的提升。沒有配置機(jī)架信息時(shí),所有的機(jī)器hadoop都默認(rèn)在同一個(gè)默認(rèn)的機(jī)架下,名為/default-rack,這種情況下,任何一臺(tái) datanode機(jī)器,不管物理上是否屬于同一個(gè)機(jī)架,都會(huì)被認(rèn)為是在同一個(gè)機(jī)架下,此時(shí)就很容易出現(xiàn)增加機(jī)架間網(wǎng)絡(luò)負(fù)載的情況。當(dāng)配置了機(jī)架感知信息以后,hadoop在選擇三個(gè)datanode時(shí)就充分考慮副本機(jī)制存放策略,將副本分散在不同機(jī)架下,盡量地減少網(wǎng)絡(luò)帶寬資源的消耗。
【MapReduce簡介】
MapReduce是一種分布式計(jì)算模型,由Google提出,主要用于搜索領(lǐng)域,解決海量數(shù)據(jù)的計(jì)算問題。MapReduce的核心,就是對(duì)一個(gè)需要計(jì)算的任務(wù)進(jìn)行拆分,然后并行處理。MapReduce合并了兩種經(jīng)典函數(shù):映射(Mapping)對(duì)集合里的每個(gè)目標(biāo)應(yīng)用同一個(gè)操作。化簡歸約(Reducing)遍歷集合中的元素來返回一個(gè)綜合的結(jié)果。首先Client向JobTracker提交一個(gè)任務(wù)。JobTracker將任務(wù)分配到一個(gè)或者多個(gè)TaskTracker進(jìn)行處理。不同的TaskTracker上,有的運(yùn)行的是Map階段的任務(wù),有的運(yùn)行是Reduce階段的任務(wù)。對(duì)于map階段,首先對(duì)輸入的內(nèi)容進(jìn)行分割(InputSplit),不同Mapper任務(wù)負(fù)責(zé)各自的分割后的內(nèi)容的映射。對(duì)于Reduce階段,接受多個(gè)Mapper的輸出,進(jìn)行歸一后,得到最終的輸出。
【MapReduce執(zhí)行步驟】
- map任務(wù)處理
1.1讀取輸入文件內(nèi)容,對(duì)輸入文件的每一行,解析成key、value對(duì)。每一個(gè)鍵值對(duì)調(diào)用一次map函數(shù)。
1.2寫自己的邏輯,對(duì)輸入的key、value處理,轉(zhuǎn)換成新的key、value輸出。
1.3對(duì)輸出的key、value進(jìn)行分區(qū)。
1.4對(duì)不同分區(qū)的數(shù)據(jù),按照key進(jìn)行排序、分組。相同key的value放到一個(gè)集合中。
1.5(可選)分組后的數(shù)據(jù)進(jìn)行歸約。
2.reduce任務(wù)處理
2.1對(duì)多個(gè)map任務(wù)的輸出,按照不同的分區(qū),通過網(wǎng)絡(luò)傳輸?shù)讲煌膔educe節(jié)點(diǎn)。
2.2對(duì)多個(gè)map任務(wù)的輸出進(jìn)行合并、排序。執(zhí)行reduce函數(shù)的具體數(shù)據(jù)處理邏輯,對(duì)輸入的key、value處理,轉(zhuǎn)換成新的key、value輸出。
2.3將reduce的計(jì)算結(jié)果輸出保存到文件中。
【MapReduce的主要設(shè)計(jì)思想和特征】
1、向“外”橫向擴(kuò)展,而非向“上”縱向擴(kuò)展(Scale “out", not “up”)
即MapReduce集群的構(gòu)筑選用價(jià)格便宜、易于擴(kuò)展的大量低端商用服務(wù)器,而非價(jià)格昂貴、不易擴(kuò)展的高端服務(wù)器。
對(duì)于大規(guī)模數(shù)據(jù)處理,由于有大量數(shù)據(jù)存儲(chǔ)需要,基于低端服務(wù)器的集群遠(yuǎn)比基于高端服務(wù)器的集群優(yōu)越。
2、失效被認(rèn)為是常態(tài)(Assume failures are common)
MapReduce集群中使用大量的低端服務(wù)器,因此節(jié)點(diǎn)硬件失效和軟件出錯(cuò)是常態(tài)。
MapReduce并行計(jì)算軟件框架使用了多種有效的機(jī)制,如節(jié)點(diǎn)自動(dòng)重啟技術(shù),使集群和計(jì)算框架具有對(duì)付節(jié)點(diǎn)失效的健壯性,能有效處理失效節(jié)點(diǎn)的檢測和恢復(fù)。當(dāng)失效節(jié)點(diǎn)恢復(fù)后能自動(dòng)無縫加入集群,不會(huì)因?yàn)楣?jié)點(diǎn)失效而影響計(jì)算服務(wù)的質(zhì)量。
3、處理向數(shù)據(jù)遷移(Moving processing to the data)
MapReduce采用了數(shù)據(jù)/代碼互定位的技術(shù)方法,計(jì)算節(jié)點(diǎn)盡量負(fù)責(zé)計(jì)算其本地存儲(chǔ)的數(shù)據(jù),以發(fā)揮數(shù)據(jù)本地化特點(diǎn)(locality),僅當(dāng)節(jié)點(diǎn)無法處理本地?cái)?shù)據(jù)時(shí),再采用就近原則尋找其它可用計(jì)算節(jié)點(diǎn),并把數(shù)據(jù)傳送到該可用計(jì)算節(jié)點(diǎn)。
4、順序處理數(shù)據(jù)、避免隨機(jī)訪問數(shù)據(jù)(Process data sequentially and avoid random access)
5、為應(yīng)用開發(fā)者隱藏系統(tǒng)層細(xì)節(jié)(Hide system-level details from the application developer)
大規(guī)模數(shù)據(jù)處理時(shí)程序員需要考慮諸如數(shù)據(jù)分布存儲(chǔ)管理、數(shù)據(jù)分發(fā)、數(shù)據(jù)通信和同步、計(jì)算結(jié)果收集等諸多細(xì)節(jié)問題?。MapReduce提供了一種抽象機(jī)制隔離系統(tǒng)層細(xì)節(jié),以致力于應(yīng)用本身的算法設(shè)計(jì)。
【MapReduce提供的主要功能】
1、任務(wù)調(diào)度:計(jì)算作業(yè)(job)被細(xì)分為多個(gè)計(jì)算任務(wù)(tasks), 為任務(wù)分配計(jì)算節(jié)點(diǎn); 同時(shí)負(fù)責(zé)監(jiān)控節(jié)點(diǎn)的執(zhí)行狀態(tài)和計(jì)算性能優(yōu)化處理, 如對(duì)最慢的計(jì)算任務(wù)采用多備份執(zhí)行、選最快完成者作為結(jié)果。
2、數(shù)據(jù)/代碼互定位:減少數(shù)據(jù)通信,本地化數(shù)據(jù)處理,即一個(gè)計(jì)算節(jié)點(diǎn)盡可能處理其本地磁盤上所分布存儲(chǔ)的數(shù)據(jù),實(shí)現(xiàn)了代碼向數(shù)據(jù)的遷移;當(dāng)無法進(jìn)行這種本地化數(shù)據(jù)處理時(shí),盡可能就近尋找數(shù)據(jù)以減少通信延遲。
3、出錯(cuò)處理:MapReducer能檢測并隔離出錯(cuò)節(jié)點(diǎn),將調(diào)度分配新的節(jié)點(diǎn)接管出錯(cuò)節(jié)點(diǎn)的計(jì)算任務(wù)
?4、Combiner和Partitioner:為了減少數(shù)據(jù)通信開銷,中間結(jié)果數(shù)據(jù)進(jìn)入reduce節(jié)點(diǎn)前需要進(jìn)行合并(combine)處理,把具有同樣主鍵的數(shù)據(jù)合并到一起避免重復(fù)傳送; 一個(gè)reducer節(jié)點(diǎn)所處理的數(shù)據(jù)可能會(huì)來自多個(gè)map節(jié)點(diǎn)。因此, map節(jié)點(diǎn)輸出的中間結(jié)果需使用一定的策略進(jìn)行適當(dāng)?shù)膭澐?partitioner)處理,保證相關(guān)數(shù)據(jù)發(fā)送到同一個(gè)reducer節(jié)點(diǎn)。
【Mapreduce之JobTracker】
JobTracker主要負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度。JobTracker監(jiān)控所有TaskTracker與作業(yè)的健康狀況,一旦發(fā)現(xiàn)失敗情況后,其會(huì)將相應(yīng)的任務(wù)轉(zhuǎn)移到其它節(jié)點(diǎn)。同時(shí),JobTracker會(huì)跟蹤任務(wù)的執(zhí)行進(jìn)度、資源使用量等信息,并將這些信息告訴任務(wù)調(diào)度器,而調(diào)度器會(huì)在資源出現(xiàn)空閑時(shí),選擇合適的任務(wù)使用這些資源。在Hadoop中,任務(wù)調(diào)度器是一個(gè)可插拔的模塊,用戶可以根據(jù)自己的需要設(shè)計(jì)相應(yīng)的調(diào)度器。
【Mapreduce之TaskTracker】
TaskTracker會(huì)周期性地通過Heartbeat將本節(jié)點(diǎn)上資源的使用情況和任務(wù)的運(yùn)行進(jìn)度匯報(bào)給JobTracker,同時(shí)接收J(rèn)obTracker發(fā)送過來的命令并執(zhí)行相應(yīng)的操作(例如啟動(dòng)新任務(wù)、殺死任務(wù)等)。TaskTracker使用“slot”等量劃分本節(jié)點(diǎn)的數(shù)量,“slot”代表計(jì)算資源(CPU、內(nèi)存等)。一個(gè)Task獲取到一個(gè)slot后才有機(jī)會(huì)運(yùn)行,而Hadoop調(diào)度器的作用就是將各個(gè)TaskTracker上的空閑slot分配給Task使用。Slot分為Map slot和Reduce slot兩種,分別提供Map Task和Reduce Task。TaskTracker通過slot數(shù)目限定Task的并發(fā)度。
【Mapreduce之Task】
Task分為Map Task和Reduce Task兩種,均由TaskTracker啟動(dòng)。HDFS以固定大小的block為基本單位存儲(chǔ)數(shù)據(jù),而對(duì)于MapReduce而言,其處理基本單位是分片(split)。split是一個(gè)邏輯概念,它只包含一些元數(shù)據(jù)信息,比如數(shù)據(jù)起始位置、數(shù)據(jù)長度、數(shù)據(jù)所在節(jié)點(diǎn)等等。它的劃分方法完全由用戶自己決定,但是建議split的劃分大小與HDFS的block大小一致。但需要注意的是,split的多少?zèng)Q定Map Task的數(shù)目,因?yàn)槊總€(gè)split會(huì)交由一個(gè)Map Task處理。因此,合理地設(shè)置Job中Tasks數(shù)的大小能顯著的改善Hadoop執(zhí)行的性能。增加task的個(gè)數(shù)會(huì)增加系統(tǒng)框架的開銷,但同時(shí)也會(huì)增強(qiáng)負(fù)載均衡并降低任務(wù)失敗的開銷。
【經(jīng)典MapReduce(MRv1)的局限性】
經(jīng)典MapReduce的最嚴(yán)重的限制主要在于可伸縮性、資源利用和對(duì)與MapReduce不同的工作負(fù)載的支持。在MapReduce框架中,作業(yè)執(zhí)行受JobTracker和TaskTracker進(jìn)程控制。大型的Hadoop集群會(huì)出現(xiàn)單個(gè)JobTracker導(dǎo)致的可伸縮性瓶頸。
此外,較小和較大的Hadoop集群都從未最高效地使用他們的計(jì)算資源。在HadoopMapReduce中,每個(gè)從屬節(jié)點(diǎn)上的計(jì)算資源由集群管理員分解為固定數(shù)量的map和reduceslot,這些slot不可替代。設(shè)定mapslot和reduceslot的數(shù)量后,節(jié)點(diǎn)在任何時(shí)刻都不能運(yùn)行比mapslot更多的map任務(wù),即使沒有reduce任務(wù)在運(yùn)行。這影響了集群的利用率,因?yàn)樵谒衜apslot都被使用時(shí),無法再使用任何reduceslot,即使它們可用,反之亦然。并且Hadoop設(shè)計(jì)為僅運(yùn)行MapReduce作業(yè)。隨著替代性的編程模型的出現(xiàn),除MapReduce外,越來越需要為可通過高效的、公平的方式在同一個(gè)集群上運(yùn)行并共享資源的其他編程模型提供支持。
【YARN:下一代Hadoop計(jì)算平臺(tái)】
YARN(YetAnotherResourceNegotiator)是Hadoop2.0版本為集群引入的一個(gè)資源管理層?;舅枷胧菍obTracker的兩個(gè)主要功能:資源管理作業(yè)調(diào)度和監(jiān)控分離,它將JobTracker守護(hù)進(jìn)程的職責(zé)分離了出來。其中資源管理器(ResourceManager,RM)用來代替集群管理器,ApplicationMaster(AM)代替一個(gè)專用且短暫的JobTracker,節(jié)點(diǎn)管理器(NodeManager,NM)代替TaskTracker,一個(gè)分布式應(yīng)用程序代替一個(gè)MapReduce作業(yè)。與第一版Hadoop中經(jīng)典的MapReduce引擎相比,YARN在可伸縮性、效率和靈活性上有著明顯的優(yōu)勢。小型和大型Hadoop集群都從YARN中受益匪淺。對(duì)于開發(fā)人員來說這些更改幾乎也是透明的,因此可以使用相同的MapReduceAPI和CLI運(yùn)行未經(jīng)修改的MapReduce作業(yè)。
【YARN:Container】
Container是YARN中的資源抽象,它封裝了某個(gè)節(jié)點(diǎn)上的多維資源,如CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等。當(dāng)ApplicationMaster向資源管理器RM申請(qǐng)資源時(shí),RM向AM返回的資源便是用Container表示的。YARN會(huì)為每個(gè)任務(wù)分配一個(gè)Container,且該任務(wù)只能使用該Container中描述的資源。Container是一個(gè)動(dòng)態(tài)資源劃分單位,是根據(jù)應(yīng)用程序的需求自動(dòng)生成的。目前,YARN僅支持CPU和內(nèi)存兩種資源。既然一個(gè)Container指的是具體節(jié)點(diǎn)上的計(jì)算資源,這就意味著Container中必定含有計(jì)算資源的位置信息:計(jì)算資源位于哪個(gè)機(jī)架的哪臺(tái)機(jī)器上。所以應(yīng)用在請(qǐng)求某個(gè)Container時(shí),其實(shí)是向某臺(tái)機(jī)器發(fā)起請(qǐng)求,請(qǐng)求這臺(tái)機(jī)器上的CPU和內(nèi)存資源。任何一個(gè)job或application必須運(yùn)行在一個(gè)或多個(gè)Container中,在Yarn框架中,ResourceManager只負(fù)責(zé)告訴ApplicationMaster哪些Containers可以用,ApplicationMaster還需要去找NodeManager請(qǐng)求分配具體的Container。
【YARN:ResourceManager(RM)】
RM是一個(gè)全局的資源管理器,負(fù)責(zé)整個(gè)系統(tǒng)的資源管理和分配。它主要由兩個(gè)組件構(gòu)成:調(diào)度器(Scheduler)和應(yīng)用程序管理器(Applications Manager,ASM)。(1)調(diào)度器(分配Container)根據(jù)容量、隊(duì)列等限制條件,將系統(tǒng)中的資源分配給各個(gè)正在運(yùn)行的應(yīng)用程序。它不再從事任何與具體應(yīng)用程序相關(guān)的工作,比如不負(fù)責(zé)監(jiān)控或者跟蹤應(yīng)用的執(zhí)行狀態(tài)等,也不負(fù)責(zé)重新啟動(dòng)因應(yīng)用執(zhí)行失敗或者硬件故障而產(chǎn)生的失敗任務(wù),這些均交由應(yīng)用程序相關(guān)的ApplicationMaster完成。調(diào)度器僅根據(jù)各個(gè)應(yīng)用程序的資源需求進(jìn)行資源分配。此外,該調(diào)度器是一個(gè)可插拔的組件,用戶可根據(jù)自己的需要設(shè)計(jì)新的調(diào)度器,YARN提供了多種直接可用的調(diào)度器,比如Fair Scheduler和Capacity Scheduler等。(2)應(yīng)用程序管理器,負(fù)責(zé)管理整個(gè)系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動(dòng)ApplicationMaster、監(jiān)控ApplicationMaster運(yùn)行狀態(tài)并在失敗時(shí)重新啟動(dòng)等。
【YARN:ApplicationMaster(AM)和NodeManager(NM)】
在用戶提交一個(gè)應(yīng)用程序時(shí),ApplicationMaster 作為輕量型進(jìn)程實(shí)例會(huì)啟動(dòng)來協(xié)調(diào)應(yīng)用程序內(nèi)的所有任務(wù)的執(zhí)行。這包括監(jiān)視任務(wù),重新啟動(dòng)失敗的任務(wù),推測性地運(yùn)行緩慢的任務(wù),以及計(jì)算應(yīng)用程序計(jì)數(shù)器值的總和。這些職責(zé)以前分配給所有作業(yè)的單個(gè) JobTracker。ApplicationMaster 和屬于它的應(yīng)用程序的任務(wù),在受 NodeManager 控制的資源容器中運(yùn)行。NodeManager(NM)則是每個(gè)節(jié)點(diǎn)上的資源和任務(wù)管理器。一方面,它定時(shí)地向RM匯報(bào)本節(jié)點(diǎn)的資源使用情況和Container運(yùn)行狀態(tài);另一方面,它接受并處理來自AM的Container啟動(dòng)/停止等各種請(qǐng)求。NodeManager沒有固定數(shù)量的map和reduce slots,它是TaskTracker的一種更加普通和高效的版本。
44. 【數(shù)據(jù)庫 VS 數(shù)據(jù)倉庫】
數(shù)據(jù)庫和數(shù)據(jù)倉庫其實(shí)是一樣的或者及其相似的,都是通過某個(gè)數(shù)據(jù)庫軟件,基于某種數(shù)據(jù)模型來組織、管理數(shù)據(jù)。數(shù)據(jù)庫通常更關(guān)注業(yè)務(wù)交易處理(OLTP),而數(shù)據(jù)倉庫更關(guān)注數(shù)據(jù)分析層面(OLAP),由此產(chǎn)生的數(shù)據(jù)庫模型上也會(huì)有很大的差異。
數(shù)據(jù)庫通常追求交易的速度,交易完整性,數(shù)據(jù)的一致性等,在數(shù)據(jù)庫模型上主要遵從范式模型,從而盡可能減少數(shù)據(jù)冗余,保證引用完整性。數(shù)據(jù)倉庫是一個(gè)面向主題的(Subject Oriented),集成的(Integrate),相對(duì)穩(wěn)定的(Non-volatile),反映歷史變化(Time Variant)的數(shù)據(jù)集合,用于支持管理決策。主要區(qū)別在于:數(shù)據(jù)庫是面向事務(wù)的設(shè)計(jì),數(shù)據(jù)倉庫是面向主題設(shè)計(jì)的;數(shù)據(jù)庫一般存儲(chǔ)在線交易數(shù)據(jù),數(shù)據(jù)倉庫存儲(chǔ)的一般是歷史數(shù)據(jù);數(shù)據(jù)庫設(shè)計(jì)是盡量避免冗余,數(shù)據(jù)倉庫在設(shè)計(jì)時(shí)有意引入冗余;數(shù)據(jù)庫是為了捕獲數(shù)據(jù)而設(shè)計(jì),數(shù)據(jù)倉庫是為了分析數(shù)據(jù)而設(shè)計(jì);
45. 【Hive簡介】
Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具。它提供了一系列的工具,可以用來進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在 Hadoop 中的大規(guī)模數(shù)據(jù)的機(jī)制,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表。Hive 定義了簡單的類SQL查詢語言,稱為HQL,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行,它允許熟悉SQL的用戶查詢數(shù)據(jù),其優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過類SQL語句快速實(shí)現(xiàn)簡單的MapReduce統(tǒng)計(jì),不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉庫的統(tǒng)計(jì)分析。同時(shí),這個(gè)語言也允許熟悉MapReduce開發(fā)者的開發(fā)自定義的mapper 和reducer來處理內(nèi)建的mapper和reducer無法完成的復(fù)雜的分析工作。
46. 【Hive體系架構(gòu)】
Hive是客戶端服務(wù)器(C/S)模式。
服務(wù)端組件:
Driver組件:該組件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進(jìn)行解析、編譯優(yōu)化,生成執(zhí)行計(jì)劃,然后調(diào)用底層的mapreduce計(jì)算框架。
Metastore組件:元數(shù)據(jù)服務(wù)組件,這個(gè)組件存儲(chǔ)hive的元數(shù)據(jù),hive的元數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫里,hive支持的關(guān)系數(shù)據(jù)庫有derby、mysql。元數(shù)據(jù)對(duì)于hive十分重要,因此hive支持把metastore服務(wù)獨(dú)立出來,安裝到遠(yuǎn)程的服務(wù)器集群里,從而解耦hive服務(wù)和metastore服務(wù),保證hive運(yùn)行的健壯性。
Thrift服務(wù):thrift是facebook開發(fā)的一個(gè)軟件框架,它用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā),hive集成了該服務(wù),能讓不同的編程語言調(diào)用hive的接口。
客戶端組件:
CLI:command line interface,命令行接口。
Thrift客戶端:hive架構(gòu)的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。
WEBGUI:hive客戶端提供了一種通過網(wǎng)頁的方式訪問hive所提供的服務(wù)。這個(gè)接口對(duì)應(yīng)hive的hwi組件(hive web interface),使用前要啟動(dòng)hwi服務(wù)。
47. 【Hive特點(diǎn)】
1、Hive 通過類 SQL 來分析大數(shù)據(jù),而避免了寫 MapReduce 程序來分析數(shù)據(jù),這樣使得分析數(shù)據(jù)更容易
2、將數(shù)據(jù)映射成數(shù)據(jù)庫和一張張的表,庫和表的元數(shù)據(jù)信息一般存在關(guān)系型數(shù)據(jù)庫上(比如 MySQL)
3、本身并不提供數(shù)據(jù)的存儲(chǔ)功能,數(shù)據(jù)一般都是存儲(chǔ)在 HDFS 上的(對(duì)數(shù)據(jù)完整性、格式要求并不嚴(yán)格)
4、容易擴(kuò)展自己的存儲(chǔ)能力和計(jì)算能力,這個(gè)是繼承自 hadoop (適用于大規(guī)模的并行計(jì)算)
5、Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來實(shí)現(xiàn)自己的函數(shù)
6、良好的容錯(cuò)性,節(jié)點(diǎn)出現(xiàn)問題SQL仍可完成執(zhí)行
7、專為 OLAP(在線分析處理) 設(shè)計(jì),不支持事務(wù)
48. 【Hive數(shù)據(jù)模型】
Hive沒有專門的數(shù)據(jù)存儲(chǔ)格式,也沒有為數(shù)據(jù)建立索引,用戶可以非常自由的組織Hive中的表,只需要在創(chuàng)建表的時(shí)候告訴
Hive數(shù)據(jù)中的列分隔符和行分隔符,Hive就可以解析數(shù)據(jù)。Hive中所有的數(shù)據(jù)都存儲(chǔ)在HDFS中,Hive中包含以下數(shù)據(jù)模型:表(Table),外部表(ExternalTable),分區(qū)(Partition),桶(Bucket)。
表:Hive中的Table和數(shù)據(jù)庫中的Table在概念上是類似的,每一個(gè)Table在Hive中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。
外部表:指向已經(jīng)在HDFS中存在的數(shù)據(jù),和Table在元數(shù)據(jù)的組織上是相同的,但實(shí)際數(shù)據(jù)的存儲(chǔ)則有較大的差異。當(dāng)刪除一個(gè)外部表時(shí),僅刪除元數(shù)據(jù),表中的數(shù)據(jù)不會(huì)真正被刪。
分區(qū):在Hive中,表中的一個(gè)Partition對(duì)應(yīng)于表下的一個(gè)目錄,所有的Partition的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。方便對(duì)表的管理以及提高查詢效率。
桶:Buckets對(duì)指定列計(jì)算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個(gè)Bucket對(duì)應(yīng)一個(gè)文件。
49. 【Hive部署方式】
1、內(nèi)嵌模式:使用內(nèi)嵌的Derby數(shù)據(jù)庫作為存儲(chǔ)元數(shù)據(jù),Derby只能接受一個(gè)Hive會(huì)話的訪問,不能用于生產(chǎn); hive服務(wù)、metastore服務(wù)、derby服務(wù)運(yùn)行在同一個(gè)進(jìn)程中。
2、本地模式:本地安裝mysql,替代derby存儲(chǔ)元數(shù)據(jù),是一個(gè)多用戶多客戶端的模式,作為公司內(nèi)部使用Hive;hive服務(wù)和metastore服務(wù)運(yùn)行在同一個(gè)進(jìn)程中,mysql數(shù)據(jù)庫則是單獨(dú)的進(jìn)程,可以同一臺(tái)機(jī)器,也可以在遠(yuǎn)程機(jī)器上。
3、遠(yuǎn)程模式(Remote): 遠(yuǎn)程安裝mysql 替代derby存儲(chǔ)元數(shù)據(jù);Hive服務(wù)和metastore在不同的進(jìn)程內(nèi),也可能是不同的機(jī)器;
50. 【Hive常用的文件存儲(chǔ)格式】
- textfile:文本文件
Hive默認(rèn)格式,數(shù)據(jù)不做壓縮,磁盤開銷大,數(shù)據(jù)解析開銷大。 - Sequencefile:二進(jìn)制文件
SequenceFile是Hadoop API 提供的一種二進(jìn)制文件,它將數(shù)據(jù)(key,value)的形式序列化到文件中。
這種二進(jìn)制文件內(nèi)部使用Hadoop的標(biāo)準(zhǔn)的Writable接口實(shí)現(xiàn)序列化和反序列化。它與Hadoop API中的MapFile是互相兼容的。
Hive中的SequenceFile繼承自Hadoop API 的SequenceFile,不過它的key為空,使用value 存放實(shí)際的值, 這樣是為了避免MR 在運(yùn)行map階段的排序過程。 - Rcfile:
RCFile是Hive推出的一種專門面向列的數(shù)據(jù)格式。 它遵循“先按列劃分,再垂直劃分”的設(shè)計(jì)理念。
當(dāng)查詢過程中,針對(duì)它并不關(guān)心的列時(shí),它會(huì)在IO上跳過這些列。但在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。
51. 【Hive數(shù)據(jù)類型】
- 基礎(chǔ)數(shù)據(jù)類型,與關(guān)系型數(shù)據(jù)庫類似:
TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。 - 復(fù)雜數(shù)據(jù)類型:
包括ARRAY,MAP,STRUCT,UNION,這些復(fù)雜類型是由基礎(chǔ)類型組成的。
ARRAY:ARRAY類型是由一系列相同數(shù)據(jù)類型元素組成的,這些元素可以通過下標(biāo)來訪問。比如有一個(gè)ARRAY類型的變量fruits,它是由[‘a(chǎn)pple’,’orange’,’mango’]組成,那么可以通過fruits[1]來訪問orange;
MAP:MAP包含key->value鍵值對(duì),可以通過key來訪問元素。比如"userlist"是一個(gè)map類型(其中username是key,password是value),那么我們可以通過userlist[‘username’]來得到這個(gè)用戶對(duì)應(yīng)的password;
STRUCT:STRUCT可以包含不同數(shù)據(jù)類型的元素。這些元素可以通過點(diǎn)的方式來得到,比如user是一個(gè)STRUCT類型,那么可以通過user.address得到這個(gè)用戶的地址。
52. 【Hive HQL】
hive中的HQL是一種SQL方言,支持絕大部分SQL-92標(biāo)準(zhǔn),并對(duì)其做了一些擴(kuò)展。
數(shù)據(jù)庫操作:
創(chuàng)建數(shù)據(jù)庫:hive > CREATE DATABASE IF NOT EXISTS test;
查看某個(gè)已存在的數(shù)據(jù)庫:hive> DESCRIBE DATABASE test;
表操作:
CREATE TABLE IF NOT EXISTS test.student(
name STRING COMMENT 'student name',
age INT COMMENT 'student age')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/test.db/student';
查看表:hive> DESC FORMATTED student
刪除表:hive> DROP TABLE IF EXISTS test
增加表分區(qū):hive> ALTER TABLE test ADD PARTITION(x=x1,y=y2) LOCATION '/USER/TEST/X1/Y1'
刪除表分區(qū):hive> ALTER TABLE test DROP PARTITION(x=x1,y=y2)
更多關(guān)于HQL詳細(xì)語法可參考Hive官方使用手冊(cè)說明:https://cwiki.apache.org/confluence/display/Hive/LanguageManual
53. 【hive大表關(guān)聯(lián)查詢數(shù)據(jù)傾斜解決方案】
傾斜原因:
map輸出數(shù)據(jù)按key Hash的分配到reduce中,由于key分布不均勻、業(yè)務(wù)數(shù)據(jù)本身的特性、建表時(shí)考慮不周、以及SQL語句編寫不當(dāng)?shù)仍蛟斐傻膔educe 上的數(shù)據(jù)量差異過大。
解決方案
- 參數(shù)調(diào)節(jié):
hive.map.aggr = true
hive.groupby.skewindata=true
有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡,當(dāng)選項(xiàng)設(shè)定位true,生成的查詢計(jì)劃會(huì)有兩個(gè)MR Job。第一個(gè)MR Job中,Map的輸出結(jié)果集合會(huì)隨機(jī)分布到Reduce中,每個(gè)Reduce做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的Group By Key有可能被分發(fā)到不同的Reduce中,從而達(dá)到負(fù)載均衡的目的;第二個(gè)MR Job再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照Group By Key 分布到 Reduce 中(這個(gè)過程可以保證相同的 Group By Key 被分布到同一個(gè)Reduce中),最后完成最終的聚合操作。 - SQL 語句調(diào)節(jié):
1)、選用join key分布最均勻的表作為驅(qū)動(dòng)表。做好列裁剪和filter操作,以達(dá)到兩表做join 的時(shí)候,數(shù)據(jù)量相對(duì)變小的效果。
2)、大小表Join:
使用map join讓小的維度表(1000 條以下的記錄條數(shù))先進(jìn)內(nèi)存。在map端完成reduce.
4)、大表Join大表:
把空值的key變成一個(gè)字符串加上隨機(jī)數(shù),把傾斜的數(shù)據(jù)分到不同的reduce上,由于null 值關(guān)聯(lián)不上,處理后并不影響最終結(jié)果。
5)、count distinct大量相同特殊值:
采用sum() group by的方式來替換count(distinct)完成計(jì)算。
【數(shù)據(jù)庫事務(wù)四要素】
原子性(Atomicity):一個(gè)事務(wù)要么全部執(zhí)行,要么全部不執(zhí)行。一個(gè)事務(wù)不可能只執(zhí)行了一半就停止了。比如一個(gè)事情分為兩步完成才可以完成,那么這兩步必須同時(shí)完成,要么一步也不執(zhí)行,絕不會(huì)停留在某一個(gè)中間狀態(tài)。如果事物執(zhí)行過程中,發(fā)生錯(cuò)誤,系統(tǒng)會(huì)將事物的狀態(tài)回滾到最開始的狀態(tài)。
一致性(Consistency):事務(wù)的運(yùn)行并不改變數(shù)據(jù)庫中數(shù)據(jù)的一致性。無論并發(fā)事務(wù)有多少個(gè),必須保證數(shù)據(jù)從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)。例如有 a、b 兩個(gè)賬戶,分別都是10。當(dāng)a增加5時(shí),b也會(huì)隨著改變,總值20是不會(huì)改變的。
隔離性(Isolation):指兩個(gè)以上的事務(wù)不會(huì)出現(xiàn)交錯(cuò)執(zhí)行(可能會(huì)導(dǎo)致數(shù)據(jù)不一致)的狀態(tài)。如果有多個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請(qǐng)求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)。
持久性(Durability):事務(wù)執(zhí)行成功以后,該事務(wù)對(duì)數(shù)據(jù)庫所作的更改永久保存在數(shù)據(jù)庫中,不會(huì)無緣無故的回滾。
【行存儲(chǔ)和列存儲(chǔ)】
行式存儲(chǔ)把一行中的數(shù)據(jù)值串在一起存儲(chǔ)起來,然后再存儲(chǔ)下一行的數(shù)據(jù),以此類推。行存儲(chǔ)適合數(shù)據(jù)存儲(chǔ)寫入、更新較多的場景,比如OLTP。當(dāng)數(shù)據(jù)量很大時(shí),查詢性能遠(yuǎn)不及列存儲(chǔ)。像SQLserver,Oracle,mysql等傳統(tǒng)數(shù)據(jù)庫屬于行式數(shù)據(jù)庫范疇。列式存儲(chǔ)把一列中的數(shù)據(jù)值串在一起存儲(chǔ)起來,然后再存儲(chǔ)下一列的數(shù)據(jù),以此類推。列存儲(chǔ)不適合數(shù)據(jù)頻繁寫入、更新的場景,主要適合頻繁查詢的場景,大數(shù)據(jù)環(huán)境下優(yōu)勢更明顯,比如分布式實(shí)時(shí)查詢。由于查詢中的選擇規(guī)則是通過列來定義的,因此整個(gè)數(shù)據(jù)庫是自動(dòng)索引化的。按列存儲(chǔ)每個(gè)字段的數(shù)據(jù)聚集存儲(chǔ),在查詢只需要少數(shù)幾個(gè)字段的時(shí)候,能大大減少讀取的數(shù)據(jù)量,同字段的數(shù)據(jù)聚集存儲(chǔ),也容易為這種聚集存儲(chǔ)設(shè)計(jì)更好的壓縮、解壓算法,降低系統(tǒng)IO。Greenplum、Vertica、Hbase等屬于列式數(shù)據(jù)庫。
【HBase 簡介】
Apache HBase是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PC上搭建起大規(guī)模存儲(chǔ)集群。
HBase利用Hadoop HDFS作為其文件存儲(chǔ)系統(tǒng),基于行鍵、列鍵和時(shí)間戳建立索引,是一個(gè)可以隨機(jī)訪問存儲(chǔ)和檢索數(shù)據(jù)的"NoSQL" 數(shù)據(jù)庫。HBase不限制存儲(chǔ)的數(shù)據(jù)的種類,允許動(dòng)態(tài)的、靈活的數(shù)據(jù)模型,不用SQL語言,也不強(qiáng)調(diào)數(shù)據(jù)之間的關(guān)系。HBase被設(shè)計(jì)成在一個(gè)服務(wù)器集群上運(yùn)行,可以非常方便地橫向擴(kuò)展。
適用場景于場景:存在高并發(fā)讀寫、表結(jié)構(gòu)的列族經(jīng)常需要調(diào)整、存儲(chǔ)結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)據(jù)、高并發(fā)的key-value存儲(chǔ)、key隨機(jī)寫入,有序存儲(chǔ)、針對(duì)每個(gè)key對(duì)應(yīng)的值需要多版本保存。
【Hbase 特點(diǎn)】
1、海量存儲(chǔ)
Hbase適合存儲(chǔ)PB級(jí)別的海量數(shù)據(jù),在PB級(jí)別的數(shù)據(jù)以及采用廉價(jià)PC存儲(chǔ)的情況下,能在幾十到百毫秒內(nèi)返回?cái)?shù)據(jù)。
2、列式存儲(chǔ)
數(shù)據(jù)在表中是按某列的數(shù)據(jù)聚集存儲(chǔ),數(shù)據(jù)即索引,只訪問查詢涉及的列時(shí),可以大量降低系統(tǒng)的I/O
3、易擴(kuò)展
HBase底層基于HDFS,支持?jǐn)U展,并且可以隨時(shí)添加或者減少節(jié)點(diǎn)。
4、高可靠:基于zookeeper的協(xié)調(diào)服務(wù),能夠保證服務(wù)的高可用行。HBase使用WAL和replication機(jī)制,前者保證數(shù)據(jù)寫入時(shí)不會(huì)因?yàn)榧寒惓6鴮?dǎo)致寫入數(shù)據(jù)的丟失,后者保證集群出現(xiàn)嚴(yán)重問題時(shí),數(shù)據(jù)不會(huì)發(fā)生丟失和損壞。
5、稀疏存儲(chǔ)
傳統(tǒng)行數(shù)存儲(chǔ)的數(shù)據(jù)存在大量NULL的列,也需要占用存儲(chǔ)空間,造成存儲(chǔ)空間的浪費(fèi),在列族中HBase為空的列并不占用空間,因此表可以設(shè)計(jì)的很稀疏。
6、高性能
底層的LSM數(shù)據(jù)結(jié)構(gòu)、Region分區(qū)、RowKey有序排列、主鍵索引和緩存機(jī)制使得HBase支持高并發(fā)用戶數(shù)的高速讀寫訪問。
【Hbase 表邏輯結(jié)構(gòu)】
表(table):劃分?jǐn)?shù)據(jù)集合的概念,和傳統(tǒng)的db中的表的概念是一樣的。
行鍵(RowKey):一行數(shù)據(jù)的唯一標(biāo)示,要想操作(read/write)一條數(shù)據(jù),必須通過行鍵,任何字符串都可以作為行鍵。表中的行根據(jù)行鍵進(jìn)行排序存儲(chǔ)。
列族(columnFamily):簡單的認(rèn)為是一系列“列”的集合。列族是以單獨(dú)的文件進(jìn)行存儲(chǔ)。
列限定符(columnQualifier):列族中的數(shù)據(jù)定位通過列限定符,每個(gè)列族可以有一個(gè)或多個(gè)列成員(ColumnQualifier),列成員不需要在表定義時(shí)給出,新的列族成員可以隨后按需、動(dòng)態(tài)加入。
單元格(cell):由行鍵,列族:限定符,時(shí)間戳唯一決定,Cell中的數(shù)據(jù)是沒有類型的,全部以字節(jié)碼形式存貯,主要用來存儲(chǔ)數(shù)據(jù)。
時(shí)間戳(Timestamp):每個(gè)值都會(huì)有一個(gè)timestamp,作為該值特定版本的標(biāo)識(shí)符。默認(rèn)情況下,timestamp代表了當(dāng)數(shù)據(jù)被寫入的時(shí)間,但也可以在把數(shù)據(jù)放到cell時(shí)指定不同的timestamp。
【HBase 相關(guān)模塊】
HBaseMaster:用于協(xié)調(diào)多個(gè)RegionServer,偵測各個(gè)RegionServer之間的狀態(tài),并平衡RegionServer之間的負(fù)載。負(fù)責(zé)分配Region給RegionServer。HBase允許多個(gè)Master節(jié)點(diǎn)共存,但只有一個(gè)Master是提供服務(wù)的,其他的Master節(jié)點(diǎn)處于待命的狀態(tài)。當(dāng)正在工作的Master節(jié)點(diǎn)宕機(jī)時(shí),其他的Master則會(huì)接管HBase的集群。
RegionServer:一個(gè)RegionServer包括了多個(gè)Region。RegionServer的作用只是管理表格,以及實(shí)現(xiàn)讀寫操作。Client直接連接RegionServer獲取HBase中的數(shù)據(jù)。Region是真實(shí)存放HBase數(shù)據(jù)的地方,Region是HBase并行化的基本單元。如果當(dāng)一個(gè)表格很大,并由多個(gè)CF組成時(shí),那么表的數(shù)據(jù)將存放在多個(gè)Region,并且在每個(gè)Region中會(huì)關(guān)聯(lián)多個(gè)存儲(chǔ)的單元(Store)。
Zookeeper:作為HBaseMaster的HA解決方案。保證了至少有一個(gè)HBaseMaster處于運(yùn)行狀態(tài)。并且Zookeeper負(fù)責(zé)Region和RegionServer的注冊(cè)。
【HBase 使用建議】
首先一點(diǎn)必須謹(jǐn)記:HBase并不適合所有問題,其設(shè)計(jì)目標(biāo)并不是替代RDBMS,而是對(duì)RDBMS的一個(gè)重要補(bǔ)充,尤其是對(duì)大數(shù)據(jù)的場景。首先,要有足夠多數(shù)據(jù),如有上億或上千億行數(shù)據(jù),HBase才會(huì)是一個(gè)很好的備選。其次,需要確保業(yè)務(wù)上可以不依賴RDBMS的額外特性,例如,列數(shù)據(jù)類型,二級(jí)索引,SQL查詢語言等。再而,需要確保有足夠硬件規(guī)模。比如集群小于5個(gè)節(jié)點(diǎn)時(shí)并不能發(fā)揮出應(yīng)有的性能。一個(gè)HBase數(shù)據(jù)庫是否高效,很大程度會(huì)和Row-Key的設(shè)計(jì)有關(guān)。因此,如何設(shè)計(jì)Row-key是使用HBase時(shí)一個(gè)非常重要的話題。隨著數(shù)據(jù)訪問方式的不同,Row-Key的設(shè)計(jì)也會(huì)有所不同。概括起來宗旨只有一個(gè),那就是盡可能使數(shù)據(jù)均勻的分布在集群中。例如當(dāng)客戶端需要頻繁的寫一張表,隨機(jī)的RowKey會(huì)獲得更好的性能。當(dāng)客戶端需要頻繁的讀一張表,有序的RowKey則會(huì)獲得更好的性能。對(duì)于時(shí)間連續(xù)的數(shù)據(jù)(例如log),有序的RowKey會(huì)能方便查詢一段時(shí)間的數(shù)據(jù)(Scan操作)。
【HBase與RDBMS的對(duì)比】
HBase適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫。與傳統(tǒng)數(shù)據(jù)庫主要區(qū)別如下:
數(shù)據(jù)類型:HBase只有簡單的字符類型,所有的類型都是交由用戶自己處理,它只保存字符串。而關(guān)系數(shù)據(jù)庫有豐富的類型和存儲(chǔ)方式;
數(shù)據(jù)操作:HBase只有很簡單的插入、查詢、刪除、清空等操作,表和表之間是分離的,沒有復(fù)雜的表和表之間的關(guān)系,而傳統(tǒng)數(shù)據(jù)庫通常有各式各樣的函數(shù)和連接操作;
存儲(chǔ)模式:HBase基于列存儲(chǔ),每個(gè)列族由幾個(gè)文件保存,不同列族的文件是分離的。傳統(tǒng)的關(guān)系數(shù)據(jù)庫是基于表格結(jié)構(gòu)和行模式保存的;
可伸縮性: HBase能夠容易的增加或者減少硬件數(shù)量;
數(shù)據(jù)維護(hù):HBase更新操作時(shí),舊的版本仍然保留,實(shí)際上時(shí)插入了新數(shù)據(jù)。傳統(tǒng)關(guān)系數(shù)據(jù)庫是替換修改。
【HBase表的設(shè)計(jì)(RowKey的設(shè)計(jì))】
Rowkey的設(shè)計(jì)一般都是根據(jù)具體業(yè)務(wù)需求來的,總的來說,需要根據(jù)rowkey的字典序排列,唯一性特性設(shè)計(jì)出高效讀取和負(fù)載均衡的rowkey,以下是幾個(gè)大概的設(shè)計(jì)原則:
長度原則:越小越好,最長不能超過64kb,一般10-100個(gè)字節(jié);
個(gè)數(shù)原則:指列簇的個(gè)數(shù),盡量控制在2個(gè)以內(nèi);
散列原則:region是根據(jù)rowkey劃分的,那么rowkey的散列就可以使得數(shù)據(jù)的負(fù)載變得均衡,一般來說可以通過 :
加隨機(jī)前綴、加hash值、rowkey反轉(zhuǎn)等方法;
rowkey唯一原則:必須在設(shè)計(jì)上保證其唯一性,rowkey是按照字典順序排序存儲(chǔ)的,因此設(shè)計(jì)rowkey的時(shí)候,要充分利用這個(gè)排序的特點(diǎn),將經(jīng)常讀取的數(shù)據(jù)存儲(chǔ)到一塊,將最近可能會(huì)被訪問的數(shù)據(jù)放到一塊。 比如:
我們需要某個(gè)時(shí)間端的數(shù)據(jù)進(jìn)行分析,那么以timestamp-key的形式,我們很容易就可以查詢到連續(xù)的時(shí)間段的數(shù)據(jù)。
【Hbase表的設(shè)計(jì)(預(yù)分區(qū))】
默認(rèn)的hbase會(huì)有一個(gè)region,當(dāng)數(shù)據(jù)越來越大,那么這個(gè)region管理的數(shù)據(jù)越來越多,當(dāng)超過閾值就會(huì)發(fā)生split操作,而split操作會(huì)導(dǎo)致我們的hbase有一段不可用的時(shí)間,那么為了盡量規(guī)避這個(gè)問題,所以我們需要預(yù)分區(qū)。所謂預(yù)分區(qū)其實(shí)就是預(yù)先劃分好region,每個(gè)region都有一個(gè)startkey和一個(gè)endkey,這樣也就確定了這個(gè)region所管理的數(shù)據(jù)的范圍。劃分原則:首先需要對(duì)數(shù)據(jù)的分布和數(shù)據(jù)量的增長有一個(gè)預(yù)測,根據(jù)數(shù)據(jù)量確定分區(qū)數(shù),然后再對(duì)數(shù)據(jù)進(jìn)行合理的rowkey設(shè)計(jì),以一個(gè)簡單的例子來說明:
假設(shè)預(yù)測數(shù)據(jù)會(huì)有50G,那么劃分為5個(gè)分區(qū),分別是:[-∞ - 1),[1 - 2),[2 - 3),[3 - 4),[4 - +∞),
rowkey可以設(shè)計(jì)成 [0-5)的隨機(jī)數(shù) + key,這樣數(shù)據(jù)就會(huì)均勻的分布在預(yù)先設(shè)計(jì)好的分區(qū)上。