最近一直沒更新,不是因為懶,而是要學的東西太多了,時間全用來學大數據的技術棧了,見諒。
言歸正傳,這篇科普文章就給大家講講大數據的技術棧和生態圈,讓大數據不再神秘!
何謂大數據?
大數據的Wiki英文引文中的解釋如下:
The tools, processes and procedures allowing an organization to create, manipulate, and manage very large data sets and storage facilities.
允許組織去創建,操縱和管理巨量數據集和存儲設施的工具,過程和程序。
因此,從廣義上來說,大數據是一個抽象的概念,它包含了巨量數據本身以及處理它所需要的工具、過程以及程序。從狹義上說,大數據就是各種來源結構化和非結構化的數據集合,通常這種數據集合造成傳統軟件在可接受的時間內進行數據處理的能力。
隨着時間的推移,數據的單位增長隨着軟硬件的不斷進步,而呈現出指數倍的增長,在氣象學、基因組學、神經網絡體學、復雜的物理模擬、生物及環境研究、金融、電商等各個領域,數據的體量已經大到傳統的軟件程序對其進行分析處理的時間無法承受,也許可能計算一次大氣模擬需要一個月之久才能得到結果,但得到的結果的時候已經失去了其本身計算的意義。
截止2012年,全世界每天產生2.5EB(1EB=1000PB=1000000TB=1000000000GB)的數據,采用傳統的軟件處理數據已經是窮途末路,大數據技術的產生是大勢所趨。
大數據的特點
大數據的特點可以使用5個V來介紹,分別是Velocity、Value、Veracity、Variety、Volume。
- Velocity(速度):大數據的產生速度是非常迅速的,圖中也介紹了這個特性中的幾個要點,分別是批量化產生、近乎實時的要求、處理速度快、以及支持流式處理操作。可以想象,如果一個公司的搜索引擎不能近乎實時且精准地返回用戶想要查詢的結果,那么這家公司一定會被市場淘汰掉。
- Value(價值):數據的增加並不代表數據的價值增加,在一般的情況下,數據價值的密度較低,這是一個沙里淘金的過程。如何采用合適的算法模型來對數據進行分析、挖掘,尋找數據中的價值是未來相當長的一段時間內學界、業界需要共同努力的事情。
- Veracity(真實性):這里指的是數據的可信度。一般而言,大數據需要確保獲得的數據具有真實性的意義,否則一切都是無意義的徒勞。
- Variety(種類):大數據的種類和來源是多樣化的,其中包括結構化、半結構化和非結構化的數據,具體表現有文本數據、音視頻數據、圖片、地理位置數據等等。多類型的數據對目標企業或機構的數據的處理能力就提出了更高的要求。
- Volume(體量):毋庸置疑,大數據的數據體量是非常龐大的,通常意義上來說,一次計算的體量至少都應該是GB級別,大多數都是TB級別,有的甚至在PB、EB。
大數據的技術棧
從業務流的角度進行分析,大數據的技術棧的功能主要針對數據提供:采集、清洗、存儲、查詢、計算、可視化等功能。針對這些功能,各個技術機構針對自己的業務需求,開發了可用的框架,目前這些技術框架有很多,我們可以看下面這張圖,來宏觀感受一下。
不要被嚇到,這里的所有技術並不會要求你全部搞定,一般的大數據從業人員也只需要會每隔小部分中最重要的一個或幾個技術就夠了。在眾多的技術中,最讓人熟悉的莫過於Hadoop技術生態圈里的內容了,因此我首先來介紹一下有關Hadoop的技術生態圈,讓大家了解Hadoop的各種技術之間是怎么進行協同工作的。
上圖是一個Hadoop的技術生態圈,里面包括了Hadoop全部的技術棧,各個技術都充當了整個大數據處理流程中的某個特定角色,下面我來挨着解釋一下。
1、HDFS
HDFS,全稱為Hadoop Distributed File System,叫做Hadoop分布式文件系統。它是Hadoop生態系統中最重要的組件。 HDFS是Hadoop的主要存儲系統。 Hadoop分布式文件系統(HDFS)是基於Java的文件系統,可為大數據提供可伸縮、容錯、可靠且經濟高效的數據存儲。 HDFS是在商用硬件上運行的分布式文件系統。它支持通過類似shell的命令的直接交互。HDFS其內部有兩個最重要的組件,分別是NameNode和DataNode。
NameNode,不存儲實際的數據而是對文件系統內的元數據進行管理,比如數據塊信息、數據分布的存放節點與位置、DataNode節點的數據存放細節等,在同一個集群中,此組件要求只能有一個處於工作狀態。
DataNode,負責在HDFS中存儲實際數據。DataNode根據客戶端的請求執行讀取和寫入操作。DataNode的副本塊由文件系統上的2個文件組成。第一個文件用於數據,第二個文件用於記錄塊的元數據。在啟動時,每個DataNode連接到其相應的NameNode並進行握手。命名空間ID和DataNode的軟件版本的驗證通過握手進行。發現不匹配時,DataNode自動關閉。DataNode根據NameNode的指令執行諸如塊副本創建,刪除和復制之類的操作。
2、Mapreduce
Hadoop MapReduce是提供數據處理的核心Hadoop生態系統組件。MapReduce是一個大數據計算框架,用於處理Hadoop分布式文件系統中存儲的大量結構化和非結構化數據的計算應用程序。MapReduce程序本質上是並行的,因此對於使用集群中的多台計算機執行大規模數據分析非常有用。因此,它提高了集群並行處理的速度和可靠性。
在MapReduce中,有兩個階段,分別是Map階段和Reduce階段。每個階段都有鍵值對作為輸入和輸出。Map函數獲取一組數據並將其轉換為另一組數據,其中個元素分解為元組(鍵值對)。Reduce函數將Map的輸出作為輸入,並根據鍵組合這些數據元組,並相應地修改鍵的值。
該框架擁有運行處理PB級數據的能力,以及快速、高容錯性等特點,是Hadoop生態圈中很重要的技術框架。
3、YARN
Hadoop Yarn(Yet Another Resource Negotiator),是提供資源管理的Hadoop生態系統組件。Yarn也是Hadoop生態系統中最重要的組件之一。 YARN被稱為Hadoop的操作系統,因為它負責管理和監視工作負載。它允許多個數據處理引擎(例如實時流和批處理)處理存儲在單個平台上的數據。
Yarn具有靈活性的特點,除了可以用於批處理計算框架,比如MapReduce外,還可以用於其他模式的數據處理,比如交互式和流式處理模式。由於這個優勢,其他的計算框架也可以在Yarn的資源調度下,與MapReduce程序一起運行,提高了Hadoop集群的服務效率。另外,Yarn還具有高共享性的特點,在多個工作負載之間提供穩定、可靠、安全的共享操作服務,所以在對於數據處理的過程中,可以使用其他的編程模型,比如圖形處理模型或迭代模型等。
4、ZooKeeper
Apache Zookeeper是Hadoop生態系統的重要組件,提供了分布式應用程序的協調服務,它是一個為分布式應用提供一致性服務的軟件,包括阿配置維護、域名服務、分布式同步、組服務等。
Zookeeper的特性有以下幾個方面:
* 順序一致性,從同一個客戶端發起的事務請求,最終將會嚴格地按照其發起順序被應用到Zookeeper中去。
* 原子性,所有事務請求的處理結果在整個集群中所有機器上的應用情況是一致的,即整個集群要么都成功應用了某個事務,要么都沒有應用。
* 單一視圖,無論客戶端連接的是哪個 Zookeeper 服務器,其看到的服務端數據模型都是一致的。
* 可靠性,一旦服務端成功地應用了一個事務,並完成對客戶端的響應,那么該事務所引起的服務端狀態變更將會一直被保留,除非有另一個事務對其進行了變更。
* 實時性,Zookeeper 保證在一定的時間段內,客戶端最終一定能夠從服務端上讀取到最新的數據狀態。
這個技術的出現,在總體上解決了我們所說的拜占庭將軍問題,也就是分布式系統中最大的難題,即協調一致的問題。當然,順便提一句,在分布式系統領域,有一篇很重要的論文,名字叫做《Paxos Made Simple》,有興趣各位可以讀一下。
5、Hive
Apache Hive是一個開源數據倉庫系統,是一個數據分析框架,其用於查詢和分析存儲在Hadoop文件中的大型數據集。Hive具有三個主要功能:數據匯總,查詢和分析。Hive使用稱為HiveQL(HQL)的語言,與SQL相似。 HiveQL自動將類似SQL的查詢轉換為MapReduce作業,該作業將在Hadoop上執行。簡而言之,Hive就是在Hadoop上架了一層SQL接口,可以將SQL翻譯成MapReduce去Hadoop上執行,這樣就使得數據開發和分析人員很方便的使用SQL來完成海量數據的統計和分析。
6、Pig(目前用的很少了)
Apache Pig是用於分析和查詢HDFS中存儲的巨大數據集的高級語言平台。Pig作為Hadoop生態系統的組成部分,使用PigLatin語言。它與SQL非常相似。它加載數據,應用所需的過濾器並以所需格式轉儲數據。為了執行程序,Pig需要Java運行時環境。
7、HBase
Apache HBase是Hadoop生態系統組件,它是一個分布式數據庫,旨在將結構化數據存儲在可能具有數十億行和數百萬列的表中。 HBase是基於HDFS構建的可擴展,分布式和NoSQL數據庫。 HBase,提供對HDFS中讀取或寫入數據的實時訪問。
有兩個HBase組件,即HBase Master和RegionServer。HBaseMaster,它不是實際數據存儲的一部分,而是協商所有RegionServer之間的負載平衡,同時其維護和監視Hadoop集群。具體來說,它執行管理(用於創建,更新和刪除表的界面。)、控制故障轉移、處理DDL操作。RegionServer是工作節點,負責處理來自客戶端的讀取,寫入,更新和刪除請求,進程在Hadoop群集中的每個節點上運行,一般與HDFS DateNode節點保持一致,保證計算向數據移動的特性。
8、HCatalog
Apache HCatalog是Hadoop的表和存儲的管理層。它支持Hadoop生態系統中可用的不同組件,例如MapReduce,Hive等,以輕松地從集群讀取和寫入數據。HCatalog是Hive的關鍵組件,使用戶能夠以任何格式和結構存儲其數據。在默認情況下,HCatalog支持RCFile,CSV,JSON,sequenceFile和ORC文件格式。
9、Avro
Acro是Hadoop生態系統的一部分,是最流行的數據序列化系統。Avro是一個開源項目,為Hadoop提供數據序列化和數據交換服務。這些服務可以一起使用,也可以獨立使用。大數據可以使用Avro交換以不同語言編寫的程序。使用序列化服務程序可以將數據序列化為文件或消息。它將數據定義和數據存儲在一個消息或文件中,使程序可以輕松地動態了解存儲在Avro文件或消息中的信息。Avro模式–依靠模式進行序列化/反序列化。Avro需要用於數據寫入/讀取的架構。當Avro數據存儲在文件中時,其架構也隨之存儲,因此以后任何程序都可以處理文件。動態類型化–指不生成代碼的序列化和反序列化。它補充了代碼生成功能,該功能可在Avro中用於靜態類型的語言,作為可選優化。
10、Thrift
Apache Thrift是一個輕量級、跨語言的遠程服務調用框架,最初是由FaceBook開發,后面進入了Apache開源項目。它通過自身的IDL中間語言, 並借助代碼生成引擎生成各種主流語言的RPC服務端/客戶端模板代碼。在Hadoop的技術生態中,很多技術均用到了此框架的技術。
11、Drill
Apache Drill是一個低延遲的分布式海量數據(涵蓋結構化、半結構化以及嵌套數據)交互式查詢引擎,使用ANSI SQL兼容語法,支持本地文件、HDFS、HBase、MongoDB等后端存儲,支持Parquet、JSON、CSV、TSV、PSV等數據格式。本質上Apache Drill是一個分布式的mpp(大規模並行處理)查詢層。Drill的目的在於支持更廣泛的數據源,數據格式,以及查詢語言。受Google的Dremel啟發,Drill滿足上千節點的PB級別數據的交互式商業智能分析場景。
12、Mahout
Apache Mahout提供了一些經典的機器學習的算法,皆在幫助開發人員更加方便快捷地創建智能應用程序。通過ApacheMahout庫,Mahout可以有效地擴展到雲中。Mahout包括許多實現,包括聚類、分類、推薦引擎、頻繁子項挖掘。Apache Mahout的主要目標是建立可伸縮的機器學習算法。這種可伸縮性是針對大規模的數據集而言的。通過Apache Mahout的算法庫,Mahout可以有效地使用Hadoop集群的能力進行機器學習的計算與分析。
13、Sqoop
Apache Sqoop是一款用於hadoop和關系型數據庫之間數據導入導出的工具。你可以通過Sqoop把數據從數據庫(比如mysql,oracle)導入到HDFS中;也可以把數據從HDFS中導出到關系型數據庫中。Sqoop通過Hadoop的MapReduce導入導出,因此提供了很高的並行性能以及良好的容錯性。
14、Flume
Apache Flume是一個分布式的、可靠的、可用的,從多種不同的源收集、聚集、移動大量日志數據到集中數據存儲的系統。Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定制)的能力 。Flume提供了從console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系統),支持TCP和UDP等2種模式,exec(命令執行)等數據源上收集數據的能力。它使用一個簡單的可擴展數據模型,該模型可用於在線分析應用程序。
15、Ambari
Apache Ambari的功能就是創建、管理、監視Hadoop的集群,這里的Hadoop是廣義,指的是 Hadoop 整個生態圈(例如 Hive、Hbase、Sqoop、Zookeeper等)。用一句話來說,Ambari 就是為了讓 Hadoop 以及相關的大數據軟件更容易使用的一個工具。隨着Ambari為操作控制提供一致,安全的平台,Hadoop管理變得更加簡單。
16、Oozie
Apache Oozie是用於管理Hadoop作業的工作流調度程序系統。 Oozie將多個作業依次組合為一個邏輯工作單元。 Oozie框架與作為架構中心的Apache Yarn完全集成,並支持Apache MapReduce、Hive、Sqoop等Hadoop技術中需要調度的作業。
以上是Hadoop技術生態圈的講解,但這里還沒有完,因為在目前業界使用最廣泛的大數據技術中,還有幾個技術不得不提一下。
17、Spark
Apache Spark是一個基於Scala語言編寫的分布式計算框架,最初是由加州大學伯克利分銷AMPLab實驗室開發,相對於MapReduce計算框架,它減少了內存與磁盤的IO操作,從而提高了計算時間。Spark采用了基於內存的運算,將中間數據結果存儲在內存中,方便下次計算調用。該框架的計算速度根據官網的介紹,基於內存的計算中比MapReduce快100倍,基於磁盤的計算中比MapReduce快10倍。Spark內部有五個重要組成部分,分別是Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX。在存在遞歸迭代運算的場景下,Spark非常適合。
18、Elastic Search
Elastic Search是一個基於Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放源碼發布,是一種流行的企業級搜索引擎。Elasticsearch用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。官方客戶端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和許多其他語言中都是可用的。根據DB-Engines的排名顯示,Elasticsearch是最受歡迎的企業搜索引擎,其次是Apache Solr,也是基於Lucene。它的核心算法是倒排索引算法。
19、Kafka
Apache Kafka是一種分布式的,基於發布 / 訂閱的消息系統,采用Java和Scala編寫。該平台為處理即時數據提供了統一、高吞吐、低延遲的服務。目前越來越多的開源分布式處理系統如Cloudera、Apache Storm、Spark都支持與Kafka集成。Kafka是一個消息系統,原本開發自LinkedIn,用作 LinkedIn 的活動流(Activity Stream)和運營數據處理管道(Pipeline)的基礎。現在它已被多家不同類型的公司 作為多種類型的數據管道和消息系統使用。它能夠以時間復雜度為 O(1) 的方式提供消息持久化能力,即使對 TB 級以上數據也能保證常數時間復雜度的訪問性能。它擁有高吞吐率。即使在非常廉價的商用機器上也能做到單機支持每秒 100K 條以上消息的傳輸。它支持 Kafka Server 間的消息分區,及分布式消費,同時保證每個 Partition 內的消息順序傳輸。它同時支持離線數據處理和實時數據處理。最后它還支持在線水平擴展。
20、Flink
Apache Flink是一個框架和分布式處理引擎,用於在無邊界和有邊界數據流上進行有狀態的計算。Flink能在所有常見集群環境中運行,並能以內存速度和任意規模進行計算。Apache Flink 是一個分布式系統,它需要計算資源來執行應用程序。Flink 集成了所有常見的集群資源管理器,例如 Hadoop YARN、 Apache Mesos 和 Kubernetes,但同時也可以作為獨立集群運行。Flink被設計為能夠很好地工作在上述每個資源管理器中,這是通過資源管理器特定(resource-manager-specific)的部署模式實現的。Flink 可以采用與當前資源管理器相適應的方式進行交互。部署 Flink 應用程序時,Flink 會根據應用程序配置的並行性自動標識所需的資源,並從資源管理器請求這些資源。在發生故障的情況下,Flink 通過請求新資源來替換發生故障的容器。提交或控制應用程序的所有通信都是通過 REST 調用進行的,這可以簡化 Flink 與各種環境中的集成。Flink旨在任意規模上運行有狀態流式應用。因此,應用程序被並行化為可能數千個任務,這些任務分布在集群中並發執行。所以應用程序能夠充分利用無盡的 CPU、內存、磁盤和網絡 IO。而且 Flink 很容易維護非常大的應用程序狀態。其異步和增量的檢查點算法對處理延遲產生最小的影響,同時保證精確一次狀態的一致性。
以上就是大數據應用比較廣泛的技術架構的介紹。
最后我想說的是,技術會一直更新演變下去,但核心的思想總是不會改變的,在學習技術的過程中,需要的是對思想的理解與運用,而不是就一個技術而學一個技術。同時,沒有任何一個技術是完美無缺的,只有適合與不適合的區別。在實際的業務場景下,根據公司的實際情況,選擇合適的大數據技術架構完成需求業務才是重中之重。