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