在學(xué)習(xí)大數(shù)據(jù)之前,先要了解他解決了什么問題,能給我們帶來什么價值。一方面,以前IT行業(yè)發(fā)展沒有那么快,系統(tǒng)的應(yīng)用也不完善,數(shù)據(jù)庫足夠支撐業(yè)務(wù)系統(tǒng)。但是隨著行業(yè)的發(fā)展,系統(tǒng)運行的時間越來越長,搜集到的數(shù)據(jù)也越來越多,傳統(tǒng)的數(shù)據(jù)庫已經(jīng)不能支撐全量數(shù)據(jù)的存儲工作;另一方面,數(shù)據(jù)越來越多,單機的計算已經(jīng)成為瓶頸。因此,基于分布式的大數(shù)據(jù)系統(tǒng)嶄露頭角。那么大數(shù)據(jù)系統(tǒng)里面都有什么東西呢?可以參考下面的圖

在存儲上,hdfs的分布式存儲可以任意水平擴展,可以解決數(shù)據(jù)存儲的難題。在計算上,從最初的MapReduce,把任務(wù)水平拆分,多臺機器并行計算,再匯總結(jié)果;到基于Spark的內(nèi)存計算,改造Mapreduce每次數(shù)據(jù)落盤以及編程方式的痛點。
有了存儲和計算框架,周邊就衍生出了很多管理、緩存相關(guān)的技術(shù),比如:
yarn解決多租戶資源調(diào)度的難題,
flume解決數(shù)據(jù)傳輸?shù)碾y題,
sqoop解決分布式存儲數(shù)據(jù)與傳統(tǒng)DB數(shù)據(jù)之間的轉(zhuǎn)換,
oozie解決了大數(shù)據(jù)計算任務(wù)的調(diào)度,
kafka提供了發(fā)布訂閱機制的消息隊列,
zookeeper可以幫助用戶完成主備的選舉,
hive在hdfs的基礎(chǔ)上提供了數(shù)倉的功能,
hbase則基于hdfs實現(xiàn)列式數(shù)據(jù)庫....

上面都是hadoop生態(tài)的,由于hadoop中計算模型普遍是mapreduce,但是它的編程風(fēng)格和計算機制讓很多人使用不便。因此后來spark逐漸代替了mapr成為主流的計算框架。Spark也有它自己的生態(tài),但是由于hadoop更多更早的被應(yīng)用到企業(yè),所以spark也可以無縫的集成hadoop生態(tài)中的產(chǎn)品。spark更多只是扮演一個計算的框架,在這個框架上,提供了基本的計算模塊core,基于sql的計算引擎spark sql,對接實時數(shù)據(jù)的流式計算spark streaming,算法相關(guān)的mlib以及圖計算相關(guān)的graphx。
這些框架都在這個大數(shù)據(jù)生態(tài)中扮演了自己重要的角色,他們協(xié)同工作就可以幫助我們解決很多難題。由于我也是接觸不久,所以就按照自己學(xué)習(xí)和工作涉及的內(nèi)容,在下面按照各個章節(jié)進(jìn)行介紹,后續(xù)也會持續(xù)的更新。希望對所有對大數(shù)據(jù)感興趣的
hdfs
hdfs是大數(shù)據(jù)系統(tǒng)的基礎(chǔ),它提供了基本的存儲功能,由于底層數(shù)據(jù)的分布式存儲,上層任務(wù)也可以利用數(shù)據(jù)的本地性進(jìn)行分布式計算。hdfs思想上很簡單,就是namenode負(fù)責(zé)數(shù)據(jù)存儲位置的記錄,datanode負(fù)責(zé)數(shù)據(jù)的存儲。使用者client會先訪問namenode詢問數(shù)據(jù)存在哪,然后去datanode存儲;寫流程也基本類似,會先在namenode上詢問寫到哪,然后把數(shù)據(jù)存儲到對應(yīng)的datanode上。所以namenode作為整個系統(tǒng)的靈魂,一旦它掛掉了,整個系統(tǒng)也就無法使用了。在運維中,針對namenode的高可用變得十分關(guān)鍵。
mapreduce
hive
hive基于hdfs構(gòu)建了數(shù)據(jù)倉庫系統(tǒng),它以hdfs作為存儲,依賴于數(shù)據(jù)庫(嵌入式的數(shù)據(jù)庫derby或者獨立的數(shù)據(jù)mysql或oracle)存儲表schema信息,并完成基于sql自動解析創(chuàng)建mapreduce任務(wù)(由于mapreduce計算效率比較差,目前官方推薦的是底層計算模型采用tez或者spark)。所以hive可以理解為:hdfs原始存儲+DB Schema信息存儲+SQL解析引擎+底層計算框架組成的數(shù)據(jù)倉庫。
spark
spark是現(xiàn)在大數(shù)據(jù)中應(yīng)用最多的計算模型,它與java8的stream編程有相同的風(fēng)格。封裝了很多的計算方法和模型,以延遲執(zhí)行的方式,在真正需要執(zhí)行的時候才進(jìn)行運算。既可以有效的做計算過程的容錯,也可以改善我們的編程模型。
oozie
oozie提供了大數(shù)據(jù)場景下各種任務(wù)的調(diào)度,比如shell腳本、spark任務(wù)、mapreduce任務(wù)、sqoop任務(wù)、hive查詢以及普通的java程序等等。它的編譯是生態(tài)圈里面最復(fù)雜的,由于以來的各個版本不同,需要指定特定的版本,因此沒有成型的一鍵部署包。
sqoop
sqoop支持基于sql或者表名把數(shù)據(jù)庫中的數(shù)據(jù)存儲到分布式環(huán)境中,數(shù)據(jù)庫支持oracle\mysql等等,分布式環(huán)境可以是hdfs,hive,hbase等等,數(shù)據(jù)的導(dǎo)入時雙向的,比如你可以把oracle中的數(shù)據(jù)讀取存儲到hdfs,也可以把hdfs的數(shù)據(jù)導(dǎo)入到oracle.
hbase
HBase是基于Hdfs之上的列式數(shù)據(jù)庫,基于文件分割以及rowkey的順序存儲,能快速索引查詢數(shù)據(jù)。我這邊是在推薦系統(tǒng)中,作為推薦結(jié)果存儲引擎,不過由于內(nèi)容比較碎片化,Hbase寫入時間比較隨意,因此總會出現(xiàn)大量超時現(xiàn)象,還在持續(xù)優(yōu)化中。
yarn
在企業(yè)中,大數(shù)據(jù)的基礎(chǔ)平臺往往是多個用戶共用的,那么如何管理資源的分配,就需要yarn來處理了。Yarn默認(rèn)提供了三種資源分配的策略:
FIFO:先進(jìn)先出,即按照用戶提交任務(wù)的時間分配資源
Capacity:按照隊列設(shè)置隊列的大小
Fair Share:也是基于隊列,只不過資源的粒度更小。
常見可以用于分配的資源可以是節(jié)點的數(shù)量,內(nèi)存的大小,也可以是CPU核數(shù)。
zookeeper
從名字來說他是動物園的管理員,實際上他是各個組件的協(xié)調(diào)者??梢詫崿F(xiàn)類似主從選舉、分布式事務(wù)、負(fù)載均衡等多種功能,比如HDFS HA方案、HBase的Metastore、Kafka里面的offset維護(hù)等等,由此可以見,zookeeper的重要性。
不過激發(fā)我學(xué)習(xí)zookeeper的主要原因還是因為它里面涉及了很多分布式協(xié)議的東西,從而能更好的理解分布式中的一些概念。所以,就跟著我一起深入淺出的學(xué)習(xí)吧!
主要參考:官方文檔 《從Paxos到zookeeper分布式一致性原理與實踐》
最后
上面是我學(xué)習(xí)hadoop和spark的分享,希望有興趣學(xué)習(xí)大數(shù)據(jù)的朋友可以通過我之前的學(xué)習(xí)路線獲得一些思考和借鑒,如果有任何疑問或者需要學(xué)習(xí)方法和路線的朋友可以關(guān)注博主的簡書,私信我即可