大數(shù)據(jù)平臺簡介_第1頁
大數(shù)據(jù)平臺簡介_第2頁
大數(shù)據(jù)平臺簡介_第3頁
大數(shù)據(jù)平臺簡介_第4頁
大數(shù)據(jù)平臺簡介_第5頁
已閱讀5頁,還剩205頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

大數(shù)據(jù)平臺簡介目錄Hadoop生態(tài)系統(tǒng)Hadoop主流廠商HDFSMapReduceHiveSparkHadoop生態(tài)系統(tǒng)Hadoop1.0V2.0Hadoop生態(tài)系統(tǒng)Ambari(安裝部署工具)Zookeeper(分布式協(xié)調(diào)服務(wù))HBase(分布式協(xié)數(shù)據(jù)庫)Oozie(作業(yè)流調(diào)度系統(tǒng))HDFS(分布式存儲系統(tǒng))YARN(分布式計算框架)MapReduce(離線計算)Tez(DAG計算)Spark(內(nèi)存計算)HivePigMahoutSqoop(數(shù)據(jù)庫TEL工具)Flume(日志收集)…………HDFS-HadoopDistributedFileSystemYarn-資源管理器MapReduce-分布式并行計算框架“你數(shù)一號書架,我數(shù)二號書架。我們?nèi)藬?shù)多,數(shù)書就更快。這就是map;最后我們到一起,把所有人的統(tǒng)計數(shù)加在一起,就是reduce?!盨park-新一代大數(shù)據(jù)處理計算引擎YoucanrunSparkusingitsstandaloneclustermode,onEC2,onHadoopYARN,oronApacheMesos.AccessdatainHDFS,Cassandra,HBase,Hive,Tachyon,andanyHadoopdatasource.HBase-NoSQL數(shù)據(jù)庫Hive-h(huán)adoop的數(shù)據(jù)倉庫Pig-大規(guī)模數(shù)據(jù)分析平臺Pig是一個基于Hadoop的大規(guī)模數(shù)據(jù)分析平臺,它提供的SQL-LIKE語言叫PigLatin,該語言的編譯器會把類SQL的數(shù)據(jù)分析請求轉(zhuǎn)換為一系列經(jīng)過優(yōu)化處理的MapReduce運算。Pig為復(fù)雜的海量數(shù)據(jù)并行計算提供了一個簡單的操作和編程接口。Apachepig是用來處理大規(guī)模數(shù)據(jù)的高級查詢語言,配合Hadoop使用,可以在處理海量數(shù)據(jù)時達(dá)到事半功倍的效果,比使用Java,C++等語言編寫大規(guī)模數(shù)據(jù)處理程序的難度要小N倍,實現(xiàn)同樣的效果的代碼量也小N倍。A=LOAD'a.txt'AS(col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double);B=GROUPABY(col2,col3,col4);C=FOREACHBGENERATEgroup,AVG(A.col5),AVG(A.col6);DUMPC; Mahout-機(jī)器學(xué)習(xí)算法庫Mahout是ApacheSoftwareFoundation(ASF)旗下的一個開源項目,提供一些可擴(kuò)展的機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。Mahout包含許多實現(xiàn),包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用ApacheHadoop庫,Mahout可以有效地擴(kuò)展到云中。Zookeeper-分布式協(xié)調(diào)服務(wù)Sqoop-Hadoop與關(guān)系數(shù)據(jù)庫間的數(shù)據(jù)同步工具Flume-分布式日志采集工具Amari-Hadoop集群安裝部署監(jiān)控工具Hadoop主流廠商大數(shù)據(jù)領(lǐng)域的三駕馬車ClouderaHortonworksMapRClouderaDistributionHadoop(CDH)HortonworksDataPlatform(HDP)MapRConvergedDataPlatformHadoop主流廠商比較開源開源管理開源管理架構(gòu)創(chuàng)新完全開源收取服務(wù)費工具不開源收取License費用重構(gòu)了底層內(nèi)核收取License費用云服務(wù)集團(tuán)軟件集團(tuán)浪潮大數(shù)據(jù)平臺產(chǎn)品HDP云海InsightHDIndataHDHDFS相關(guān)背景資料Hadoop:一個分布式系統(tǒng)基礎(chǔ)架構(gòu),由Apache基金會開發(fā)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力高速運算和存儲。Distributed:分布式計算是利用互聯(lián)網(wǎng)上的計算機(jī)的CPU的共同處理能力來解決大型計算問題的一種計算科學(xué)。Filesystem:文件系統(tǒng)是操作系統(tǒng)用于明確磁盤或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu);即在磁盤上組織文件的方法。也指用于存儲文件的磁盤或分區(qū),或文件系統(tǒng)種類。Hadoop和HDFS的關(guān)系Hadoop是一個以一種可靠、高效、可伸縮的方式進(jìn)行處理的,能夠?qū)Υ罅繑?shù)據(jù)進(jìn)行分布式處理的系統(tǒng)框架。HDFS是Hadoop兼容最好的標(biāo)準(zhǔn)級文件系統(tǒng),因為Hadoop是一個綜合性的文件系統(tǒng)抽象,所以HDFS不是Hadoop必需的。所以可以理解為hadoop是一個框架,HDFS是hadoop中的一個部件。HDFS背景介紹隨著數(shù)據(jù)量越來越大,

在一個操作系統(tǒng)管轄的范圍存不下了,

那么就

分配到更多的操作系統(tǒng)管理的磁盤中,

但是不方便管理和維護(hù),迫切需要一種系統(tǒng)來管理多臺機(jī)器上的文件,這就是分布式文件管理系統(tǒng)。分布式文件系統(tǒng):一種允許文件通過網(wǎng)絡(luò)在多臺主機(jī)上分享的文件系統(tǒng),可以讓多個機(jī)器上的多個用戶分享文件和存儲空間。集群通透性:DFS讓實際上是通過網(wǎng)絡(luò)來訪問文件的動作,由用戶和程序看來,就像訪問本地的磁盤一般。分布式文件系統(tǒng)特點RootsplitBlock···Block目錄1目錄2···File節(jié)點節(jié)點節(jié)點HDFS是什么HDFS是HadoopDistributeFileSystem的簡稱,也就是Hadoop的一個分布式文件系統(tǒng)。HDFS被設(shè)計成適合運行在通用硬件(commodityhardware)上的分布式文件系統(tǒng)。HDFS是一個高度容錯性的系統(tǒng),適合部署在廉價的機(jī)器上HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用HDFS可以實現(xiàn)流的形式訪問(streamingaccess)文件系統(tǒng)中的數(shù)據(jù)對外部客戶機(jī)而言,HDFS就像一個傳統(tǒng)的分級文件系統(tǒng)??梢詣?chuàng)建、刪除、移動或重命名文件,等等。對于用戶來說,可以直接看成是一個巨大的硬盤。HDFS特點GB、TB、甚至PB級數(shù)據(jù);百萬規(guī)模以上的文件數(shù)量;10K+節(jié)點規(guī)模適合大數(shù)據(jù)處理

HDFS使應(yīng)用程序流式地訪問它們的數(shù)據(jù)集。所以它重

視數(shù)據(jù)吞吐量,而不是數(shù)據(jù)訪問的反應(yīng)速度。流式文件訪問

HDFS被設(shè)計成適合進(jìn)行批量處理,而不是用戶交互式

處理;移動計算而非數(shù)據(jù);數(shù)據(jù)位置暴露給計算框架適合批處理通過多副本提高可靠性;提供了容錯和恢復(fù)機(jī)制可構(gòu)建廉價機(jī)器上數(shù)據(jù)自動保存多個副本;副本丟失后,自動恢復(fù)高容錯性一次性寫入,多次讀??;保證數(shù)據(jù)一致性簡化一致性模型

HDFS在設(shè)計的時候就考慮到平臺的可移植性。這種特

性方便了HDFS作為大規(guī)模數(shù)據(jù)應(yīng)用平臺的推廣可移植性HDFS的局限性

不支持多用戶對同一文件進(jìn)行操作,而且寫操作只

能在文件末尾完成,即追加操作。并發(fā)寫入、文件隨機(jī)修改由于HDFS是為高數(shù)據(jù)吞吐量應(yīng)用而設(shè)計的,必然

以高延遲為代價。不適合低延遲與高吞吐率的數(shù)據(jù)

訪問,比如毫秒級不適合低延遲數(shù)據(jù)訪問

HDFS中元數(shù)據(jù)(文件的基本信息)存儲在namenode的內(nèi)存中,而namenode為單點,小文

件數(shù)量大到一定程度,namenode內(nèi)存就吃不消了

;尋道時間超過讀取時間無法高效存儲大量小文件HDFS現(xiàn)在遇到的主要問題分布后的文件系統(tǒng)有個無法回避的問題,因為文件不在一個磁盤導(dǎo)致讀取訪問操作的延時,這個是HDFS現(xiàn)在遇到的主要問題HDFS調(diào)優(yōu)是使用時最應(yīng)該注意的?,F(xiàn)階段,HDFS的配置是按照高數(shù)據(jù)吞吐量優(yōu)化的,可能會以高時間延時為代價。但萬幸的是,HDFS是具有很高彈性,可以針對具體應(yīng)用再優(yōu)化??傮w架構(gòu)圖HDFS采用master/slave架構(gòu)。一個HDFS集群是由一個Namenode和一定數(shù)目的Datanode組成,他們以管理者-工作者模式工作??傮w架構(gòu)圖-Client切分文件;訪問或通過命令行管理HDFS;與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數(shù)據(jù)。HDFS的基本結(jié)構(gòu)之

NameNodeNamenode是一個中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的命名空間協(xié)調(diào)客戶端對文件的訪問Namenode執(zhí)行文件系統(tǒng)的命名空間操作,例如打開、關(guān)閉、重命名文件和目錄記錄每個文件數(shù)據(jù)塊在各個Datanode上的位置和副本信息HDFS元數(shù)據(jù)持久化NameNode存有HDFS的元數(shù)據(jù):主要由FSImage和EditLog組成。FSImage是元數(shù)據(jù)鏡像文件保存整個文件系統(tǒng)的目錄樹數(shù)據(jù)塊映射關(guān)系:文件與數(shù)據(jù)塊映射關(guān)系,DataNode與數(shù)據(jù)塊映射關(guān)系EditLog是元數(shù)據(jù)操作日志,記錄每次保存fsimage之后到下次保存之間的所有hdfs操作NameNodeFileSystemImageEditLog命名空間操作記錄,如打開、關(guān)閉、創(chuàng)建、刪除、重命名文件和目錄HDFS元數(shù)據(jù)持久化checkpoint:NameNode啟動后,它會從磁盤中讀取FsImage及EditLog,應(yīng)用EditLog中所有的事務(wù)到存在于內(nèi)存中的FsImage文件對象,然后將版本較新的這個FsImage文件寫入磁盤,之后EditLog就可以被刪除了。一個checkpoint只發(fā)生在NameNode啟動的時候。Blockreport:當(dāng)一個DataNode啟動時,它會掃描本地文件系統(tǒng),生成所有HDFS數(shù)據(jù)塊的一個列表,然后向NameNode發(fā)送一個報告。HDFS的基本結(jié)構(gòu)之

DataNodeDatanode一般是一個節(jié)點一個,負(fù)責(zé)所在物理節(jié)點的存儲管理,是文件系統(tǒng)中真正存儲數(shù)據(jù)的地方一個文件被分成一個或多個數(shù)據(jù)塊,這些塊存儲在一組Datanode上Datanode負(fù)責(zé)處理文件系統(tǒng)客戶端的讀寫請求。在Namenode的指揮下進(jìn)行block的創(chuàng)建、刪除和復(fù)制周期性的向Namenode匯報其存儲的數(shù)據(jù)塊信息數(shù)據(jù)組織數(shù)據(jù)塊(block):大文件會被分割成多個block進(jìn)行存儲,block大小默認(rèn)為128MB。比磁盤塊大很多,目的是減少尋址開銷。并不是設(shè)置塊越大越好。每一個block會在多個datanode上存儲多份副本,默認(rèn)是3份。與其他文件系統(tǒng)不一樣,HDFS中每個小于塊大小的文件不會占據(jù)整個塊的空間。HDFS128

MB128

MB128

MB128

MB數(shù)據(jù)復(fù)制大文件在集群中跨機(jī)器存儲每個文件存儲成一系列的數(shù)據(jù)塊,除了最后一個,所有的數(shù)據(jù)塊都是同樣大小的為了容錯,文件的所有數(shù)據(jù)塊都會有副本。每個文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個Datanode接收心跳信號和塊狀態(tài)報告副本策略HDFS采用機(jī)架感知(rackawareness)的副本存放策略來提高數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。將第一個副本放在本地節(jié)點,將第二個副本放到本地機(jī)架上的另外一個節(jié)點,而將第三個副本放到不同機(jī)架上的節(jié)點。文件的副本不是均勻地分布在機(jī)架當(dāng)中,這種方式提高了寫的性能,并且不影響數(shù)據(jù)的可靠性和讀性能(選擇讀取最近的副本)Node大數(shù)據(jù)集群Rack1Rack2DataNodeDataNodeHDFS穩(wěn)健性故障的類型:NameNode故障,DataNode故障和網(wǎng)絡(luò)中斷數(shù)據(jù)磁盤故障,心跳及重新復(fù)制DataNode因為故障而不可用拷貝過程失敗DataNode上的磁盤壞掉副本數(shù)量會被增加NameNode啟動block重新復(fù)制:NameNodeDataNodeDeadDataNodeDataNodeHeartBeatsHDFS穩(wěn)健性數(shù)據(jù)完整性HDFS客戶端應(yīng)用實現(xiàn)了對文件內(nèi)容的校驗和。HDFS寫入的時候計算出校驗和,然后每次讀的時候再計算校驗和。元數(shù)據(jù)磁盤故障NameNode在HDFS集群中屬于單點故障。沒有namenode,文件系統(tǒng)會崩潰,文件系統(tǒng)上的所有文件將丟失(無法讀出,因為無法定位元數(shù)據(jù)塊的位置)HA高可用架構(gòu):NameNode熱備HA架構(gòu)解決的問題NameNode單點故障HDFS只有一個NameNode節(jié)點,當(dāng)NameNode崩潰后,整個HDFS集群隨之崩潰,直到Namenode重啟或者其他Namenode接入HDFSHA:為了解決NameNode的單點故障,為NameNode保存一個熱備,兩個獨立的機(jī)器作為NameNode:ActiveNamenode、StandbyNamenode。任何時刻,只有一個Namenode處于Active狀態(tài),另一個處于standby狀態(tài)(passive,備份);ActiveNamenode用于接收Client端請求,Standy節(jié)點作為slave保持集群的狀態(tài)數(shù)據(jù)以備快速failover.HA架構(gòu)圖寫入讀出DataNodeDataNodeDataNode....NameNodeactiveNameNodestandbyQJM/NFSZookeeperFCZookeeperFC監(jiān)控NN狀態(tài)管理HA狀態(tài)監(jiān)控NN狀態(tài)管理HA狀態(tài)ZookeeperHeartbeatHeartbeatHA架構(gòu)-快速failoverDatanodes上需要同時配置這兩個Namenode的地址,同時和它們都建立心跳鏈接,并把block位置發(fā)送給它們,這樣Standbynode持有集群中blocks的最新位置當(dāng)ActiveNN失效時,StandbyNN切換成ActiveNNNameNodeactiveDataNodeDataNodeDataNodeDataNodeNameNodestandbyHeartBeats共享數(shù)據(jù)兩種HA方案對比QJMvsNFS共同點都是熱備方案都是一個activeNamenode(NN)和一個standbyNN使用Zookeeper(ZK)

quorum和ZKFC來實現(xiàn)自動失效恢復(fù)。在失效恢復(fù)時都需要配置fencing方法來fenceactiveNN二者共享數(shù)據(jù)方式不同參與HA的不同角色HDFSwithNFSHDFSwithQJMNamenodeNamenodeHANFS(共享數(shù)據(jù)變更存儲)JournalNodeZookeeperZookeeperZKFailoverControllerprocessZKFailoverControllerprocessHA方案-NFS實現(xiàn)機(jī)制activeNN和standbyNN需要共享一個存儲目錄。activeNN會把數(shù)據(jù)變更日志保存在該目錄內(nèi),standbyNN則監(jiān)視更新,并保持?jǐn)?shù)據(jù)同步。為了快速切換NN,DataNode(DN)需要知道兩個NN的地址,并把塊信息和心跳包發(fā)送給active和standby這兩個NN。此外,為了保證activeNN掛了以后不再有新數(shù)據(jù)寫入,F(xiàn)encing邏輯在確認(rèn)activeNN掛了以后會切斷所有與原activeNN的連接。HAwithNFS局限性目前只支持一個數(shù)據(jù)變更共享目錄,導(dǎo)致HA能力受限于該目錄為了防止共享目錄的單點失效,對共享目錄有額外的要求,比如冗余的硬盤、網(wǎng)絡(luò)和電源等。NFS共享目錄所在的設(shè)備要求是高可靠性。NFS方式部署更為復(fù)雜。HA方案-QJMStandbyNode與ActiveNode保持同步這兩個Node都與一組稱為JNS的互相獨立的進(jìn)程保持通信(JournalNodes)。當(dāng)ActiveNode上更新了namespace,它將記錄修改日志發(fā)送給JNS的多數(shù)派。Standbynoes將會從JNS中讀取這些edits,并持續(xù)關(guān)注它們對日志的變更。StandbyNode將日志變更應(yīng)用在自己的namespace中,即在failover發(fā)生之前,Standy持有namespace應(yīng)該與Active保持完全同步。JournalNodeJournalNodeJournalNodeJournalNodeNameNodeactiveNameNodestandby向JournalNodes寫數(shù)據(jù)從JournalNodes讀數(shù)據(jù)HA方案-QJM硬件資源

Namenode機(jī)器:兩臺配置對等的機(jī)器,它們分別運行Active和StandbyNodeJouralNode機(jī)器:運行JouralNodes的機(jī)器。JouralNode守護(hù)進(jìn)程相當(dāng)?shù)妮p量級,它們可以和hadoop的其他進(jìn)程部署在一起,比如Namenodes、jobTracker、ResourceManager等。不過為了形成多數(shù)派(majority),至少需要3個JouralNodes,因為edits操作必須在多數(shù)派上寫入成功。當(dāng)然JNS的個數(shù)可以>3,且通常為奇數(shù)(3,5,7),這樣可以更好的容錯和形成多數(shù)派。如果你運行了N個JNS,那么它可以允許(N-1)/2個JNS進(jìn)程失效并且不影響工作。HDFS可訪問性HDFS支持以文件和目錄的形式組織用戶數(shù)據(jù)。它提供了一個命令行接口(FSShell)讓用戶與HDFS中的數(shù)據(jù)進(jìn)行交互通過原生的

FileSystemJavaAPI接口來訪問瀏覽器的方式訪問HDFS中的實例文件http://nn_host:port/默認(rèn)的http端口是50070讀文件ClientJVMDataNodeDataNodeDataNodeNameNodeHDFSClientDistributedFileSystemFSDataInputStream1:open2:獲取文件數(shù)據(jù)塊所在的DataNode節(jié)點位置3:read7:complete6:close4:read5:read寫文件ClientJVMDataNodeDataNodeDataNodeNameNodeHDFSClientDistributedFileSystemFSDataInputStream1:creat3:write7:complete6:close5:ackpacket2:creat4:writepacket4545回收存儲空間文件的刪除與恢復(fù)HDFS會為每一個用戶創(chuàng)建一個回收站目錄:/user/用戶名/.Trash/,每一個被用戶通過Shell刪除的文件/目錄,它會先被重命名到目錄/trash下的一個文件.只要被刪除的文件還在/trash目錄中,用戶就可以還原它。目前默認(rèn)策略是刪除/trash中保留時間超過6小時的文件該功能只限于用戶在客戶端的腳本操作,當(dāng)用戶寫程序調(diào)用HDFS的API時,NameNode并不會把刪除的文件或目錄放入回收站Trash中減少副本系數(shù)當(dāng)副本系數(shù)被降低時,NameNode會選擇刪除多余的副本HDFS常用shellHDFS支持以文件和目錄的形式組織用戶數(shù)據(jù)。它在客戶端提供了一個命令行接口(FSShell)讓用戶與HDFS中的數(shù)據(jù)進(jìn)行交互調(diào)用文件系統(tǒng)(FS)Shell命令應(yīng)使用

bin/hadoopfs<args>的形式。

所有的的FSshell命令使用URI路徑作為參數(shù)。URI格式是scheme://authority/path。對HDFS文件系統(tǒng),scheme是hdfs。其中scheme和authority參數(shù)都是可選的,如果未加指定,就會使用配置中指定的默認(rèn)scheme。一個HDFS文件或目錄比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更簡單的/parent/childls使用方法:hadoopfs-ls<args>查看目錄下文件lsr使用方法:hadoopfs-lsr<args>遞歸查看文件mkdir使用方法:hadoopfs-mkdir[-p]<paths>創(chuàng)建目錄,-p參數(shù)是創(chuàng)建各級父目錄touchz使用方法:hadoopfs-touchzURI[URI…]創(chuàng)建一個0字節(jié)的空文件。HDFS常用shellHDFS常用shellput使用方法:hadoopfs-put<localsrc>...<dst>上傳一個或多個本地文件到文件系統(tǒng)。如果HDFS中已經(jīng)存在該文件,那么直接上傳會報錯。如果第二個路徑是個文件夾,那么會上傳到文件夾中,如果文件不存在,那么會生成一個文件而非新建一個文件夾。copyFromLocal使用方法:hadoopfs-copyFromLocal<localsrc>URI上傳一個或多個本地文件到文件系統(tǒng)。命令類似-putget使用方法:hadoopfs-get<src><localdst>下載文件到本地文件系統(tǒng)。copyToLocal使用方法:hadoopfs-copyToLocal

URI<localdst>下載文件到本地文件系統(tǒng)。命令類似-getHDFS常用shellappendToFile使用方法:hadoopfs-appendToFile<localsrc>...<dst>將本地文件追加到hdfs文件末尾mv使用方法:hadoopfs-mvURI[URI…]<dest>將文件從源路徑移動到目標(biāo)路徑。這個命令允許有多個源路徑,此時目標(biāo)路徑必須是一個目錄。不允許在不同的文件系統(tǒng)間移動文件。text使用方法:hadoopfs-text<src>將源文件輸出為文本格式cat使用方法:hadoopfs-catURI[URI…]將路徑指定文件的內(nèi)容輸出到stdoutHDFS常用shellrm使用方法:hadoopfs-rmURI[URI…]刪除文件rmdir使用方法:hadoopfs-rmdirURI[URI...]刪除空白文件夾rmr(不建議使用)使用方法:hadoopfs-rmrURI[URI...]遞歸刪除。建議使用rm–r替代該命令cp使用方法:hadoopfs-cpURI[URI...]<dest>將文件從源路徑復(fù)制到目標(biāo)路徑。這個命令允許有多個源路徑,此時目標(biāo)路徑必須是一個目錄。HDFS常用shellchmod使用方法:hadoopfs-chmod[-R]URI[URI…]改變文件的權(quán)限。使用-R將使改變在目錄結(jié)構(gòu)下遞歸進(jìn)行。命令的使用者必須是文件的所有者或者超級用戶。chown使用方法:hadoopfs-chown[-R][OWNER][:[GROUP]]URI[URI]改變文件的擁有者。使用-R將使改變在目錄結(jié)構(gòu)下遞歸進(jìn)行。命令的使用者必須是超級用戶。chgrp使用方法:hadoopfs-chgrp[-R]GROUPURI[URI…]改變文件所屬的組。使用-R將使改變在目錄結(jié)構(gòu)下遞歸進(jìn)行。命令的使用者必須是文件的所有者或者超級用戶。HDFS常用shellexpunge使用方法:hadoopfs-expunge清空回收站setrep使用方法:hadoopfs-setrep[-R]<numReplicas><path>改變一個文件的副本系數(shù)。-R選項用于遞歸改變目錄下所有文件的副本系數(shù)。其他命令,通過hadoopfs-help可以獲取所有的命令的詳細(xì)幫助文件hdfsfsck命令HDFS支持fsck命令用以檢查各種不一致。fsck用以報告各種文件問題,如block丟失或缺少block等。查看文件的塊的組成等信息。使用方法:hdfsfsck<path>-files-blocks-locationsMapReduce來源2004.10-Google發(fā)布了最初的MapReduce論文《MapReduce:大型集群中簡化的數(shù)據(jù)處理》MapReduce是什么MapReduce是一個編程模型,也是一個處理和生成超大數(shù)據(jù)集的算法模型的相關(guān)實現(xiàn)(計算框架),用于簡化分布式集群下的大數(shù)據(jù)計算。MapReduce計算框架這個框架在運行時只關(guān)心:如何分割輸入數(shù)據(jù)在大量計算機(jī)組成的集群上的調(diào)度集群中計算機(jī)的錯誤處理管理集群中計算機(jī)之間必要的通信。采用MapReduce架構(gòu)可以使那些沒有并行計算和分布式處理系統(tǒng)開發(fā)經(jīng)驗的程序員有效利用分布式系統(tǒng)的豐富資源。MapReduce編程模型編程模型:用戶首先創(chuàng)建一個Map函數(shù)處理一個基于key/valuepair的數(shù)據(jù)集合,輸出中間的基于key/valuepair的數(shù)據(jù)集合;然后,再創(chuàng)建一個Reduce函數(shù)用來合并所有的具有相同中間key值的中間value值。MapReduce-紙牌游戲MapReduce方法則是:給在座的所有玩家中分配這摞牌讓每個玩家數(shù)自己手中的牌有幾張是黑桃,然后把這個數(shù)目匯報給你你把所有玩家告訴你的數(shù)字加起來,得到最后的結(jié)論你想數(shù)出一摞牌中有多少張黑桃。直觀方式是一張一張檢查并且數(shù)出有多少張是黑桃?MapReduce合并了兩種經(jīng)典函數(shù):映射(Mapping)對集合里的每個目標(biāo)應(yīng)用同一個操作。即:分開計算,輸出各自結(jié)果?;啠≧educing)遍歷集合中的元素來返回一個綜合的結(jié)果。即:合并分開計算的各個結(jié)果,得到最終結(jié)果。MapReduce-基本思想如何對付大數(shù)據(jù)處理:分而治之對相互間不具有計算依賴關(guān)系的大數(shù)據(jù),實現(xiàn)并行最自然的辦法就是采取分而治之的策略MapReduce-基本思想上升到抽象模型:Mapper與ReducerMapReduce借鑒了Lisp函數(shù)式語言中的思想,用Map和Reduce兩個函數(shù)提供了高層的并行編程抽象模型上升到構(gòu)架:統(tǒng)一計算框架,為程序員隱藏系統(tǒng)層細(xì)節(jié)為MapReduce設(shè)計并提供了統(tǒng)一的計算框架,為程序員隱藏了絕大多數(shù)系統(tǒng)層面的處理細(xì)節(jié)(存儲、劃分、分發(fā)、結(jié)果收集、錯誤恢復(fù))MapReduce-工作原理MapReduce-工作原理整個系統(tǒng)主要有三部分構(gòu)成:userprogram(客戶端)、master(主控程序)、worker(工作單元,部署在各個數(shù)據(jù)/計算節(jié)點上)客戶端(userprogram)與master通信,提交mapreduce程序到master,Master監(jiān)控集群中的空閑資源(每個worker向其匯報),收到客戶端請求后,為該mapreduce程序分配多個map任務(wù)和reduce任務(wù)

一個被分配了map任務(wù)的worker讀取相關(guān)輸入文件分片的內(nèi)容。它從輸入數(shù)據(jù)中分析出key/value對,然后把key/value對傳遞給用戶自定義的map函數(shù)。由map函數(shù)產(chǎn)生的中間key/value對被緩存在內(nèi)存中,緩存在內(nèi)存中的key/value對被周期性的寫入到本地磁盤上。reduceworker使用遠(yuǎn)程調(diào)用來從mapworker的磁盤上讀取緩存的數(shù)據(jù),然后通過排序使具有相同key的內(nèi)容聚合在一起,它把key和聚合得value集傳遞給用戶自定義的reduce函數(shù)。reduce函數(shù)的輸出被添加到這個reduce分割的最終的輸出文件中。當(dāng)所有的map和reduce任務(wù)都完成了,管理者喚醒用戶程序。在這個時候,在用戶程序里的MapReduce調(diào)用返回到用戶代碼。MapReduce-適用場景MapReduce主要面向?qū)Υ笠?guī)模數(shù)據(jù)的處理,適用于離線批處理場景由于每次操作需要遍歷所有數(shù)據(jù),MapReduce并不適用于需要實時響應(yīng)的系統(tǒng)。MapReduce程序-wordcountwordcount概述輸入:執(zhí)行程序:輸出:$bin/hadoopfs-cat/user/joe/wordcount/input/file01HelloWorldByeWorld$bin/hadoopfs-cat/user/joe/wordcount/input/file02HelloHadoopGoodbyeHadoop$bin/hadoopjarwc.jarWordCount/user/joe/wordcount/input/user/joe/wordcount/output$bin/hadoopfs-cat/user/joe/wordcount/output/part-r-00000`Bye1Goodbye1Hadoop2Hello2World2`MapReduce工作過程Input->Mapper1、讀取輸入文件,并分片2、按block分片,每片一個map。

Wordcount輸入文件是2個小文件,默認(rèn)block大小為64M或128M,所以每個文件就一片,兩個文件共2片,2個map任務(wù)。3、每個map讀取對應(yīng)分片的文件內(nèi)容,按行提取文件內(nèi)容,轉(zhuǎn)換成(key,value)。key是數(shù)據(jù)分片中字節(jié)偏移量,value值是行內(nèi)容FileInputFormat.addInputPath(job,newPath(args[0]));publicvoidmap(Objectkey,Textvalue,Contextcontext)Mapper階段<Hello,1><World,1><Bye,1><World,1><Hello,1><Hadoop,1><Goodbye,1><Hadoop,1>Map-1:Map-2:job.setMapperClass(TokenizerMapper.class);publicvoidmap(Objectkey,Textvalue,Contextcontext)throwsIOException,InterruptedException{StringTokenizeritr=newStringTokenizer(value.toString());while(itr.hasMoreTokens()){word.set(itr.nextToken());context.write(word,one);}}Combine階段Map-1:Map-2:<Bye,1><Hello,1><World,2><Goodbye,1><Hadoop,2><Hello,1>publicvoidreduce(Textkey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{intsum=0;for(IntWritableval:values){sum+=val.get();}result.set(sum);context.write(key,result);}job.setCombinerClass(IntSumReducer.class);Reducer階段publicvoidreduce(Textkey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{intsum=0;for(IntWritableval:values){sum+=val.get();}result.set(sum);context.write(key,result);}<Bye,1><Goodbye,1><Hadoop,2><Hello,2><World,2>`job.setReducerClass(IntSumReducer.class);HadoopMapReduce工作過程YarnHadoopMapReduceV1架構(gòu)HadoopMapReduceV1組成1)Client客戶端程序,與JobTracker通信,提交mapredce程序包2)JobTrackerJobTracke相當(dāng)于GoogleMapReduce中的master,負(fù)責(zé)統(tǒng)一的資源監(jiān)控和作業(yè)調(diào)度。3)TaskTrackerTaskTracker相當(dāng)于GoogleMapReduce中的worker,部署在各個數(shù)據(jù)/計算節(jié)點上,向JobTracker發(fā)送本節(jié)點的資源情況,接收J(rèn)obTracker的作業(yè)調(diào)度指令,創(chuàng)建任務(wù)或殺死任務(wù)4)TaskTask分為MapTask和ReduceTask兩種,均由TaskTracker啟動。HadoopMapReduceV1問題JobTracker是Map-reduce的集中處理點,存在單點故障。JobTracker完成了太多的任務(wù),造成了過多的資源消耗,當(dāng)map-reducejob非常多的時候,會造成很大的內(nèi)存開銷,增加了JobTrackerfail的風(fēng)險。在TaskTracker端,以map/reducetask的數(shù)目作為資源的表示過于簡單,沒有考慮到cpu/內(nèi)存的占用情況,如果兩個大內(nèi)存消耗的task被調(diào)度到了一塊,很容易出現(xiàn)OOM。在TaskTracker端,把資源強(qiáng)制劃分為maptaskslot和reducetaskslot,如果當(dāng)系統(tǒng)中只有maptask或者只有reducetask的時候,會造成資源的浪費。源代碼層面分析的時候,會發(fā)現(xiàn)代碼非常的難讀,常常因為一個class做了太多的事情,代碼量達(dá)3000多行,造成class的任務(wù)不清晰,增加bug修復(fù)和版本維護(hù)的難度。Yarn架構(gòu)原理Yarn架構(gòu)原理Yarn框架有兩類進(jìn)程構(gòu)成:ResourceManager:負(fù)責(zé)全局資源的管理和調(diào)度分配NodeManager:是每臺機(jī)器資源管理的代理端,負(fù)責(zé)本機(jī)資源使用的監(jiān)控以及為yarn應(yīng)用分配運行容器(Container)和創(chuàng)建任務(wù)Container是YARN中資源的抽象,它封裝了某個節(jié)點上一定量的資源(CPU和內(nèi)存兩類資源)。每個map或reduce任務(wù)需要擁有一定的Container資源以運行。Yarn架構(gòu)原理ResourceManager有兩種主要組件:SchedulerandApplicationsManager.Scheduler:負(fù)責(zé)純資源調(diào)度,為各個應(yīng)用分配資源。資源調(diào)度策略包括CapacityScheduler、FaireScheduler等。ApplicationsManager:負(fù)責(zé)接收應(yīng)用程序提交請求(通過yarnjar或hadoopjar執(zhí)行程序),創(chuàng)建應(yīng)用對應(yīng)的ApplicationMaster以及當(dāng)ApplicationMaster失敗時對其重啟。AppMstr:ApplicationMaster,每個應(yīng)用(如提交一個WordCount程序,就是個應(yīng)用)運行時,ResourceManager都要為該應(yīng)用先分配container,運行該ApplicationMaster。ApplicationMaster負(fù)責(zé)與ResourceManager通信,申請該應(yīng)用實際運行時所需的容器資源,申請到資源后,負(fù)責(zé)與資源所在的各NodeManager通信,要求它在申請到的資源(container)中啟動任務(wù)。Yarn工作流程Yarn工作流程步驟1用戶向YARN中提交應(yīng)用程序,其中包括ApplicationMaster程序、啟動ApplicationMaster的命令、用戶程序等。步驟2

ResourceManager為該應(yīng)用程序分配第一個Container,并與對應(yīng)的Node-Manager通信,要求它在這個Container中啟動應(yīng)用程序的ApplicationMaster。步驟3

ApplicationMaster首先向ResourceManager注冊,這樣用戶可以直接通過ResourceManage查看應(yīng)用程序的運行狀態(tài),然后它將為各個任務(wù)申請資源,并監(jiān)控它的運行狀態(tài),直到運行結(jié)束,即重復(fù)步驟4~7。步驟4

ApplicationMaster采用輪詢的方式通過RPC協(xié)議向ResourceManager申請和領(lǐng)取資源。步驟5一旦ApplicationMaster申請到資源后,便與對應(yīng)的NodeManager通信,要求它啟動任務(wù)。步驟6

NodeManager為任務(wù)設(shè)置好運行環(huán)境(包括環(huán)境變量、JAR包、二進(jìn)制程序等)后,將任務(wù)啟動命令寫到一個腳本中,并通過運行該腳本啟動任務(wù)。步驟7各個任務(wù)通過某個RPC協(xié)議向ApplicationMaster匯報自己的狀態(tài)和進(jìn)度,以讓ApplicationMaster隨時掌握各個任務(wù)的運行狀態(tài),從而可以在任務(wù)失敗時重新啟動任務(wù)。在應(yīng)用程序運行過程中,用戶可隨時通過RPC向ApplicationMaster查詢應(yīng)用程序的當(dāng)前運行狀態(tài)。步驟8應(yīng)用程序運行完成后,ApplicationMaster向ResourceManager注銷并關(guān)閉自己。

HiveHive簡介-Hive是什么?Hive是構(gòu)建在Hadoop之上的數(shù)據(jù)倉庫平臺Hive是一個SQL解析引擎,它將SQL語句轉(zhuǎn)譯成MapReduce作業(yè)并在Hadoop上執(zhí)行。Hive表是HDFS的一個文件目錄,一個表名對應(yīng)一個目錄名,如果有分區(qū)表的話,則分區(qū)值對應(yīng)子目錄名。Hive簡介-Hive的歷史由來Hive是Facebook開發(fā)的,構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉庫應(yīng)用。2008年Facebook將Hive項目貢獻(xiàn)給Apache,成為開源項目。Hive簡介-Hive的歷史由來Hadoop和Hive組建成為Facebook數(shù)據(jù)倉庫的發(fā)展史隨著數(shù)據(jù)量增加某些查詢需要幾個小時甚至幾天才能完成。當(dāng)數(shù)據(jù)達(dá)到1T時,MySql進(jìn)程跨掉??梢灾螏讉€T的數(shù)據(jù),但每天收集用戶點擊流數(shù)據(jù)(每天約400G)時,Oracle開始撐不住。有效解決了大規(guī)模數(shù)據(jù)的存儲與統(tǒng)計分析的問題,但是MapReduce程序?qū)τ谄胀ǚ治鋈藛T的使用過于復(fù)雜和繁瑣。對外提供了類似于SQL語法的HQL語句數(shù)據(jù)接口,自動將HQL語句編譯轉(zhuǎn)化為MR作業(yè)后在Hadoop上執(zhí)行。降低了分析人員使用Hadoop進(jìn)行數(shù)據(jù)分析的難度。Hive體系結(jié)構(gòu)-Hive設(shè)計特征

Hive做為Hadoop的數(shù)據(jù)倉庫處理工具,它所有的數(shù)據(jù)都存儲在Hadoop兼容的文件系統(tǒng)中。Hive在加載數(shù)據(jù)過程中不會對數(shù)據(jù)進(jìn)行任何的修改,只是將數(shù)據(jù)移動到HDFS中Hive設(shè)定的目錄下,因此,Hive不支持對數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時候確定的。Hive的設(shè)計特點如下。支持索引,加快數(shù)據(jù)查詢。不同的存儲類型,例如,純文本文件、HBase中的文件。將元數(shù)據(jù)保存在關(guān)系數(shù)據(jù)庫中,減少了在查詢中執(zhí)行語義檢查時間??梢灾苯邮褂么鎯υ贖adoop文件系統(tǒng)中的數(shù)據(jù)。內(nèi)置大量用戶函數(shù)UDF來操作時間、字符串和其他的數(shù)據(jù)挖掘工具,支持用戶擴(kuò)展UDF函數(shù)來完成內(nèi)置函數(shù)無法實現(xiàn)的操作。類SQL的查詢方式,將SQL查詢轉(zhuǎn)換為MapReduce的job在Hadoop集群上執(zhí)行。編碼跟Hadoop同樣使用UTF-8字符集。Hive體系結(jié)構(gòu)用戶接口CLI:Cli啟動的時候,會同時啟動一個Hive副本。JDBC客戶端:封裝了Thrift,java應(yīng)用程序,可以在指定的主機(jī)和端口連接到在另一個進(jìn)程中運行的hive服務(wù)器。ODBC客戶端:ODBC驅(qū)動允許支持ODBC協(xié)議的應(yīng)用程序連接到Hive。WUI接口:是通過瀏覽器訪問HiveThrift服務(wù)器基于socket通訊,支持跨語言。HiveThrift服務(wù)簡化了在多編程語言中運行Hive的命令。綁定支持C++,Java,PHP,Python和Ruby語言。HiveHadoopThrift服務(wù)器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫MapReduceHDFS數(shù)據(jù)倉庫用戶接口CLI接口JDBC/ODBC客戶端WEB接口Hive體系結(jié)構(gòu)解析器編譯器:完成HQL查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。優(yōu)化器是一個演化組件,當(dāng)前它的規(guī)則是:列修剪,謂詞下壓。執(zhí)行器會順序執(zhí)行所有的Job。如果Task鏈不存在依賴關(guān)系,可以采用并發(fā)執(zhí)行的方式進(jìn)行Job的執(zhí)行。元數(shù)據(jù)庫Hive的數(shù)據(jù)由兩部分組成:數(shù)據(jù)文件和元數(shù)據(jù)。元數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫中,如mysql、derby。元數(shù)據(jù)包括:表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。HadoopHive的數(shù)據(jù)文件存儲在HDFS中,大部分的查詢由MapReduce完成。(對于包含*的查詢,比如select*fromtbl不會生成MapRedcue作業(yè))HiveHadoopThrift服務(wù)器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫MapReduceHDFS數(shù)據(jù)倉庫用戶接口CLI接口JDBC/ODBC客戶端WEB接口HadoopHive的運行機(jī)制hive用戶通過用戶接口連接Hive,發(fā)布HiveSQLHive解析查詢并制定查詢計劃Hive將查詢轉(zhuǎn)換成MapReduce作業(yè)Hive在Hadoop上執(zhí)行MapReduce作業(yè)sqlMap/Reducehdfstable1table2table3......用戶用戶接口1234Hive的應(yīng)用場景-Hive的優(yōu)勢解決了傳統(tǒng)關(guān)系數(shù)據(jù)庫在大數(shù)據(jù)處理上的瓶頸。適合大數(shù)據(jù)的批量處理。充分利用集群的CPU計算資源、存儲資源,實現(xiàn)并行計算。Hive支持標(biāo)準(zhǔn)SQL語法,免去了編寫MR程序的過程,減少了開發(fā)成本。具有良好的擴(kuò)展性,拓展功能方便。Hive的優(yōu)勢-上百行MR程序與一條HQL的對比Hive的應(yīng)用場景-Hive的缺點Hive的HQL表達(dá)能力有限:有些復(fù)雜運算用HQL不易表達(dá)。Hive效率低:Hive自動生成MR作業(yè),通常不夠智能;HQL調(diào)優(yōu)困難,粒度較粗;可控性差。針對Hive運行效率低下的問題,促使人們?nèi)ふ乙环N更快,更具交互性的分析框架。SparkSQL的出現(xiàn)則有效的提高了Sql在Hadoop上的分析運行效率。Hive的應(yīng)用場景適用場景海量數(shù)據(jù)的存儲處理數(shù)據(jù)挖掘海量數(shù)據(jù)的離線分析不適用場景復(fù)雜的機(jī)器學(xué)習(xí)算法復(fù)雜的科學(xué)計算聯(lián)機(jī)交互式實時查詢Hive開發(fā)使用-Hive的連接HiveServer2目前Hive的Thrift服務(wù)端通常使用HiveServer2,它是HiveServer改進(jìn)版本,它提供了新的ThriftAPI來處理JDBC或者ODBC客戶端,可以進(jìn)行Kerberos身份驗證,支持多個客戶端并發(fā)。BeeLineHiveServer2還提供了新的CLI:BeeLine,它是Hive0.11引入的新的交互式CLI,基于SQLLine,可以作為HiveJDBCClient端訪問HievServer2。通過BeeLine連接hivehive安裝目錄/bin/./beeline-ujdbc:hive2:hiveServer2所在ip:端口號-n用戶名例如:./beeline-ujdbc:hive2://:10000-nrootHive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫類似傳統(tǒng)數(shù)據(jù)庫的DataBase,在元數(shù)據(jù)庫里實際是一張表。對應(yīng)于HDFS上的數(shù)據(jù)倉庫目錄下是一個文件夾。數(shù)據(jù)倉庫目錄路徑,由hive-site.xml中${hive.metastore.warehouse.dir}參數(shù)指定。創(chuàng)建數(shù)據(jù)庫示例:createdatabase數(shù)據(jù)庫名;元數(shù)據(jù)庫中查詢數(shù)據(jù)庫列表:select*fromdbs;如下圖:Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫

hive-site.xml中的數(shù)據(jù)倉庫目錄設(shè)置,如下圖:HDFS下對應(yīng)存儲目錄,數(shù)據(jù)庫名后綴為.db的數(shù)據(jù)庫列表,如下圖,Hive開發(fā)使用-Hive的數(shù)據(jù)模型內(nèi)部表

內(nèi)部表與關(guān)系數(shù)據(jù)庫中的Table在概念上類似。每一個Table在Hive中都有一個相應(yīng)的目錄存儲數(shù)據(jù)。所有的Table數(shù)據(jù)(不包括ExternalTable)都保存在這個目錄中。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除。元數(shù)據(jù)庫中查詢數(shù)據(jù)表列表:

HDFS下對應(yīng)存儲目錄:Hive開發(fā)使用-Hive的數(shù)據(jù)模型

外部表

外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實際數(shù)據(jù)的存儲則有較大的差異。內(nèi)部表的創(chuàng)建過程和數(shù)據(jù)加載過程這兩個過程可以分別獨立完成,也可以在同一個語句中完成,在加載數(shù)據(jù)的過程中,實際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)訪問將會直接在數(shù)據(jù)倉庫目錄中完成。刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除。而外部表只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成(CREATEEXTERNALTABLE……LOCATION),實際數(shù)據(jù)是存儲在LOCATION后面指定的HDFS路徑中,并不會移動到數(shù)據(jù)倉庫目錄中。當(dāng)刪除一個ExternalTable時,僅刪除該鏈接。Hive開發(fā)使用-Hive的數(shù)據(jù)模型如何選擇使用內(nèi)部表或外部表?如果所有處理都由hive來完成,則使用內(nèi)部表如果需要用hive和外部其他工具處理同一組數(shù)據(jù)集,則使用外部表。Hive開發(fā)使用-Hive的數(shù)據(jù)模型

分區(qū)

Partition對應(yīng)于關(guān)系數(shù)據(jù)庫中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫中的很不相同。在Hive中,表中的一個Partition對應(yīng)于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如pvs表中包含ds和city兩個Partition,則對應(yīng)于ds=20090801,city=jinan的HDFS子目錄為:/wh/pvs/ds=20090801/city=jinan;對應(yīng)于ds=20090801,city=qingdao的HDFS子目錄為:/wh/pvs/ds=20090801/city=qingdao。Hive開發(fā)使用-Hive的數(shù)據(jù)模型

Buckets是將表的列通過Hash算法進(jìn)一步分解成不同的文件存儲。它對指定列計算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個Bucket對應(yīng)一個文件。分區(qū)是粗粒度的劃分,桶是細(xì)粒度的劃分,這樣做為了可以讓查詢發(fā)生在小范圍的數(shù)據(jù)上以提高效率。適合進(jìn)行表連接查詢、適合用于采樣分析。例如將user列分散至32個bucket,首先對user列的值計算hash,則對應(yīng)hash值為0的HDFS目錄為:/wh/pvs/ds=20090801/ctry=US/part-00000;對應(yīng)hash值為20的HDFS目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020。如果想應(yīng)用很多的Map任務(wù)這樣是不錯的選擇。Hive開發(fā)使用-Hive的數(shù)據(jù)模型

Hive的視圖視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。視圖是只讀的,它基于的基本表,如果改變,數(shù)據(jù)增加不會影響視圖的呈現(xiàn);如果刪除,會出現(xiàn)問題。如果不指定視圖的列,會根據(jù)select語句后的生成。

視圖的簡單示例:創(chuàng)建表:createviewtest_viewasselect*fromtest;查看數(shù)據(jù):select*fromtest_view;Hive開發(fā)使用-Hive的數(shù)據(jù)存儲模型數(shù)據(jù)庫(database)表(table)表(table)常規(guī)數(shù)據(jù)(data)(Buckets)桶(Buckets)桶分區(qū)(Partition)分區(qū)(Partition)(Buckets)桶(Buckets)桶Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令CREATETABLE創(chuàng)建一個指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用IFNOTEXIST選項來忽略這個異常。EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個外部表,在建表的同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),有分區(qū)的表可以在創(chuàng)建的時候使用PARTITIONEDBY語句。一個表可以擁有一個或者多個分區(qū),每一個分區(qū)單獨存在一個目錄下。表和分區(qū)都可以對某個列進(jìn)行CLUSTEREDBY操作,將若干個列放入一個桶(bucket)中。可以利用SORTBY對數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。默認(rèn)的字段分隔符為ascii碼的控制符\001(^A)tab分隔符為\t。只支持單個字符的分隔符。如果文件數(shù)據(jù)是純文本,可以使用STOREDASTEXTFILE。如果數(shù)據(jù)需要壓縮,使用STOREDASSEQUENCE。CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name

[(col_namedata_type[COMMENTcol_comment],...)][COMMENTtable_comment]

[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]

[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]

[ROWFORMATrow_format]

[STOREDASfile_format][LOCATIONhdfs_path]Hive開發(fā)使用-Hive加載數(shù)據(jù)命令Load操作只是單純的復(fù)制/移動操作,將數(shù)據(jù)文件移動到Hive表對應(yīng)的位置。如果表中存在分區(qū),則必須指定分區(qū)名。加載本地數(shù)據(jù),指定LOCAL關(guān)鍵字,即本地,可以同時給定分區(qū)信息。load命令會去查找本地文件系統(tǒng)中的filepath。如果發(fā)現(xiàn)是相對路徑,則路徑會被解釋為相對于當(dāng)前用戶的當(dāng)前路徑。用戶也可以為本地文件指定一個完整的URI,比如:file:///user/hive/project/data1.例如:加載本地數(shù)據(jù),同時給定分區(qū)信息:hive>LOADDATALOCALINPATH'file:///examples/files/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');加載DFS數(shù)據(jù),同時給定分區(qū)信息:如果filepath可以是相對路徑URI路徑,對于相對路徑,Hive會使用在hadoop配置文件中定義的fs.defaultFS指定的Namenode的URI來自動拼接完整路徑。例如

:加載數(shù)據(jù)到hdfs中,同時給定分區(qū)信息hive>LOADDATAINPATH'/user/myname/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');OVERWRITE指定OVERWRITE,目標(biāo)表(或者分區(qū))中的內(nèi)容(如果有)會被刪除,然后再將filepath指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。如果目標(biāo)表(分區(qū))已經(jīng)有一個文件,并且文件名和filepath中的文件名沖突,那么現(xiàn)有的文件會被新文件所替代。LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例內(nèi)部表

例如:創(chuàng)建人員信息表person_inside,列以逗號","分隔。

建表示例:createtableperson_inside(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_inside;person表字段idnamesexage類型stringstringstringintHive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表

例如:創(chuàng)建人員信息表person_ex,列以逗號","分隔。外部表對應(yīng)路徑:hdfs://mycluster/hivedb/person.txt

建表示例:createexternaltableperson_ext(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfilelocation'/hivedb';(注意:location后面跟的是目錄,不是文件,hive將依據(jù)默認(rèn)配置的hdfs路徑,自動將整個目錄下的文件都加載到表中)Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表

hive默認(rèn)數(shù)據(jù)倉庫路徑下,不會生成外部表的文件目錄,如下圖:查看表信息:descformattedperson_ext;查看location指向。如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表

查詢數(shù)據(jù):select*fromperson_ext;刪除表:droptableperson_ext;只刪除邏輯表,不刪除數(shù)據(jù)文件,數(shù)據(jù)文件依然存在。如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分區(qū)表

例如:創(chuàng)建人員信息表person_part,列以逗號","分隔。建立city為分區(qū)。建表示例:createtableperson_part(idstring,namestring,sexstring,ageint)partitionedby(citystring)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_partpartition(city='jinan');Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分區(qū)表

數(shù)據(jù)存儲在以分區(qū)city='jinan'為目錄的路徑下,如下圖:根據(jù)分區(qū)查詢數(shù)據(jù):hive會自動判斷where語句中是否包含分區(qū)的字段。而且可以使用大于小于等運算符select*fromperson_partwherecity='jinan';如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分桶表

例如:創(chuàng)建人員信息表person_bucket,列以逗號","分隔,在年齡age字段上建5個桶。

建表示例:

createtableperson_bucket

(idstring,namestring,sexstring,ageint)partitionedby(citystring)

clusteredby(age)sortedby(name)into5

bucketsrowformatdelimitedfieldsterminatedby','

storedastextfile;打開桶參數(shù):sethive.enforce.bucketing=true;加載數(shù)據(jù):insertintotableperson_bucketpartition(city='jinan')select*fromperson_inside;

Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分桶表

數(shù)據(jù)加載到桶表時,會對字段取hash值,然后與桶的數(shù)量取模。把數(shù)據(jù)放到對應(yīng)的文件中。如下圖:

抽樣查詢:查詢5個桶中的第2個桶,即000001_0文件select*fromperson_buckettablesample(bucket2outof5onage);Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分桶表:注意:要生成桶的數(shù)據(jù),只能是由其他表通過insertinto或是insertoverwrite導(dǎo)入數(shù)據(jù),如果使用LOADDATA加載數(shù)據(jù),則不能生成桶數(shù)據(jù)。定義桶可以使用整型字段或是string類型字段。若表沒有定義桶也可以進(jìn)行隨機(jī)抽樣,但是要全表掃描,速度慢。必須先sethive.enforce.bucketing=true,才可以將數(shù)據(jù)正常寫入桶中。Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到本地文件系統(tǒng)insertoverwritelocaldirectory'/tmp/exportest/'select*fromperson_inside;注意:導(dǎo)出路徑為文件夾路徑,不必指定文件名。執(zhí)行語句后,會在本地目錄的/tmp/hivedb/下生成一個000000_0結(jié)果集數(shù)據(jù)文件。如下圖:導(dǎo)出的數(shù)據(jù)列之間的分隔符默認(rèn)是^A(ascii碼是\001)。如下圖:Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到HDFS中insertoverwritedirectory'/hivedb'select*fromperson_inside;注意:導(dǎo)出路徑為文件夾路徑,不必指定文件名。執(zhí)行語句后,會在HDFS目錄的/hivedb下生成一個000000_0結(jié)果集數(shù)據(jù)文件。如下圖:Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到Hive的另一個表中insertintotableperson_partpartition(city='jinan')select*fromperson_inside;Hive開發(fā)使用-數(shù)據(jù)查詢命令

溫馨提示

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

評論

0/150

提交評論