《深入理解java大數據技術—Hadoop原理與應用》要點:
本文介紹了深入理解java大數據技術—Hadoop原理與應用,希望對您有用。如果有疑問,可以聯(lián)系我們。
概述
本日給大家一個福利,私信我可免費獲取java資源,Dubbo、Redis、Netty、zookeeper、Spring cloud 等你來領取!!!
Hadoop CAP理論
大數據技術原理與應用——概念、存儲、處理、闡發(fā)與應用
C (強一致性) :系統(tǒng)在執(zhí)行過某項操作后仍然處于一致的狀態(tài).在分布式系統(tǒng)中,更新操作執(zhí)行勝利后所有的用戶都應該讀取到最新的值,這樣的系統(tǒng)被認為具有強一致性.
A (可用性) :每一個操作總是能夠在必定的時間內返回結果,這里需要注意的是“必定時間內”和“返回結果”.
P (分區(qū)容錯性):分區(qū)容錯性可以理解為系統(tǒng)在存在網絡分區(qū)的情況下仍然可以接受哀求(滿足一致性和可用性).
Hadoop的HDFS只支持數據增加,而Mapeduce卻進行全局計算,完美地符合了他對數據處置的期望!
Hadoop也存在某個節(jié)點數據喪失的問題,但隨著流式計算,喪失的數據終究會隨著系統(tǒng)的正常而被最終合并,因此數據最終是一致的.
Hadoop不克不及進行實時計算咋辦?作者又構建了一套基于Cassandra和ElephantDB的實時數據處理系統(tǒng)....搞的無比復雜!
Hadoop 組件
核心組件
HDFS ----Hadoop生態(tài)系統(tǒng)的基礎組件是Hadoop分布式文件系統(tǒng)(HDFS).HDFS的機制是將大量數據分布到計算機集群上,數據一次寫入,但可以多次讀取用于闡發(fā).它是其他一些工具的基礎,例如HBase.
MapReduce ----Hadoop的主要執(zhí)行框架即MapReduce,它是一個用于分布式并行數據處理的編程模型,將作業(yè)分為mapping階段和reduce階段(因此而得名).開發(fā)人員為Hadoop編寫MapReduce作業(yè),并使用HDFS中存儲的數據,而HDFS可以保證快速的數據拜訪.鑒于MapReduce作業(yè)的特性,Hadoop以并行的方式將處理過程移向數據,從而實現快速處理.
其他組件
Hbase ----一個構建在HDFS之上的面向列的NoSQL數據庫,HBase用于對年夜量數據進行快速讀取/寫入.HBase將Zookeeper用于自身的管理,以保證其所有組件都正在運行.
Zookeeper ----Zookeeper是Hadoop的分布式協(xié)調服務.Zookeeper被設計成可以在機器集群上運行,是一個具有高度可用性的服務,用于Hadoop操作的管理,并且很多Hadoop組件都依賴它.
Oozie ----一個可擴展的Workflow系統(tǒng),Oozie已經被集成到Hadoop軟件棧中,用于協(xié)調多個MapReduce作業(yè)的執(zhí)行.它能夠處理大量的復雜性,基于外部事件(包含定時和所需數據是否存在)來管理執(zhí)行.
Pig ----對MapReduce編程復雜性的抽象,Pig平臺包括用于分析Hadoop數據集的執(zhí)行環(huán)境和腳本語言(Pig Latin).它的編譯器將Pig Latin翻譯為MapReduce程序序列.
Hive ----類似于SQL的高級語言,用于執(zhí)行對存儲在Hadoop中數據的查詢,Hive允許不熟悉MapReduce的開發(fā)人員編寫數據查詢語句,它會將其翻譯為Hadoop中的MapReduce作業(yè).類似于Pig,Hive是一個抽象層,但更傾向于面向較熟悉SQL而不是Java編程的數據庫闡發(fā)師.
Hadoop HDFS 分布式文件系統(tǒng) 兩年夜部件
NameNode
HdFS中主節(jié)點,存儲文件的元數據,如文件名,文件目錄布局,文件屬性(生成時間,副本個數,文件權限),以及每個文件的塊列表和塊所在的DataNode等等.
DataNode
在HDFS中存儲文件塊數據,以及塊數據的校驗和.
HDFS 讀寫機制
HDFS讀文件數據流
在讀取HDFS的文件時,首先客戶端調用FileSystem的open()函數打開文件,DistributedFileSystem用RPC調用元數據節(jié)點,得到文件的數據塊信息.對于每一個數據塊,元數據節(jié)點返回保存數據塊的數據節(jié)點的地址.DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據.客戶端調用stream的read()函數開始讀取數據.DFSInputStream連接保存此文件第一個數據塊的最近的數據節(jié)點.Data從數據節(jié)點讀到客戶端,當此數據塊讀取完畢時,DFSInputStream關閉和此數據節(jié)點的連接,然后連接此文件下一個數據塊的最近的數據節(jié)點.當客戶端讀取完數據的時候,調用FSDataInputStream的close函數.客戶端讀取HDFS中的文件拜訪數據流的整個過程如圖3-3所示.
HDFS中的讀文件數據流的過程
上圖中的操作序號1、2、3、4、5表現執(zhí)行順序,讀取文件的數據流步驟如下:
1) 挪用FileSystem的open()打開文件,見序號1:open.
2) DistributedFileSystem使用RPC調用NameNode節(jié)點,獲得文件的數據塊元數據信息,并返回FSDataInputStream給客戶端,見序號2:get block locations.
3) 客戶端挪用stream的read()函數開始讀取數據,見序號3:read.
4) 挪用FSDataInputStream直接從DataNode獲取文件數據塊,見序號4、5:read.
5) 讀完文件時,挪用FSDataInputStream的close函數,見序號6:close.
HDFS寫數據流
HDFS的寫數據操作,比讀數據復雜一些.讀數據的時候,只需要在多個數據塊文件的選一個讀,就可以了,但是,寫數據需要同時寫到多個數據塊文件上,這就相對比擬復雜了.HDFS的寫機制可以通過圖3-4進行簡單描述.
HDFS寫文件基本機制
如圖所描述,數據流從客戶端開始,流經一系列的節(jié)點,到達最后一個DataNode.圖3-4中的所有DataNode只必要寫一次硬盤,DataNode1和DataNode2會從socket上接收到數據,直接寫到下個節(jié)點的socket上.必要注意的是,如果當前DataNode處于數據流的中間,那么該數據包會被發(fā)送到下一個節(jié)點.接下來就是處理數據和校驗,并分別將數據包寫到數據塊文件和數據塊元數據文件.如果出錯,拋出的異常會導致receiveBlock關閉相關的輸出流,并終止傳輸.同時,數據校驗出錯還會上報到NameNode上.
最后一個DataNode由于沒有后續(xù)節(jié)點,PacketResponder的ackQueue每收到一項,表明對應的數據塊已經處理完畢,那么就可以發(fā)送成功應答.如果該應答是最后一個包的,PacketResponder會關閉相關的輸出流并提交.如果DataNode有后續(xù)節(jié)點,那么,它必須比及后續(xù)節(jié)點成功應答才可以發(fā)送應答.
上面描述了HDFS在寫數據時的基本處置機制,從客戶端開始,直到在HDFS上完成寫一個文件的整體數據流程如圖3-5所示.
HDFS寫數據流圖
如圖所示,首先客戶端調用create()來創(chuàng)建文件,然后DistributedFileSystem同樣使用RPC調用NameNode元數據節(jié)點,在文件系統(tǒng)的命名空間中創(chuàng)建一個新的文件.NameNode首先確定文件原來不存在,以及客戶端有創(chuàng)建文件的權限,然后創(chuàng)建新文件.DistributedFileSystem返回DFSOutputStream,客戶端用于寫數據.客戶端開始寫入數據,DFSOutputStream將數據分成塊,寫入data queue.Data queue由Data Streamer讀取,并通知元數據節(jié)點分配數據節(jié)點,用來存儲數據塊(每塊默認復制3塊).分配的數據節(jié)點放在一個pipeline里.Data Streamer將數據塊寫入pipeline中的第一個數據節(jié)點.第一個數據節(jié)點將數據塊發(fā)送給第二個數據節(jié)點.第二個數據節(jié)點將數據發(fā)送給第三個數據節(jié)點.DFSOutputStream為發(fā)出去的數據塊保留了ack queue,等待pipeline中的數據節(jié)點告知數據已經寫入成功.如果數據節(jié)點在寫入的過程中失?。宏P閉pipeline,同時將ack queue中的數據塊放入data queue中的開始位置.
到這里,深入理解java大數據技術—Hadoop原理與應用就結束了,不足之處還望大家多多原諒!!覺得收獲的話可以點個關注收藏轉發(fā)一波喔,謝謝大佬們支持.(吹一波,233~~)
下面和年夜家交流幾點編程的經驗:
1、多寫多敲代碼,好的代碼與扎實的基礎知識必定是實踐出來的
2丶 測試、測試再測試,如果你不徹底測試本身的代碼,那恐怕你開發(fā)的就不只是代碼,可能還會聲名狼藉.
3丶 簡化算法,代碼如惡魔,在你完成編碼后,應回頭而且優(yōu)化它.從長遠來看,這里或那里一些的改進,會讓后來的支持人員更加輕松.
最后,每一位讀到這里的網友,感謝你們能耐心地看完.希望在成為一名更優(yōu)秀的Java法式員的道路上,我們可以一起學習、一起進步.
內部交流群469717771 歡迎列位前來交流和分享, 驗證:(009)
維易PHP培訓學院每天發(fā)布《深入理解java大數據技術—Hadoop原理與應用》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9610.html