大數據技術棧
Hadoop 歷史:
https://www.jikexueyuan.com/course/677_1.html?ss=1
1. Google大數據與Hadoop對比
功能 | Hadoop | |
---|---|---|
存儲 | GFS | HDFS |
計算 | MapReduce | MapReduce |
查詢 | BigTable | HBase |
2. 大數據分類
2.1 根據數據類型分類
2.1.1 結構化數據
能夠用數據或統一的結構加以表示,人們稱之為結構化數據,如數字、符號。傳統的關系數據模型,行數據,存儲于數據庫,可用二維表結構表示。
2.1.2 半結構化數據
所謂半結構化數據,就是介于完全結構化數據(如關系型數據庫,面向對象數據庫中的數據)和完全無結構的數據(如聲音、圖像文件等)之間的數據,XML、HTML文檔就屬于半結構化數據。它一般是自描述的,數據的結構和內容混在一起,沒有明顯的區分。
2.1.3 非結構化數據
非結構化數據庫是指其字段長度可變,并且每隔字段的記錄又可以由可重復或不可重復的子字段構成的數據庫,用它不僅可以處理結構化數據(如數字、符號等信息)而且更適合處理非結構化數據(全文文本,圖像,聲音,影視,超媒體等信息)。
參考鏈接:
2.2 根據處理時間跨度要求分類
2.2.1 流式大數據
基于實時數據流的處理,通常的時間跨度在數百毫秒到數秒之間
流式(streaming)大數據,又被稱為實時大數據。
流數據是一組順序、大量、快速、連續到達的數據序列,一般情況下,數據流可被視為一個隨時間延續而無限增長的動態數據集合。應用于網絡監控、傳感器網絡、航空航天、氣象測控和金融服務等領域。
2.2.1.1 流處理
流是一種數據傳送技術,它把客戶端數據變成一個穩定的流。正是由于數據傳送呈現連續不停的形態,所以流引擎需要連續不斷處理數據
流處理的主要應用場景:金融領域和電信領域
流處理系統會對隨時進入系統的數據進行計算。相比批處理模式,這是一種截然不同的處理方式。流處理方式無需針對整個數據集執行操作,而是對通過系統傳輸的每個數據項執行操作。
2.2.2 批式大數據
復雜的批量數據處理,通常的時間跨度在幾分鐘到數小時之間
批式(batch)大數據,又被稱為歷史大數據。
2.2.2.1 批處理
批處理主要操作大容量靜態數據集,并在計算過程完成后返回結果。
3. 大數據技術產品
3.1 流處理大數據技術
Storm、Spark Streaming、Flink 這類的大數據技術是針對實時的數據進行計算,比如攝像頭實時采集的數據、實時的訂單數據等,數據實時流動進來,所以也叫流處理大數據技術。
3.1.1 Apache Storm
Apache Storm 的前身是 Twitter Storm 平臺,目前已經歸于 Apache 基金會管轄。
Apache Storm 是一個免費開源的分布式實時計算系統。簡化了流數據的可靠處理,像 Hadoop 一樣實現實時批處理。Storm 很簡單,可用于任意編程語言。Apache Storm 采用 Clojure 開發。
Storm 有很多應用場景,包括實時數據分析、聯機學習、持續計算、分布式 RPC、ETL 等。Storm 速度非???,一個測試在單節點上實現每秒一百萬的組處理。
3.1.2 Spark Streaming
Spark Streaming是一種構建在Spark上的實時計算框架,它擴展了Spark處理大規模流式數據的能力。
Spark Streaming的基本原理是將輸入數據流以時間片(秒級)為單位進行拆分,然后以類似批處理的方式處理每個時間片數據
3.1.3 Apache Flink
Apache Flink是一種可以處理批處理任務的流處理框架。該技術可將批處理數據視作具備有限邊界的數據流,借此將批處理任務作為流處理的子集加以處理。為所有處理任務采取流處理為先的方法會產生一系列有趣的副作用。
這種流處理為先的方法也叫做Kappa架構,與之相對的是更加被廣為人知的Lambda架構(該架構中使用批處理作為主要處理方法,使用流作為補充并提供早期未經提煉的結果)。Kappa架構中會對一切進行流處理,借此對模型進行簡化,而這一切是在最近流處理引擎逐漸成熟后才可行的。
Flink是一款分布式的計算引擎,它可以用來做批處理,即處理靜態的數據集、歷史的數據集;也可以用來做流處理,即實時地處理一些實時數據流,實時地產生數據的結果;也可以用來做一些基于事件的應用,比如說滴滴通過Flink CEP實現實時監測用戶及司機的行為流來判斷用戶或司機的行為是否正當。
參考鏈接:
http://bigdata.51cto.com/art/201810/585922.htm#topx
http://bigdata.51cto.com/art/201807/579698.htm
3.1.4 阿里 Blink
阿里巴巴基于 Flink 的內部版本,現已開源,阿里正式向 Apache Flink 貢獻了 Blink 源碼。
雖然現在Blink在阿里內部用的最多的場景主要還是在流計算,但是在批計算場景也有不少業務上線使用了。
參考鏈接:https://mp.weixin.qq.com/s/6_4l4zo3-FD-NF3Lmr0BxQ
Blink on GitHub:https://github.com/apache/flink/tree/blink
3.1.5 Apache Samza
Samza是近日由LinkedIn開源的一項技術,它是一個分布式流處理框架,它是基于Kafka消息隊列來實現類實時的流式數據處理的,非常像Twitter的流處理系統Storm。不同的是Samza基于Hadoop,而且使用了LinkedIn自家的Kafka分布式消息系統,并使用資源管理器Apache Hadoop YARN實現容錯處理、處理器隔離、安全性和資源管理。
Apache Samza是一種與Apache Kafka消息系統緊密綁定的流處理框架。雖然Kafka可用于很多流處理系統,但按照設計,Samza可以更好地發揮Kafka獨特的架構優勢和保障。該技術可通過Kafka提供容錯、緩沖,以及狀態存儲。
Samza可使用YARN作為資源管理器。這意味著默認情況下需要具備Hadoop集群(至少具備HDFS和YARN),但同時也意味著Samza可以直接使用YARN豐富的內建功能。
3.2 批處理大數據技術
MapReduce、Spark、Hive、Spark SQL 這些技術主要用來解決離線大數據的計算,也就是針對歷史數據進行計算分析,比如針對一天的歷史數據計算,一天的數據是一批數據,所以也叫批處理計算。
3.2.1 MapReduce
MapReduce:MapReduce是Hadoop的原生批處理引擎。
MapReduce模式的主要思想是自動將一個大的計算拆解成Map和Reduce
Apache Hadoop及其MapReduce處理引擎提供了一套久經考驗的批處理模型,最適合處理對時間要求不高的非常大規模數據集。
批處理框架:Apache Hadoop
Apache Hadoop是一種專用于批處理的處理框架。
3.2.2 Spark
Spark的中間數據放到內存中,對于迭代運算效率更高。
Spark更適合于迭代運算比較多的ML和DM運算。因為在Spark里面,有RDD的抽象概念。
Spark比Hadoop更通用
Spark提供的數據集操作類型有很多種,不像Hadoop只提供了Map和Reduce兩種操作。比如map, filter, flatMap, sample, groupByKey, reduceByKey, union, join, cogroup, mapValues, sort,partionBy等多種操作類型,Spark把這些操作稱為Transformations。同時還提供Count, collect, reduce, lookup, save等多種actions操作。
3.3 大數據倉庫
3.3.1 Hive
Hive是基于Hadoop的一個數據倉庫工具,通過他可以實現將結構化的數據文件映射為一張數據庫表,并提供簡單的sql查詢功能,同時將sql語句轉換為MapReduce任務進行運行。
3.3.2 Spark SQL
3.3.3 Impala
Impala是對Hive的一個補充,可以實現高效的SQL查詢,但是Impala將整個查詢過程分成了一個執行計劃樹,而不是一連串的MapReduce任務,相比Hive有更好的并發性和避免了不必要的中間sort和shuffle。
3.4 大數據資源管理 Yarn
Yarn,資源調度框架
不管是批處理計算還是流處理計算,都需要龐大的計算資源,需要將計算任務分布到一個大規模的服務器集群上。那么如何管理這些服務器集群的計算資源,如何對一個計算請求進行資源分配,這就是大數據集群資源管理框架 Yarn 的主要作用。各種大數據計算引擎,不管是批處理還是流處理,都可以通過 Yarn 進行資源分配,運行在一個集群中。
Apache Hadoop YARN (Yet Another Resource Negotiator,另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和調度,它的引入為集群在利用率、資源統一管理和數據共享等方面帶來了巨大好處。
YARN是Yet Another Resource Negotiator(另一個資源管理器)的縮寫,可充當Hadoop堆棧的集群協調組件。該組件負責協調并管理底層資源和調度作業的運行。通過充當集群資源的接口,YARN使得用戶能在Hadoop集群中使用比以往的迭代方式運行更多類型的工作負載。
3.5 大數據存儲
3.5.1 大數據文件系統:HDFS
3.5.2 NoSQL:HBase
HBase,Big Table 的開源實現
這里相對比較特殊的是 HBase,作為一個 NoSQL 存儲系統,HBase 的應用場景是滿足在線業務數據存儲訪問需求,通常是 OLTP(在線事務處理)系統的一部分,為了保證在線業務的高可用和資源獨占性,一般是獨立部署自己的集群,和前面的Hadoop 大數據集群分離部署。
與hadoop一樣,Hbase目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。
而Hbase庫是支撐業務的CRUD操作(增加(Create)、讀取(Retrieve)、更新(Update)和刪除(Delete)),各種業務操作下的處理和查詢。
3.6 Zookeeper
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
參考鏈接:
http://www.lxweimin.com/p/5cc07eae1a0chttps://blog.csdn.net/u013547284/article/details/72843867
https://www.oschina.net/p/apache-storm
4. 大數據處理步驟
4.1 數據采集
將應用程序產生的數據和日志等同步到大數據系統中,由于數據源不同,這里的數據同步系統實際上是多個相關系統的組合。數據庫同步通常用Sqoop,日志同步可以選擇Flume,打點采集的數據經過格式化轉換后通過Kafka傳遞。
不同的數據源產生的數據質量可能差別很大,數據庫中的數據也許可以直接導入大數據系統就可以,而日志和爬蟲產生的數據就需要進行大量的清洗、轉化處理才能有效使用。所以數據同步系統實際上承擔著傳統數據倉庫ETL的工作。
對于數據采集主要分為三類,即
4.1.1 結構化數據庫采集
對于結構化數據庫,采用Sqoop是合適的,可以實現結構化數據庫中數據并行批量入庫到hdfs存儲。
4.1.1.1 Sqoop
Sqoop(數據庫 ETL)
關系型數據庫的數據導入到 HDFS 中;
HDFS 數據導入到 Hive。
4.1.2 日志和文件采集
對于日志文件的采集,現在最常用的仍然是flume或chukwa,但是我們要看到如果對于日志文件數據需要進行各種計算處理再入庫的時候,往往flume并不容易處理,這也是為何可以采用Pig來做進一步復雜的data flow和process的原因。
4.1.2.1 Flume
Flume是Cloudera提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。
當前Flume有兩個版本Flume 0.9X版本的統稱Flume-og,Flume1.X版本的統稱Flume-ng。由于Flume-ng經過重大重構,與Flume-og有很大不同,使用時請注意區分。
4.1.3 打點采集的數據
4.1.4 網頁采集
對于網頁采集,前端可以采用Nutch,全文檢索采用lucense,而實際數據存儲最好是入庫到Hbase數據庫。
4.1.4.1 lucense
4.1.4.2 Solr
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似于Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結果。
Solr是一個高性能,采用Java5開發,基于Lucene的全文搜索服務器。同時對其進行了擴展,提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴展并對查詢性能進行了優化,并且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎。
4.2 數據處理
4.3 數據輸出與展示
對于處理得到的數據可以對接主流的BI系統,比如國外的Tableau、Qlikview、PowrerBI等,國內的SmallBI和新興的網易有數(可免費試用)等,將結果進行可視化,用于決策分析;或者回流到線上,支持線上業務的發展。
參考鏈接:
5. 其它
Hadoop+spark正在替代Hadoop+MR成為大數據領域的明星,Cloudera正在積極推動Spark成為Hadoop的默認數據處理引擎。
5.1 Kafka
Apache Kafka是一個高度可擴展的消息傳遞系統,Linkedin用于日志處理的分布式消息隊列;
Q:為什么kafka使用了Scala進行開發?
A:因為當年主R正在學習Scala,所以就用Scala開發了。并且這是他的第一個Scala項目。也正是因為他也在學習階段,所以寫出來的代碼都是按照Java的寫法實現的,這也是為什么Java開發者也能很容易讀懂源碼的原因。
Q:為什么kafka叫kafka?
A:因為主R在開發kafka的時候正在看卡夫卡的《變形記》,所以沒有多想就用了kafka這個名字。同時,因為kafka實際上是以日志的形式記錄消息的,屬于一個書寫者,所以用一位作家的名字命名也是很契合的。
原文鏈接:https://blog.csdn.net/u011291072/article/details/80009928
5.2 Kafka與Flume的異同點
Kafka和flume作為數據采集通道的區別:
將數據從某一個數據源導入HDFS或者HBase,Kafka是一個半成品,需要自己完成消費者程序的編寫,而flume只需要改配置就可以導數據進入HDFS或者HBase,相當于Flume自身包含了消費者程序,不需要程序員去開發。另外,Flume自帶的interceptors也可以用來處理數據,而Kafka如果要處理數據還需要接入外部流處理系統,比如storm,spark等。
所以實際生產中,通常是外部數據源采數據到Kafka,Kafka再通過Flume導數據到HDFS。為什么不直接將外部數據源接入Flume,這是因為Kafka可以實現多生產者和多消費者,可以接入外部各種各樣的數據源,同時Kafka可以同時接入Flume之外的其他數據導入系統,這樣以后擴展更靈活。
5.3 Spark/Shark
UC Berkeley AMP Lab所開源的基于內存的并行計算框架。
5.4 Flume+Kafka+Spark Streaming
Spark Streaming實時流處理項目實戰
分布式日志收集框架Flume
分布式消息隊列Kafka
分布式列式數據庫HBase
Spark Streaming:通過sparkstreaming,可以有效滿足企業實時數據的要求,構建企業發展的實時指標體系。
使用Flume采集日志
將Flume收集到的數據輸出到Kafka
Spark Streaming消費Kafka的數據進行統計
Spark Streaming如何高效的讀寫數據到Hbase
HBase位于結構化存儲層,圍繞HBase,各部件對HBase的支持情況:
Hadoop部件 作用
HDFS 高可靠的底層存儲支持
MapReduce 高性能的計算能力
Zookeeper 穩定服務和failover機制
Pig&Hive 高層語言支持,便于數據統計
Sqoop 提供RDBMS數據導入,便于傳統數據庫向HBase遷移
5.5 高可用性
高可用性H.A.(High Availability)指的是通過盡量縮短因日常維護操作(計劃)和突發的系統崩潰(非計劃)所導致的停機時間,以提高系統和應用的可用性。
5.6 Yarn 和 Zookeeper 之間的關系
分布式系統的問題:
- Resource Management
- Coordination
YARN 相當于政府,負責管理機器資源的分配;
Zookeeper 相當于立法委員會,目標是提供權威的信息給這個國家所有的人。Zookeeper 關注的主要是信息的一致性,管理一些需要在所有人心中保持一致的信息。它雖然常常用來管理哪個節點活著,哪個節點死了這種信息,或是哪個節點該負責什么事兒,但是它還是主要負責管理信息(檔案,法律)的部門,不是民生部門……
參考鏈接:https://blog.csdn.net/laolu1573/article/details/78540508
6. 參考資料
參考鏈接:
https://time.geekbang.org/column/article/71366
https://blog.csdn.net/u012117710/article/details/54091964
https://blog.csdn.net/yusiguyuan/article/details/44160169
https://www.cnblogs.com/yangsy0915/p/4866995.html
MapReduce和YARN區別:https://blog.csdn.net/hahachenchen789/article/details/80527706
尚學堂視頻教程:https://www.bjsxt.com/dashujushipin.html
51CTO視頻教程:http://edu.51cto.com/course/12184.html