一文學會Hadoop與Spark等大數(shù)據框架知識
海量數(shù)據的存儲問題很早就已經出現(xiàn)了,一些行業(yè)或者部門因為歷史的積累,數(shù)據量也達到了一定的級別。很早以前,當一臺電腦無法存儲這么龐大的數(shù)據時,采用的解決方案是使用NFS(網絡文件系統(tǒng))將數(shù)據分開存儲。但是這種方法無法充分利用多臺計算機同時進行分析數(shù)據。
一個實際的需求場景:日志分析
日志分析是對日志中的每一個用戶的流量進行匯總求和。對于一個日志文件,如果只有這么幾行數(shù)據,我們一般會采用這樣的處理方式
- 讀取一行日志
- 抽取手機號和流量字段
- 累加到HashMap中
- 遍歷輸出結果
如果數(shù)據量變得很大呢,比如一個日志文件里面有幾個GB數(shù)據,仍然一行一行去讀,那么就會因為磁盤的IO瓶頸導致效率太低,速度太慢。如果一次性加載到內存,那么就會因為單臺計算機的內存空間有限而導致內存溢出。如果將中間結果全部緩存到HashMap中,那么也會因為單臺計算機的內存空間有限而導致內存溢出??梢赃x擇采用多線程處理,但是依然無法改變資源瓶頸的現(xiàn)實,因為一臺計算器的CPU資源,內存資源,磁盤IO瓶頸是定,創(chuàng)建再多的線程也無法改變這個現(xiàn)實。
解決思路一:縱向擴展
升級硬件,提高單機性能(增加內存,增強CPU、用更高性能的磁盤(如固態(tài)硬盤),比如可以購買IBM的高端服務器。這種方法簡單易行,但單臺計算機的擴展空間有限,CPU、內存、磁盤再怎么擴展也是有限的,無法無限擴展。除此之外,成本較高,高端服務器常常非常昂貴,幾百萬甚至上千萬一臺,一般的小公司承受不起這樣高昂的成本。
解決思路二:橫向擴展:
用多臺節(jié)點分布式集群處理 ,通過增加節(jié)點數(shù)量提高處理能力,這里說的節(jié)點指的就是一臺計算機。其思想為任務分攤,通過協(xié)作來實現(xiàn)單節(jié)點無法實現(xiàn)的任務,且成本相對低(可采用普通機器) 、易于線性擴展。但是其系統(tǒng)復雜度增加,我們要將我們的web應用部署到每一個節(jié)點上面,而多個節(jié)點協(xié)同工作時就要考慮:如何調度資源、任務如何監(jiān)控、中間結果如何調度、系統(tǒng)如何容錯、如何實現(xiàn)眾多節(jié)點間的協(xié)調等問題。
Hadoop
Hadoop是一個開源的可運行于大規(guī)模集群上的分布式文件系統(tǒng)和運行處理基礎框架。其擅長于在廉價機器搭建的集群上進行海量數(shù)據(結構化與非結構化)的存儲與離線處理。Hadoop就是一門用來處理大數(shù)據的技術,就是用來解決上述提到的分布式計算里面的5個技術難題的。
Hadoop 由 Apache Software Foundation 公司于 2005 年秋天作為 Lucene 的子 項目 Nutch 的一部分正式引入。它受到最先由 Google Lab 開發(fā)的 MapReduce 和 Google File System 的啟發(fā)。2006 年 3 月份,MapReduce 和 Nutch Distributed File System (NDFS) 分別被納入稱為 Hadoop 的項目中?! adoop 是最受歡迎的在 Internet 上對搜索關鍵字進行內容分類的工具,但它也可以解決許多要求極大伸縮性的問題。例如,如果您要 grep 一個 10TB 的巨型文件,會出現(xiàn)什么情況?在傳統(tǒng)的系統(tǒng)上,這將需要很長的時間。但是 Hadoop 在設計時就考慮到這些問題,因此能大大提高效率。
Hadoop的生態(tài)壞境
Hadoop是一個能夠對大量數(shù)據進行分布式處理的軟件框架。具有可靠、高效、可伸縮的特點。Hadoop的核心是HDFS和Mapreduce,hadoop2.0還包括YARN。
HDFS(Hadoop分布式文件系統(tǒng))
HDFS(Hadoop Distributed File System)源自于Google的GFS論文,發(fā)表于2003年10月,HDFS是GFS克隆版。是Hadoop體系中數(shù)據存儲管理的基礎。它是一個高度容錯的系統(tǒng),能檢測和應對硬件故障,用于在低成本的通用硬件上運行。HDFS簡化了文件的一致性模型,通過流式數(shù)據訪問,提供高吞吐量應用程序數(shù)據訪問功能,適合帶有大型數(shù)據集的應用程序。
- Client:切分文件;訪問HDFS;與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數(shù)據。
- NameNode:Master節(jié)點,在hadoop1.X中只有一個,管理HDFS的名稱空間和數(shù)據塊映射信息,配置副本策略,處理客戶端請求。
- DataNode:Slave節(jié)點,存儲實際的數(shù)據,匯報存儲信息給NameNode。
- Secondary NameNode:輔助NameNode,分擔其工作量;定期合并fsimage和fsedits,推送給NameNode;緊急情況下,可輔助恢復NameNode,但Secondary NameNode并非NameNode的熱備。
YARN是一種 Hadoop 資源管理器,它是一個通用資源管理系統(tǒng),可為上層應用提供統(tǒng)一的資源管理和調度,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據共享等方面帶來了巨大好處。
#####Hadoop YARN產生背景
直接源于MRv1在幾個方面的缺陷:
- 擴展性受限
- 單點故障
- 難以支持MR之外的計算
除此之外,多計算框架各自為戰(zhàn),數(shù)據共享困難。比如:MapReduce(離線計算框架)、Storm(實時計算框架)、Spark(內存計算框架)。
#####Hadoop YARN基本架構
ResourceManager
- 處理客戶端請求
- 啟動/監(jiān)控ApplicationMaster
- 監(jiān)控NodeManager
- 資源分配與調度
NodeManager
- 單個節(jié)點上的資源管理
- 處理來自ResourceManager的命令
- 處理來自ApplicationMaster的命令
ApplicationMaster
- 數(shù)據切分
- 為應用程序申請資源,并分配給內部任務
- 任務監(jiān)控與容錯
Hadoop YARN調度框架
Hadoop YARN采用雙層調度框架。首先,RM將資源分配給AM。其次,AM再將資源進一步分配給各個Task。YARN與“all or nothing”策略不同(Apache Mesos),其遵循基于資源預留的調度策略,當資源不夠時,會為Task預留,直到資源充足。
運行在YARN上的計算框架
- 離線計算框架:MapReduce
- DAG計算框架:Tez
- 流式計算框架:Storm
- 內存計算框架:Spark
- 圖計算框架:Giraph、GraphLib
Hadoop MapReduce是google MapReduce 克隆版。
MapReduce是一種計算模型,用以進行大數(shù)據量的計算。其中Map對數(shù)據集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同“鍵”的所有“值”進行規(guī)約,以得到最終結果。MapReduce這樣的功能劃分,非常適合在大量計算機組成的分布式并行環(huán)境里進行數(shù)據處理。
- JobTracker:Master節(jié)點,只有一個,管理所有作業(yè),作業(yè)/任務的監(jiān)控、錯誤處理等;將任務分解成一系列任務,并分派給TaskTracker。
- TaskTracker:Slave節(jié)點,運行Map Task和Reduce Task;并與JobTracker交互,匯報任務狀態(tài)。
- Map Task:解析每條數(shù)據記錄,傳遞給用戶編寫的map(),并執(zhí)行,將輸出結果寫入本地磁盤(如果為map-only作業(yè),直接寫入HDFS)。
- Reducer Task:從Map Task的執(zhí)行結果中,遠程讀取輸入數(shù)據,對數(shù)據進行排序,將數(shù)據按照分組傳遞給用戶編寫的reduce函數(shù)執(zhí)行。
Hive(基于Hadoop的數(shù)據倉庫)
Hive由facebook開源,最初用于解決海量結構化的日志數(shù)據統(tǒng)計問題。Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化為MapReduce任務在Hadoop上執(zhí)行,通常用于離線分析。
HBase(分布式列存數(shù)據庫)
Hbae源自Google的Bigtable論文,發(fā)表于2006年11月,HBase是Google Bigtable克隆版。HBase是一個針對結構化數(shù)據的可伸縮、高可靠、高性能、分布式和面向列的動態(tài)模式數(shù)據庫。和傳統(tǒng)關系數(shù)據庫不同,HBase采用了BigTable的數(shù)據模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關鍵字、列關鍵字和時間戳構成。HBase提供了對大規(guī)模數(shù)據的隨機、實時讀寫訪問,同時,HBase中保存的數(shù)據可以使用MapReduce來處理,它將數(shù)據存儲和并行計算完美地結合在一起。
HBase和Hive在大數(shù)據架構中處在不同位置,HBase主要解決實時數(shù)據查詢問題,Hive主要解決數(shù)據處理和計算問題,一般是配合使用。
Zookeeper(分布式協(xié)作服務)
源自Google的Chubby論文,發(fā)表于2006年11月,Zookeeper是Chubby克隆版
解決分布式環(huán)境下的數(shù)據管理問題:統(tǒng)一命名,狀態(tài)同步,集群管理,配置同步等。
Sqoop(數(shù)據同步工具)
Sqoop是SQL-to-Hadoop的縮寫,主要用于傳統(tǒng)數(shù)據庫和Hadoop之前傳輸數(shù)據。數(shù)據的導入和導出本質上是Mapreduce程序,充分利用了MR的并行化和容錯性。
Pig(基于Hadoop的數(shù)據流系統(tǒng))
由yahoo!開源,設計動機是提供一種基于MapReduce的ad-hoc(計算在query時發(fā)生)數(shù)據分析工具。其定義了一種數(shù)據流語言—Pig Latin,將腳本轉換為MapReduce任務在Hadoop上執(zhí)行,通常用于進行離線分析。
Spark
Spark是UC Berkeley AMPLab開發(fā)的是一種計算框架,分布式資源工作交由集群管理軟件(Mesos、YARN) 。
###Spark的特點
- 先進架構
- Spark采用Scala語言編寫,底層采用了actor model的akka作為通訊框架,代碼十分簡潔高效。
- 基于DAG圖的執(zhí)行引擎,減少多次計算之間中間結果寫到Hdfs的開銷。
- 建立在統(tǒng)一抽象的RDD(分布式內存抽象)之上,使得它可以以基本一致的方式應對不同的大數(shù)據處理場景。
- 高效
- 提供Cache機制來支持需要反復迭代的計算或者多次數(shù)據共享,減少數(shù)據讀取的IO開銷。
- 與Hadoop的MapReduce相比,Spark基于內存的運算比MR要快100倍;而基于硬盤的運算也要快10倍!
- 易用
- Spark提供廣泛的數(shù)據集操作類型(20+種),不像Hadoop只提供了Map和Reduce兩種操作。
- Spark支持Java,Python和Scala API,支持交互式的Python和Scala的shell。
- 提供整體解決方案
- 以其RDD模型的強大表現(xiàn)能力,逐漸形成了一套自己的生態(tài)圈,提供了full-stack的解決方案。
- 主要包括Spark內存中批處理,Spark SQL交互式查詢,Spark Streaming流式計算, GraphX和MLlib提供的常用圖計算和機器學習算法。
- 與Hadoop無縫連接
- Spark可以使用YARN作為它的集群管理器
- 讀取HDFS,HBase等一切Hadoop的數(shù)據
Spark整體架構
Spark提供了多種高級工具,如: Shark SQL應用于即席查詢(Ad-hoc query)、Spark Streaming應用于流式計算、 MLlib應用于機器學習、GraphX應用于圖處理。Spark還可以基于自帶的standalone集群管理器獨立運行,也可以部署在Apache Mesos 和 Hadoop YARN 等集群管理器上運行。Spark可以訪問存儲在HDFS、 Hbase、Cassandra、Amazon S3、本地文件系統(tǒng)等等上的數(shù)據,Spark支持文本文件,序列文件,以及任何Hadoop的InputFormat。
Spark核心概念
Spark任務提供多層分解的概念,Spark組件將用戶的應用程序分解為內部執(zhí)行任務并提供執(zhí)行容器,資源管理為spark組件提供資源管理和調度。
Spark任務
- 應用程序:由一個driver program和多個job構成
- job:由多個stage組成
- stage:對應一個taskset
- taskset:對應一組關聯(lián)的相互之間沒有shuffle依賴關系的task組成。
- task:任務最小的工作單元
- Spark組件
- Driver Program (驅動程序) :Spark 的核心組件
- 構建SparkContext(Spark應用的入口,它負責和整個集群的交互,創(chuàng)建需要的變量,還包含集群的配置信息等)
- 將用戶提交的job轉換為DAG圖(類似數(shù)據處理的流程圖)
- 根據策略將DAG圖劃分為多個stage,根據分區(qū)從而生成一系列tasks
- 根據tasks要求向資源管理器申請資源
- 提交任務并檢測任務狀態(tài)
- Executor
- 真正執(zhí)行task的單元,一個Worker Node上可以有多個Executor
- 資資源管理組件
- YARN(通用):Master/Slave結構
- Resource Manager(RM):全局的資源管理器,負責系統(tǒng)的資源管理和分配
- Node Manager(NM):每個節(jié)點上的資源和任務管理器
- Application Master(AM):每個應用程序都有一個,負責任務的調度和監(jiān)視,并與RM調度器協(xié)商為任務獲取資源。
- Standalone(Spark自帶):Master/Slave結構
- Master:類似于YARN的RM
- Worker:類似于YARN的NM
Spark端到端流程
Spark的Driver Program (簡稱Driver)包含用戶的應用程序,Driver完成task的解析和生成。
- Driver向Cluster Manager(集群資源管理器)申請運行task需要的資源。
- 集群資源管理器為task分配滿足要求的節(jié)點,并在節(jié)點按照要求創(chuàng)建Executor
- 創(chuàng)建的Executor向Driver注冊。
- Driver將Spark應用程序的代碼和文件傳送給分配的Executor
- Executor運行task,運行完之后將結果返回給Driver或者寫入HDFS或其他介質。
Spark流程
Spark on Standalone
Master和Worker是Standalone的角色,Driver和Executor是Spark的角色。Master負責分配資源,分配Driver和Executor,讓Worker啟動Driver和Executor,只管理到Executor層,不涉及任務。Driver負責生成task,并與Executor通信,進行任務的調度和結果跟蹤,不涉及資源。
Driver運行在Worker
- 客戶端把作業(yè)發(fā)布到Master
- Master讓一個Worker啟動Driver,并將作業(yè)推送給Driver
- Driver進程生成一系列task
- Driver向Master申請資源
- Master讓調度的Worker啟動Exeuctor
- Exeuctor啟動后向Driver注冊。
- Driver將task調度到Exeuctor執(zhí)行。
- Executor執(zhí)行結果寫入文件或返回Driver
- 客戶端啟動后直接運行用戶程序,啟動Driver
- Driver進程生成一系列task
- Driver向Master申請資源
- Master讓調度的Worker啟動Exeuctor
- Exeuctor啟動后向Driver注冊。
- Driver將task調度到Exeuctor執(zhí)行。
- Executor執(zhí)行結果寫入文件或返回Driver
Spark的核心組件
Spark的核心組件包括RDD、Scheduler、Storage、Shuffle四部分:
- RDD是Spark最核心最精髓的部分,Spark將所有數(shù)據都抽象成RDD。
- Scheduler是Spark的調度機制,分為DAGScheduler和TaskScheduler。
- Storage模塊主要管理緩存后的RDD、shuffle中間結果數(shù)據和broadcast數(shù)據
- Shuffle分為Hash方式和Sort方式,兩種方式的shuffle中間數(shù)據都寫本地盤
RDD(Resilient Distributed Datasets)
RDD是彈性分布式數(shù)據集,是只讀的分區(qū)記錄集合。每個RDD有5個主要的屬性:
- 一組分片(Partition):數(shù)據集的最基本組成單位
- 一個計算每個分片的函數(shù):對于給定的數(shù)據集,需要做哪些計算
- 依賴(Dependencies):RDD的依賴關系,描述了RDD之間的lineage
- preferredLocations(可選):對于data partition的位置偏好
- partitioner(可選):對于計算出來的數(shù)據結果如何分發(fā)
作用于RDD上的Operation分為轉換(transformantion)和動作(action)。 Spark中的所有“轉換”都是惰性的,在執(zhí)行“轉換”操作,并不會提交Job,只有在執(zhí)行“動作”操作,所有operation才會被提交到cluster中真正的被執(zhí)行。這樣可以大大提升系統(tǒng)的性能。
- 轉換:從現(xiàn)有的數(shù)據集創(chuàng)建一個新的數(shù)據集即數(shù)據集中的內容會發(fā)生更改,由數(shù)據集A轉換成為數(shù)據集B
- 動作:在數(shù)據集上運行計算后,返回一個值給驅動程序。 即數(shù)據集中的內容會被歸約為一個具體的數(shù)值(Scala標量、集合類型的數(shù)據或存儲)。
RDD擁有的操作比MR豐富的多,不僅僅包括Map、Reduce操作,還包括右圖的filter、sort、join、save、count等操作,所以Spark比MR更容易方便完成更復雜的任務。
RDD持久化
默認情況下,每一個轉換過的RDD都會在它之上執(zhí)行一個動作時被重新計算。如果RDD只被使用一次或者很少次,不需要持久化。如果RDD被重復使用或者計算其代價很高,才考慮持久化。另外,shuffle后生成的RDD盡量持久化,因為shuffle代價太高。RDD被緩存后,Spark將會在集群中,保存相關元數(shù)據,下次查詢這個RDD時,它將能更快速訪問,不需要計算。如果持久化無謂的RDD,會浪費內存(或硬盤)空間,反而降低系統(tǒng)整體性能
RDD依賴關系
RDD只能基于在穩(wěn)定物理存儲中的數(shù)據集和其他已有的RDD上執(zhí)行確定性操作來創(chuàng)建。能從其他RDD通過確定操作創(chuàng)建新的RDD的原因是RDD含有從其他RDD衍生(即計算)出本RDD的相關信息(即Lineage)。Dependency代表了RDD之間的依賴關系,即血緣(Lineage),分為窄依賴和寬依賴:
- 窄依賴:一個父RDD最多被一個子RDD用在一個集群節(jié)點上管道式執(zhí)行。比如map、filter、union等
- 寬依賴:子RDD的分區(qū)依賴于父RDD的所有分區(qū),這是因為shuffle類操作要求所有父分區(qū)可用。比如groupByKey、reduceByKey、 sort、partitionBy等
根據RDD依賴關系的不同,Spark將每一個job分為不同的stage,stage之間的依賴關系形成了DAG圖。對于窄依賴,Spark將其盡量劃分在同一個stage中,因為它們可以進行流水線計算,而寬依賴往往意味著shuffle操作,這也是Spark劃分stage的主要邊界。
寬/窄依賴的概念不止用在stage劃分中,對容錯也很有用。若Transformation操作中間發(fā)生計算失敗,如果運算是窄依賴,只要把丟失的父RDD分區(qū)重算即可,跟其他節(jié)點沒有依賴,這樣可以大大加快場景恢復的開銷,但如果運算是寬依賴,則需要父RDD的所有分區(qū)都存在, 重算代價就較高。當Lineage特別長時或者有寬依賴時,主動調用 checkpoint把當前數(shù)據寫入穩(wěn)定存儲,作為檢查點。
Scheduler
Scheduler模塊作為Spark最核心的模塊之一,充分體現(xiàn)了Spark與MapReduce的不同之處,體現(xiàn)了Spark DAG思想的精巧和設計的優(yōu)雅。Scheduler模塊分為兩大主要部分,DAGScheduler和TaskScheduler。
DAGScheduler把一個spark作業(yè)轉換成成stage的DAG(Directed Acyclic Graph有向無環(huán)圖),根據RDD和stage之間的關系,找出開銷最小的調度方法,然后把stage以TaskSet的形式提交給TaskScheduler。TaskScheduler模塊用于與DAGScheduler交互,負責任務的具體調度和運行。任務調度模塊基于兩個Trait:TaskScheduler和 SchedulerBackend。
Storage
Storage模塊主要分為兩層:
- 通信層:Storage模塊采用的是master-slave結構來實現(xiàn)通信層,master和slave之間傳輸控制信息、狀態(tài)信息,這些都是通過通信層來實現(xiàn)的。
- 存儲層:Storage模塊需要把數(shù)據存儲到disk或是memory上面,有可能還需replicate到遠端,這都是由存儲層來實現(xiàn)和提供相應接口。
Storage模塊提供了統(tǒng)一的操作類BlockManager,外部類與storage模塊打交道都需要通過調用BlockManager相應接口來實現(xiàn)。Storage模塊存取的最小單位是數(shù)據塊(Block),Block與RDD中的Partition一一對應,所以所有的轉換或動作操作最終都是對Block進行操作。
Shuffle
Shuffle 中Map任務產生的結果會根據所設置的partitioner算法填充到當前執(zhí)行任務所在機器的每個桶中。Reduce任務啟動時時,會根據任務的ID,所依賴的Map任務ID以及MapStatus從遠端或本地的BlockManager獲取相應的數(shù)據作為輸入進行處理。Shuffle數(shù)據必須持久化磁盤,不能緩存在內存。
Spark之上提供了四種應用庫:
- Spark SQL 是為處理結構化數(shù)據而設計的模塊
- Spark Streaming 可以很容易地創(chuàng)建可擴展和容錯性的流式應用
- MLlib 是Spark的可擴展機器學習庫
- GraphX 是Spark的并行圖計算API
以上便是對Hadoop、Spark的一些淺顯的介紹。事實上,解決大數(shù)據處理相關的問題,往往要經過數(shù)據收集(Flume、Kafka、Sqoop)、數(shù)據存儲(HDFS、HBase)、資源管理(YARN)、計算(MapReduce、Spark)、數(shù)據分析(Pandas、NumPy、R)、數(shù)據可視化(Echart、Tableau)等環(huán)節(jié)。各個環(huán)節(jié)都有其相應的工具,Hadoop和Spark就是大數(shù)據處理流程中非常常用的兩個框架。
到此這篇關于一文學會Hadoop與Spark等大數(shù)據框架知識的文章就介紹到這了,更多相關Hadoop與Spark大數(shù)據內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
2022最新騰訊輕量云?debian?10?安裝pve教程詳解
這篇文章主要介紹了騰訊輕量云?debian?10?安裝pve教程?2022,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10深入解析HetuEngine實現(xiàn)On Yarn原理
這篇文章主要介紹了HetuEngine實現(xiàn)On Yarn原理,介紹了HetuEngine On Yarn的原理,其實現(xiàn)主要是借助了Yarn Service提供的能力,感興趣的朋友一起通過本文學習下2022-01-01