相信很多學(xué)JAVA的同學(xué)都有想轉(zhuǎn)大數(shù)據(jù)或者學(xué)大數(shù)據(jù)的想法,但是一看到網(wǎng)上那些大數(shù)據(jù)的技術(shù)棧,就一臉懵逼,什么Hadoop、HDFS、MapReduce、Hive、Kafka、Zookeeper、HBase、Sqoop、Flume、Spark、Storm、Flink等等技術(shù)。
童鞋們可能一下子就慌了,想學(xué)Java的也就SSM、Springboot、Spring Cloud、MySQL這些,線路清晰明了,所以學(xué)習(xí)起來相對也比較直白,但是大數(shù)據(jù)就不一樣了,技術(shù)棧太多了,剛?cè)腴T的時(shí)候可能就被嚇在門外了。今天博主就以Java技術(shù)棧對比大數(shù)據(jù)技術(shù)棧,和大家介紹一下大數(shù)據(jù)的這些技術(shù)棧到底都是用來干嘛的。
架構(gòu)圖
在開始講解之前,我們先來看一下,下面這副圖:
Sqoop
我們按照圖的順序一個(gè)個(gè)來介紹,首先是Sqoop,Sqoop(發(fā)音:skup)是一款開源的工具,主要用于在Hadoop(Hive)與傳統(tǒng)的數(shù)據(jù)庫(mysql、postgresql...)間進(jìn)行數(shù)據(jù)的傳遞,可以將一個(gè)關(guān)系型數(shù)據(jù)庫(例如 : MySQL ,Oracle ,Postgres等)中的數(shù)據(jù)導(dǎo)進(jìn)到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)進(jìn)到關(guān)系型數(shù)據(jù)庫中。
如果非要從功能上面對比的話,和阿里的Canal組件很像,都是用來同步數(shù)據(jù)的。
Flume
Flume是Cloudera提供的一個(gè)高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng),F(xiàn)lume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),F(xiàn)lume提供對數(shù)據(jù)進(jìn)行簡單處理,并達(dá)到各種數(shù)據(jù)接受方(可定制)的能力。
Flume的功能和ELK(日志實(shí)時(shí)檢索系統(tǒng))中的Logstash很像,都是用來傳輸和處理日志數(shù)據(jù)的。
Kafka
Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者在網(wǎng)站中的所有動(dòng)作流數(shù)據(jù)。
說白了就是一個(gè)MQ消息系統(tǒng),和Java中常用RabbitMQ、RocketMQ是一樣的,只是各自的側(cè)重點(diǎn)不一樣,Kafka側(cè)重點(diǎn)在高吞吐量,可以處理海量的數(shù)據(jù)。
HDFS
Hadoop分布式文件系統(tǒng)(HDFS)是指被設(shè)計(jì)成適合運(yùn)行在通用硬件(commodity hardware)上的分布式文件系統(tǒng)(Distributed File System)。它和現(xiàn)有的分布式文件系統(tǒng)有很多共同點(diǎn)。但同時(shí),它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。
像Java項(xiàng)目不可避免地會(huì)涉及到文件上傳下載,這個(gè)時(shí)候要么自己搭建一個(gè)分布式文件系統(tǒng),要么使用第三方。 自己搭建的話一般有GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等,如果用第三方的一般會(huì)用七牛云、騰訊云OSS對象存儲(chǔ)、阿里云OSS對象存儲(chǔ)。
Hive
hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具,用來進(jìn)行數(shù)據(jù)提取、轉(zhuǎn)化、加載,這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。hive數(shù)據(jù)倉庫工具能將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供SQL查詢功能,能將SQL語句轉(zhuǎn)變成MapReduce任務(wù)來執(zhí)行。
如果對比Java的話,有點(diǎn)類似MySQL(不太準(zhǔn)確),既可以存儲(chǔ)表結(jié)構(gòu)數(shù)據(jù),又可以通過SQL來查詢這些數(shù)據(jù),只是不能進(jìn)行修改,只能進(jìn)行離線操作。
HBase
HBase – Hadoop Database,是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),利用HBase技術(shù)可在廉價(jià)PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群。
HBase其實(shí)就是一種NoSQL,和Java中常用的redis很像,只是他們的底層實(shí)現(xiàn)不一樣而已。
Zookeeper
ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。
Zookeeper在Java中也是很出名的,像基于Dubbo的注冊中心一般都是用Zookeeper來實(shí)現(xiàn)的。同類的有:鼎鼎大名的微服務(wù)的注冊中心Eureka、Consul之類的。
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)用程序。
HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統(tǒng)中的數(shù)據(jù)。Hadoop的框架最核心的設(shè)計(jì)就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲(chǔ),而MapReduce則為海量的數(shù)據(jù)提供了計(jì)算
從Java的角度看Hadoop有點(diǎn)類似Spring Cloud,他們不僅僅只是一個(gè)具體的技術(shù),而是一個(gè)生態(tài)圈,Hadoop中包含了Hive、MapReduce、HDFS等,所以不要把Hadoop看成僅僅只是一個(gè)單一的技術(shù)。
數(shù)據(jù)處理技術(shù)
像MapReduce、Spark、Storm/Flink都是用來處理數(shù)據(jù)的,比如數(shù)據(jù)清洗、計(jì)算、統(tǒng)計(jì)等等之類的。
MapReduce
MapReduce是面向大數(shù)據(jù)并行處理的計(jì)算模型、框架和平臺(tái),它隱含了以下三層含義:
- MapReduce是一個(gè)基于集群的高性能并行計(jì)算平臺(tái)(Cluster Infrastructure)。它允許用市場上普通的商用服務(wù)器構(gòu)成一個(gè)包含數(shù)十、數(shù)百至數(shù)千個(gè)節(jié)點(diǎn)的分布和并行計(jì)算集群。
- MapReduce是一個(gè)并行計(jì)算與運(yùn)行軟件框架(Software Framework)。它提供了一個(gè)龐大但設(shè)計(jì)精良的并行計(jì)算軟件框架,能自動(dòng)完成計(jì)算任務(wù)的并行化處理,自動(dòng)劃分計(jì)算數(shù)據(jù)和計(jì)算任務(wù),在集群節(jié)點(diǎn)上自動(dòng)分配和執(zhí)行任務(wù)以及收集計(jì)算結(jié)果,將數(shù)據(jù)分布存儲(chǔ)、數(shù)據(jù)通信、容錯(cuò)處理等并行計(jì)算涉及到的很多系統(tǒng)底層的復(fù)雜細(xì)節(jié)交由系統(tǒng)負(fù)責(zé)處理,大大減少了軟件開發(fā)人員的負(fù)擔(dān)。
- MapReduce是一個(gè)并行程序設(shè)計(jì)模型與方法(Programming Model & Methodology)。它借助于函數(shù)式程序設(shè)計(jì)語言Lisp的設(shè)計(jì)思想,提供了一種簡便的并行程序設(shè)計(jì)方法,用Map和Reduce兩個(gè)函數(shù)編程實(shí)現(xiàn)基本的并行計(jì)算任務(wù),提供了抽象的操作和并行編程接口,以簡單方便地完成大規(guī)模數(shù)據(jù)的編程和計(jì)算處理
額---》技術(shù)的概念一般都是嚴(yán)謹(jǐn)復(fù)雜的,這邊簡單概括就是MapReduce簡稱MR,主要功能就是用來處理離線大數(shù)據(jù),可以通過分析海量的離線數(shù)據(jù),計(jì)算出我們需要的結(jié)果。
Spark
Apache Spark 是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎。Spark是UC Berkeley AMP lab (加州大學(xué)伯克利分校的AMP實(shí)驗(yàn)室)所開源的類Hadoop MapReduce的通用并行框架,Spark,擁有Hadoop MapReduce所具有的優(yōu)點(diǎn);但不同于MapReduce的是——Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)等需要迭代的MapReduce的算法。
Spark 是一種與 Hadoop 相似的開源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越,換句話說,Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。
從概念上面我們就可以看出來,Spark并不僅僅只是一個(gè)技術(shù),而是和Hadoop相似,有一個(gè)成熟的生態(tài)圈,例如Spark SQL、Spark Streaming之類的,和Hadoop中的Hive、MR相似。 現(xiàn)在主流的都采用Spark來進(jìn)行海量數(shù)據(jù)的處理,因?yàn)樗瓤梢詫?shí)現(xiàn)離線數(shù)據(jù)分析又可以進(jìn)行實(shí)時(shí)數(shù)據(jù)分析。
Storm/Flink
Apache Flink是由Apache軟件基金會(huì)開發(fā)的開源流處理框架,其核心是用Java和Scala編寫的分布式流數(shù)據(jù)流引擎。Flink以數(shù)據(jù)并行和流水線方式執(zhí)行任意流數(shù)據(jù)程序,F(xiàn)link的流水線運(yùn)行時(shí)系統(tǒng)可以執(zhí)行批處理和流處理程序。此外,F(xiàn)link的運(yùn)行時(shí)本身也支持迭代算法的執(zhí)行(Storm功能和上面類似,這邊就不多啰嗦了)。
Spark的Spark Streaming就是一個(gè)實(shí)時(shí)數(shù)據(jù)處理框架,為什么還需要Storm/Flink呢?因?yàn)閷?shí)時(shí)和實(shí)時(shí)之間還是有時(shí)間上面的差別的,我們看一下下圖就知道,他們之間的區(qū)別在哪里了。