網(wǎng)站app開發(fā)平臺百度非企渠道開戶
導(dǎo)論
(基于Hadoop的MapReduce的優(yōu)缺點)
MapReduce是一個分布式運算程序的編程框架,是用戶開發(fā)“基于Hadoop的數(shù)據(jù)分析應(yīng)用”的核心框架
MapReduce是一種用于處理大規(guī)模數(shù)據(jù)集的編程模型和計算框架。它將數(shù)據(jù)處理過程分為兩個主要階段:Map階段和Reduce階段。在Map階段,數(shù)據(jù)被分割為多個小塊,并由多個并行運行的Mapper進行處理。在Reduce階段,Mapper的輸出被合并和排序,并由多個并行運行的Reducer進行最終的聚合和計算。MapReduce的優(yōu)缺點如下:
優(yōu)點:
??? 可伸縮性:MapReduce可以處理大規(guī)模的數(shù)據(jù)集,通過將數(shù)據(jù)分割為多個小塊并進行并行處理,可以有效地利用集群的計算資源。它可以在需要處理更大數(shù)據(jù)集時進行水平擴展,而不需要對現(xiàn)有的代碼進行修改。
??? 容錯性:MapReduce具有高度的容錯性。當某個節(jié)點發(fā)生故障時,作業(yè)可以自動重新分配給其他可用的節(jié)點進行處理,從而保證作業(yè)的完成。
??? 靈活性:MapReduce允許開發(fā)人員使用自定義的Mapper和Reducer來處理各種類型的數(shù)據(jù)和計算任務(wù)。它提供了靈活的編程模型,可以根據(jù)具體需求進行定制和擴展。
??? 易于使用:MapReduce提供了高級抽象,隱藏了底層的并行和分布式處理細節(jié)。開發(fā)人員只需要關(guān)注數(shù)據(jù)的轉(zhuǎn)換和計算邏輯,而不需要關(guān)心并發(fā)和分布式算法的實現(xiàn)細節(jié)。
缺點:
??? 適用性有限:MapReduce適用于一些需要進行大規(guī)模數(shù)據(jù)處理和分析的場景,但對于一些需要實時計算和交互式查詢的場景,MapReduce的延遲較高,不太適合。
??? 復(fù)雜性:盡管MapReduce提供了高級抽象,但對于開發(fā)人員來說,編寫和調(diào)試MapReduce作業(yè)仍然是一項復(fù)雜的任務(wù)。需要熟悉MapReduce的編程模型和框架,并理解分布式計算的概念和原理。
??? 磁盤IO開銷:在MapReduce中,數(shù)據(jù)需要在Map和Reduce階段之間進行磁盤IO,這可能會導(dǎo)致性能瓶頸。盡管可以通過合理的數(shù)據(jù)分區(qū)和調(diào)優(yōu)來減少磁盤IO的開銷,但仍然需要考慮和處理數(shù)據(jù)移動和復(fù)制的開銷。
綜上所述,MapReduce是一種適用于大規(guī)模數(shù)據(jù)處理的編程模型和計算框架,具有可伸縮性、容錯性、靈活性和易用性等優(yōu)點。然而,它在實時計算和交互式查詢等場景下的適用性有限,同時開發(fā)和調(diào)試MapReduce作業(yè)的復(fù)雜性也需要考慮
Spark
一.Spark 基礎(chǔ)
1.1 Spark 為何物
Spark 是當今大數(shù)據(jù)領(lǐng)域最活躍、最熱門、最高效的大數(shù)據(jù)通用計算平臺之一。
??? Hadoop 之父 Doug Cutting 指出:Use of MapReduce engine for Big Data projects will decline, replaced by Apache Spark (大數(shù)據(jù)項目的 MapReduce 引擎的使用將下降,由 Apache Spark 取代)。
spark概述
第一階段:Spark最初由美國加州伯克利大學(xué)( UC Berkelcy)的AMP實驗室于2009年開發(fā),是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架,可用于構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序
第二階段:2013年Spark加入Apache孵化器項日后發(fā)展迅猛,如今已成為Apache軟件基金會最重要的三大分布式計算系統(tǒng)開源項目之一( Hadoop磁盤MR離線式、Spark基于內(nèi)存實時數(shù)據(jù)分析框架、Storm數(shù)據(jù)流分析框架 )
第三階段:
1.3Spark的主要特點
Scala簡介
Scala是一門現(xiàn)代的多范式編程語言 ,運行于IAVA平臺(JVM,JAVA虛擬機)并兼容現(xiàn)有的JAVA程序
Scala的特點
① Scala具備強大的并發(fā)性,支持函數(shù)式編程,可以更好地支持分布式系統(tǒng)。
② Scala語法簡潔,能提供優(yōu)雅的API。
③ Scala兼容Java,運行速度快,且能融合到Hadoop生態(tài)圈中。
二.Spark VS Hadoop
盡管 Spark 相對于 Hadoop 而言具有較大優(yōu)勢,但 Spark 并不能完全替代 Hadoop,Spark 主要用于替代Hadoop中的 MapReduce 計算模型。存儲依然可以使用 HDFS,但是中間結(jié)果可以存放在內(nèi)存中;調(diào)度可以使用 Spark 內(nèi)置的,也可以使用更成熟的調(diào)度系統(tǒng) YARN 等。
實際上,Spark 已經(jīng)很好地融入了 Hadoop 生態(tài)圈,并成為其中的重要一員,它可以借助于 YARN 實現(xiàn)資源調(diào)度管理,借助于 HDFS 實現(xiàn)分布式存儲。
此外,Hadoop 可以使用廉價的、異構(gòu)的機器來做分布式存儲與計算,但是,Spark 對硬件的要求稍高一些,對內(nèi)存與 CPU 有一定的要求
Spark生態(tài)系統(tǒng)
在實際應(yīng)用中,大數(shù)據(jù)處理主要包括一下3個類型:
?????? ① 復(fù)雜的批量數(shù)據(jù)處理:時間跨度通常在數(shù)十分鐘到數(shù)小時之間。
?????? ② 基于歷史數(shù)據(jù)的交互式查詢:時間跨度通常在數(shù)十秒到數(shù)分鐘之間。
?????? ③ 基于實時數(shù)據(jù)流的數(shù)據(jù)處理:時間跨度通常在數(shù)百毫秒到數(shù)秒之間。
當同時存在以上三種場景時,就需要同時部署三種不同的軟件
核心組件:
Spark的應(yīng)用場景
?Spark的運行架構(gòu)
1.基本概念
在具體講解Spark運行架構(gòu)之前,需要先了解以下7個重要的概念。
① RDD:是彈性分布式數(shù)據(jù)集的英文縮寫,是分布式內(nèi)存的一個抽象概念,提供了一種高度受限的共享內(nèi)存模型。
② DAG:是有向無環(huán)圖的英文縮寫,反映RDD之間的依賴關(guān)系。
③ Executor:是運行在工作節(jié)點上的一個進程,負責運行任務(wù),并為應(yīng)用程序存儲數(shù)據(jù)。
④ 應(yīng)用:用戶編寫的Spark應(yīng)用程序。
⑤ 任務(wù):運行在Executor上的工作單元。
⑥ 作業(yè):一個作業(yè)包含多個RDD及作用于相應(yīng)RDD上的各種操作。
⑦ 階段:是作業(yè)的基本調(diào)度單位,一個作業(yè)會分為多組任務(wù),每組任務(wù)被稱為“階段”,或者也被稱為“任務(wù)集”
2.Spark運行架構(gòu)
(1)當一個Spark應(yīng)用被提交時,首先需要為這個應(yīng)用構(gòu)建起基本的運行環(huán)境,即由任務(wù)控制節(jié)點創(chuàng)建一個SparkContext,由SparkContext負責和資源管理器的通信以及進行資源的申請、任務(wù)的分配和監(jiān)控等。SparkContext 會向資源管理器注冊并申請運行Executor的資源。
(2)資源管理器為Executor分配資源,并啟動Executor進程,Executor運行情況將隨著“心跳”發(fā)送到資源管理器上。
(3)SparkContext 根據(jù) RDD 的依賴關(guān)系構(gòu)建 DAG 圖,DAG 圖提交給 DAG 調(diào)度器進行解析,將DAG圖分解成多個“階段”(每個階段都是一個任務(wù)集),并且計算出各個階段之間的依賴關(guān)系,然后把一個個“任務(wù)集”提交給底層的任務(wù)調(diào)度器進行處理;Executor 向 SparkContext 申請任務(wù),任務(wù)調(diào)度器將任務(wù)分發(fā)給 Executor 運行,同時SparkContext將應(yīng)用程序代碼發(fā)放給Executor。
(4)任務(wù)在Executor上運行,把執(zhí)行結(jié)果反饋給任務(wù)調(diào)度器,然后反饋給DAG調(diào)度器,運行完畢后寫入數(shù)據(jù)并釋放所有資源。
Spark運行架構(gòu)特點:
1.每個application都有自己專屬的Executor進程,并且該進程在application運行期間一直駐留,executor進程以多線程的方式運行Task
2.Spark運行過程與資源管理無關(guān),子要能夠獲取Executor進程并保持通信即可
3.Task采用了數(shù)據(jù)本地性和推測執(zhí)行等優(yōu)化機制,實現(xiàn)“計算向數(shù)據(jù)靠攏”
核心-RDD
1.設(shè)計背景
1.許多迭代式算法《比如機器學(xué)習(xí)、圖算法等)和交互式數(shù)據(jù)挖掘工具,共同之處是,不同計算階段之間會重用中間結(jié)果
2.目前的MapReduce框架都是把中間結(jié)果寫入到磁盤中,帶來大量的數(shù)據(jù)復(fù)制、磁盤Io和序列化開銷
3.RDD就是為了滿足這種需求而出現(xiàn)的,它提供了一個抽象的數(shù)據(jù)結(jié)構(gòu)
4.我們不必擔心底層數(shù)據(jù)的分布式持性,只需將具體的應(yīng)用邏輯表達為一系列轉(zhuǎn)換處理
5.不同RDD之間的轉(zhuǎn)換操作形成依賴關(guān)系,可以實現(xiàn)管道化,避免中間數(shù)據(jù)存儲
RDD概念
1.一個RDD就是一個分布式對象集合,本質(zhì)上是一個只讀的分區(qū)記錄集合,不同節(jié)點上進行并行計算
2.RDD提供了一種高度受限的共享內(nèi)存模型,RDD是只讀的記錄分區(qū)集合,不能直接修改,只能通過在轉(zhuǎn)換的過程中改
RDD典型的執(zhí)行過程如下
優(yōu)點:惰性調(diào)用,管道化,避免同步等待,不需要保存中間結(jié)果,每次操變得簡單
RDD特性
1.高效的容錯性
現(xiàn)有容錯機制:數(shù)據(jù)復(fù)制或者記錄日志RDD具有天生的容錯性:血緣關(guān)系,重新計算丟失分區(qū),無需回滾系統(tǒng),重算過程在不同節(jié)點之間并行,只記錄粗粒度的操作
2.中間結(jié)果持久化到內(nèi)存,數(shù)據(jù)在內(nèi)存中的多個RDD操作直接按進行傳遞,避免了不必要的讀寫磁盤開銷
3.存放的數(shù)據(jù)可以是JAVA對象,避免了不必要的對象序列化和反序列化
RDD之間的依賴關(guān)系
父RDD的一個分區(qū)只被一個子RDD的一個分區(qū)所使用就是窄依賴,否則就是寬依賴。
階段的劃分
RDD運行過程
過上述對RDD概念、依賴關(guān)系和Stage劃分的介紹,結(jié)合之前介紹的Spark運行基本流程,再總結(jié)一下RDD在Spark架構(gòu)中的運行過程:
??? (1)創(chuàng)建RDD對象;
??? (2)SparkContext負責計算RDD之間的依賴關(guān)系,構(gòu)建DAG;
??? (3)DAGScheduler負責把DAG圖分解成多個Stage,每個Stage中包含了多個Task,每個Task會被TaskScheduler分發(fā)給各個WorkerNode上的Executor去執(zhí)行。