精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spark 核心技術(shù)概要與大數(shù)據(jù)生態(tài)圈的演進(jìn)之路

開發(fā) 前端
關(guān)于 能源效率 ,雖然它是計算機(jī)科學(xué)的一個重要議題,但在分布式系統(tǒng)軟件設(shè)計層面,它通常不是首要的優(yōu)化目標(biāo)。主要的節(jié)能工作集中在數(shù)據(jù)中心設(shè)計、硬件(如 CPU 動態(tài)調(diào)頻)和散熱等方面。因為在軟件層面進(jìn)行優(yōu)化的節(jié)能效果,遠(yuǎn)不如在這些物理層面進(jìn)行改進(jìn)來得顯著。

從 MapReduce 的局限到 Spark 的誕生

我們知道,Google 的 MapReduce 框架是大數(shù)據(jù)處理的開山鼻祖,它將復(fù)雜的分布式計算抽象成了簡單的 map 和 reduce 兩個階段,讓工程師可以輕松地在商用硬件集群上處理海量數(shù)據(jù)。但它并非萬能藥。

MapReduce 的核心問題在于其 無狀態(tài) 和 基于磁盤 的設(shè)計。每兩個 MapReduce 作業(yè)之間的數(shù)據(jù)交換,都必須通過一個外部穩(wěn)定存儲系統(tǒng)(比如 HDFS)。這意味著,一個作業(yè)的 reduce 輸出被寫到磁盤,下一個作業(yè)的 map 再從磁盤上把它讀出來。這個過程涉及到大量的磁盤 I/O、數(shù)據(jù)復(fù)制和序列化開銷。

對于只需要“掃一遍”數(shù)據(jù)的簡單 ETL(提取、轉(zhuǎn)換、加載)任務(wù),這沒什么問題。但對于那些需要復(fù)用中間結(jié)果的應(yīng)用——比如多次迭代的機(jī)器學(xué)習(xí)算法(邏輯回歸、K-均值聚類)和交互式數(shù)據(jù)挖掘——MapReduce 就顯得力不從心了。想象一下,一個需要迭代 10 次的 PageRank 算法,用 MapReduce 實現(xiàn)就意味著要執(zhí)行 10 個獨(dú)立的 MapReduce 作業(yè),中間結(jié)果來來回回在磁盤上讀寫 9 次,性能之差可想而知。

為了解決這個問題,學(xué)術(shù)界和工業(yè)界提出了各種專用框架,例如用于迭代圖計算的 Pregel 和用于迭代 MapReduce 的 HaLoop 。但這些系統(tǒng)往往只針對特定計算模式,缺乏通用性。

正是在這個背景下, Spark 應(yīng)運(yùn)而生。它的目標(biāo)是提供一個 通用 的、 高性能 的計算框架,既能優(yōu)雅地處理迭代和交互式任務(wù),又能兼容 MapReduce 擅長的批處理場景。Spark 的核心武器,就是一種名為 彈性分布式數(shù)據(jù)集 (Resilient Distributed Datasets, RDD) 的抽象。


Spark 的誕生本身就是一個傳奇故事。它源于加州大學(xué)伯克利分校的一個研究項目,其主要貢獻(xiàn)者 Matei Zaharia 憑借這項工作贏得了計算機(jī)協(xié)會 (ACM) 的博士論文獎。對于一個博士生來說,創(chuàng)造出如此規(guī)模和影響力的系統(tǒng)是相當(dāng)了不起的成就。如今,Spark 已經(jīng)被全球各大公司廣泛應(yīng)用于生產(chǎn)環(huán)境,你可以從其商業(yè)化公司 Databricks 的客戶列表中一窺其影響力。

Spark 的核心:RDD (彈性分布式數(shù)據(jù)集)

那么,RDD 到底是什么?

從形式上看,一個 RDD 是一個 只讀的 、 被分區(qū)的 記錄集合。你可以把它想象成一個分布在集群成百上千臺機(jī)器內(nèi)存中的一個巨大 List 或 Array,但你不能像操作普通 Array 那樣去修改它的某個元素。

這聽起來限制很大,但正是這些限制賦予了 Spark 強(qiáng)大的能力。讓我們來逐一拆解 RDD 的關(guān)鍵特性:

只讀 (Immutable) 與轉(zhuǎn)換 (Transformations)

有人可能會問:“如果 RDD 是只讀的,那我們怎么進(jìn)行計算呢?” 這就引出了 Spark 的核心編程模型: 轉(zhuǎn)換 (transformation) 。

你不能“修改”一個 RDD,但你可以對一個 RDD 應(yīng)用一個轉(zhuǎn)換操作(比如 mapfilterjoin),然后生成一個 全新的 RDD 。這就像在函數(shù)式編程里,你不會去修改一個傳入的 List,而是返回一個新的、經(jīng)過處理的 List

比如,我們有一個包含了日志文件所有文本行的 lines RDD,我們可以這樣操作:

// errors RDD 是通過對 lines RDD 進(jìn)行 filter 轉(zhuǎn)換得到的
val errors = lines.filter(line => line.startsWith("ERROR"))

在這里,lines RDD 本身沒有任何變化,我們得到的是一個全新的、只包含錯誤信息的 errors RDD。這種“只讀”或稱為 不可變性 (immutability) 的設(shè)計是 Spark 實現(xiàn)廉價、高效容錯機(jī)制的基石。

分區(qū) (Partitioned)

RDD 在物理上是分布式的,它由多個 分區(qū) (partition) 組成,每個分區(qū)是數(shù)據(jù)集的一部分。比如一個 1TB 的 HDFS 文件,在 Spark 中可以被表示為一個 RDD,這個 RDD 可能有 8000 個分區(qū)(例如,每個 HDFS 塊對應(yīng)一個分區(qū))。

這些分區(qū)分布在集群的不同 工作節(jié)點 (Worker) 上,使得計算可以并行進(jìn)行。Spark 的調(diào)度器會盡可能地將計算任務(wù)分配到存儲著對應(yīng)數(shù)據(jù)分區(qū)的節(jié)點上,這被稱為 數(shù)據(jù)本地性 (data locality) ,它可以極大減少網(wǎng)絡(luò)數(shù)據(jù)傳輸,提升性能。


應(yīng)用程序是如何知道一個 RDD 的位置的呢?在驅(qū)動程序 (Driver program) 中,我們用 Scala 的變量名來指代 RDD 。而每個 RDD 的元數(shù)據(jù)中都包含了其分區(qū)的位置信息。調(diào)度器正是利用這些信息,來將計算任務(wù)(比如一個 map 函數(shù))發(fā)送到離數(shù)據(jù)最近的節(jié)點上執(zhí)行。

惰性計算 (Lazy Evaluation) 與行動 (Actions)

在 Spark 中,所有的轉(zhuǎn)換操作都是 惰性 (lazy) 的。什么意思呢?就是當(dāng)你調(diào)用一個 transformation 時(如 filtermap),Spark 并不會立即執(zhí)行計算。它只是默默地記下你做了什么操作。

例如,下面的代碼:

val lines = spark.sparkContext.textFile("hdfs://...")
val errors = lines.filter(_.startsWith("ERROR"))
val hdfsErrors = errors.filter(_.contains("HDFS"))

執(zhí)行完這三行,集群上什么計算都還沒發(fā)生。Spark 只是構(gòu)建了一個計算計劃。

那么,計算何時才會真正發(fā)生呢?答案是當(dāng)你調(diào)用一個 行動 (action) 操作時。行動操作是那些會真正觸發(fā)計算并返回一個值給驅(qū)動程序,或者將數(shù)據(jù)寫入到外部存儲的命令。常見的 action 包括 count() (返回 RDD 的元素個數(shù))、collect() (將 RDD 的所有元素以數(shù)組形式返回到驅(qū)動程序)、saveAsTextFile() (將 RDD 內(nèi)容存為文本文件) 等。

當(dāng)你對 hdfsErrors RDD 調(diào)用 count() 時,Spark 會審視整個計算計劃,然后說:“哦,原來用戶想要計算 hdfsErrors 的數(shù)量。要得到它,我得先執(zhí)行對 errors 的 filter,而要得到 errors,我得先對 lines 進(jìn)行 filter,而 lines 來自于 HDFS 文件。” 于是,它將整個計算流程打包成任務(wù),分發(fā)到集群上執(zhí)行。

這種惰性計算的策略,讓 Spark 有機(jī)會在執(zhí)行前對整個計算流程進(jìn)行優(yōu)化,比如將多個 filter 操作合并(串聯(lián))在一起執(zhí)行,避免產(chǎn)生不必要的中間數(shù)據(jù)。

血緣 (Lineage) 與容錯

RDD 最精妙的設(shè)計在于其容錯機(jī)制。前面提到,RDD 是只讀的,并且只能通過對其他 RDD 進(jìn)行確定的轉(zhuǎn)換操作來創(chuàng)建。Spark 會記錄下這一系列的轉(zhuǎn)換關(guān)系,形成一個 **血緣關(guān)系圖 (lineage graph)**,也叫作 有向無環(huán)圖 (DAG) 。

這個血緣圖完整地記錄了任何一個 RDD 是如何從最原始的輸入數(shù)據(jù)一步步計算得來的。

現(xiàn)在,假設(shè)集群中一臺機(jī)器宕機(jī)了,它內(nèi)存中保存的某個 RDD 分區(qū)也隨之丟失。怎么辦?傳統(tǒng)的分布式系統(tǒng)可能需要依賴高成本的數(shù)據(jù)復(fù)制或檢查點 (checkpointing) 機(jī)制來恢復(fù)。

而 Spark 的做法則非常優(yōu)雅:它根本不需要復(fù)制數(shù)據(jù)來實現(xiàn)容錯。它只需要根據(jù)血緣圖,找到丟失的那個分區(qū)是如何計算出來的,然后在另外一個空閑的節(jié)點上, 重新執(zhí)行一遍 當(dāng)初的計算過程,就能把它恢復(fù)出來。因為轉(zhuǎn)換操作是 確定性 (deterministic) 的,所以重新計算的結(jié)果和之前會完全一樣。

這種基于血緣的恢復(fù)方式,開銷極小,而且恢復(fù)任務(wù)可以并行進(jìn)行,速度很快。這就是 RDD 中“彈性 (Resilient)”一詞的由來。

深入 Spark 執(zhí)行:窄依賴與寬依賴

為了優(yōu)化執(zhí)行,Spark 將 RDD 之間的依賴關(guān)系分為兩類:窄依賴 (narrow dependencies) 和 寬依賴 (wide dependencies) 。理解這個區(qū)別至關(guān)重要。

  • 窄依賴 :子 RDD 的每個分區(qū) 只依賴于 父 RDD 的一個分區(qū)(或少數(shù)幾個固定的分區(qū))。典型的例子是 map 和 filter。這種依賴關(guān)系非常高效,因為計算可以在一個節(jié)點上以流水線 (pipeline) 的方式進(jìn)行,不需要等待其他節(jié)點。
  • 寬依賴 :子 RDD 的每個分區(qū) 可能依賴于 父 RDD 的所有分區(qū)。典型的例子是 groupByKey 和 reduceByKeygroupByKey 需要找到所有分區(qū)中具有相同 key 的元素,并將它們聚集在一起。這個過程不可避免地需要在集群節(jié)點之間進(jìn)行大規(guī)模的數(shù)據(jù)交換,這個過程被稱為 洗牌 (shuffle) 。

你可以通過下面的示意圖來理解:

窄依賴 (Narrow Dependency)
父 RDD            子 RDD
[Partition 1]  ->  [Partition A]
[Partition 2]  ->  [Partition B]
[Partition 3]  ->  [Partition C]
(map, filter, union)


寬依賴 (Wide Dependency)
父 RDD            子 RDD
[Partition 1] --\
[Partition 2] -->-- [Partition X]
[Partition 3] --/

[Partition 1] --\
[Partition 2] -->-- [Partition Y]
[Partition 3] --/
(groupByKey, join, distinct)

寬依賴是 Spark 中代價高昂的操作,因為它需要網(wǎng)絡(luò) I/O,并且是一個 屏障 (barrier) ,后續(xù)步驟必須等待 shuffle 完成才能開始。Spark 的調(diào)度器會根據(jù)血緣圖中的寬依賴來劃分 階段 (Stage) 。在一個 Stage 內(nèi)部,所有的計算都是窄依賴,可以高效地流水線執(zhí)行。而 Stage 之間的邊界就是 shuffle 。

一個完整的例子:用 Spark 實現(xiàn) PageRank

讓我們結(jié)合 PageRank 例子,看看這些概念是如何協(xié)同工作的。PageRank 是一種迭代算法,用于評估網(wǎng)頁的重要性,非常適合用 Spark 實現(xiàn)。

// 1. 讀取輸入文件,創(chuàng)建初始 RDD
val lines = spark.read.textFile("in").rdd

// 2. 解析鏈接關(guān)系 (from, to),這是一系列窄依賴轉(zhuǎn)換
val links = lines.map { s =>
  val parts = s.split("\\s+")
  (parts(0), parts(1))
}.distinct().groupByKey().cache() // distinct 和 groupByKey 是寬依賴

// 3. 初始化所有頁面的 rank 為 1.0,這是一個窄依賴轉(zhuǎn)換
var ranks = links.mapValues(v => 1.0)

// 4. 進(jìn)行 10 次迭代
for (i <- 1 to 10) {
  // 將鏈接關(guān)系和排名進(jìn)行 join (寬依賴)
  val contribs = links.join(ranks).values.flatMap {
    case (urls, rank) =>
      val size = urls.size
      urls.map(url => (url, rank / size))
  }
  // 按 URL 聚合貢獻(xiàn)值,并計算新排名 (寬依賴)
  ranks = contribs.reduceByKey(_ + _).mapValues(0.15 + 0.85 * _)
}

// 5. 觸發(fā)計算,并將結(jié)果收集回驅(qū)動程序
val output = ranks.collect()
output.foreach(tup => println(s"${tup._1} has rank: ${tup._2} ."))

這個例子完美地展示了 Spark 的威力:

  • 表達(dá)力 :相比 MapReduce,代碼更簡潔、更符合邏輯。
  • 迭代計算 :for 循環(huán)中的 links 和 ranks RDD 在每次迭代中都被復(fù)用。
  • 持久化 :links.cache() 是一個關(guān)鍵優(yōu)化。它告訴 Spark:“我將來會頻繁使用 links RDD,請把它緩存到內(nèi)存里吧!”。這樣,在 10 次迭代中,links RDD 只需要從文件計算一次,后續(xù) 9 次直接從內(nèi)存讀取,極大地提升了性能。cache() 是 persist(StorageLevel.MEMORY_ONLY) 的一個別名。
  • 惰性求值 :在調(diào)用 collect() 之前,整個復(fù)雜的計算圖(包含 10 次迭代)只是被定義好了,并沒有執(zhí)行。
  • 容錯 :如果在迭代的第 8 輪,某個節(jié)點掛了,導(dǎo)致 ranks RDD 的某個分區(qū)丟失,Spark 會根據(jù)血緣圖自動從上一個 Stage 的可用數(shù)據(jù)開始重算,恢復(fù)這個丟失的分區(qū)。


對于血緣關(guān)系特別長的 RDD(比如迭代上百次的 PageRank),如果從頭開始重算,代價可能會很高。為此,Spark 允許用戶手動對某些關(guān)鍵 RDD 設(shè)置 檢查點 (checkpoint) ,將它們物化到 HDFS 等可靠存儲上,從而截斷血緣關(guān)系,降低故障恢復(fù)的時間。

Spark vs. MapReduce:該用誰?

既然 Spark 看起來全面優(yōu)于 MapReduce,那 MapReduce 是不是就該被淘汰了?

不完全是。雖然 Spark 更強(qiáng)大,但在某些特定場景下,MapReduce 依然有其一席之地。關(guān)鍵在于你的計算模式。

  • 如果你的任務(wù)是 單次遍歷 一個巨大的數(shù)據(jù)集,進(jìn)行簡單的映射和聚合(比如統(tǒng)計詞頻),那么這個任務(wù)的主要瓶頸是 I/O。Spark 的內(nèi)存緩存優(yōu)勢無法體現(xiàn),因為它沒有任何 RDD 可以被重用。在這種情況下,Spark 和 MapReduce 的性能可能不相上下,甚至 MapReduce 可能因為其成熟穩(wěn)定而更受青睞。
  • 但只要你的任務(wù)涉及 迭代 、 交互式查詢 ,或者包含多個需要共享中間數(shù)據(jù)的步驟,Spark 的優(yōu)勢就是壓倒性的。實驗表明,在迭代式機(jī)器學(xué)習(xí)應(yīng)用上,Spark 的性能可以比 Hadoop MapReduce 高出 20 倍。

總的來說,Spark 可以看作是 MapReduce 的一種 泛化和超集 。它不僅能完成 MapReduce 的工作,還能高效處理 MapReduce 難以勝任的復(fù)雜計算模式。

好的,這是對大數(shù)據(jù)生態(tài)圈演進(jìn)之路的重寫與擴(kuò)充版本,希望能解答你的疑惑,并提供一個更全面的視角。

大數(shù)據(jù)生態(tài)圈的演進(jìn)之路

為了更好地理解 Spark 的地位,我們有必要回顧一下大數(shù)據(jù)技術(shù)棧的演進(jìn)歷史。這個過程并非簡單的技術(shù)迭代,而是一個不斷發(fā)現(xiàn)問題、解決問題,從而推動整個領(lǐng)域向前發(fā)展的生動故事。

HDFS + MapReduce (Hadoop 1.0):奠基時代

在 Hadoop 出現(xiàn)之前,處理超過單機(jī)容量的數(shù)據(jù)是一項極其昂貴且復(fù)雜的任務(wù),通常需要專用的、昂貴的硬件。Hadoop 的誕生,參考了谷歌發(fā)布的兩篇革命性論文(關(guān)于 GFS 和 MapReduce),徹底改變了這一局面。

HDFS (Hadoop Distributed File System) 如何解決存儲問題?

HDFS 是谷歌文件系統(tǒng) (GFS) 的開源實現(xiàn),其核心思想是“分而治之”和“容錯于廉價硬件”。當(dāng)一個大文件(如 1TB 的日志)存入 HDFS 時,它并不會被完整地存放在一臺機(jī)器上。相反,它會被切分成許多固定大小的 數(shù)據(jù)塊 (Block) ,通常為 128MB 或 256MB。這些數(shù)據(jù)塊被分散存儲在集群中成百上千臺廉價的服務(wù)器(稱為 DataNode )上。為了實現(xiàn)容錯,每個數(shù)據(jù)塊默認(rèn)還會有 2 個副本,存放在不同的 DataNode 上。

集群中還有一個名為 NameNode 的主節(jié)點,它就像是整個文件系統(tǒng)的“目錄”,記錄著每個文件的元數(shù)據(jù),比如文件被分成了哪些塊,以及每個塊和它的副本分別存儲在哪臺 DataNode 上。通過這種方式,HDFS 實現(xiàn)了用普通商用硬件存儲海量數(shù)據(jù)的能力,并且當(dāng)任何一臺 DataNode 宕機(jī)時,數(shù)據(jù)都能從副本中恢復(fù),保證了高可靠性。

MapReduce 如何解決計算問題及其局限性?

MapReduce 框架則負(fù)責(zé)處理存儲在 HDFS 上的數(shù)據(jù)。它的主節(jié)點 JobTracker 是整個計算的大腦。當(dāng)用戶提交一個計算任務(wù)時,JobTracker 會做兩件核心事情:

  1. 資源管理 :它持續(xù)追蹤集群中所有從節(jié)點( TaskTracker )的心跳,了解每個節(jié)點上有多少可用的計算槽位(Map Slot 和 Reduce Slot)。
  2. 作業(yè)調(diào)度與監(jiān)控 :它接收用戶的 MapReduce 作業(yè),將其拆分成大量的 Map 任務(wù)和 Reduce 任務(wù),然后像一個調(diào)度中心一樣,將這些任務(wù)分配給有空閑槽位的 TaskTracker 去執(zhí)行。它還負(fù)責(zé)監(jiān)控任務(wù)的執(zhí)行進(jìn)度,一旦發(fā)現(xiàn)某個任務(wù)失敗(比如節(jié)點宕機(jī)),就會在其他節(jié)點上重新調(diào)度該任務(wù)。

這種模式雖然強(qiáng)大,但其局限性也十分明顯。首先,JobTracker 將資源管理和 MapReduce 計算模型 緊密耦合 ,導(dǎo)致整個集群只能運(yùn)行 MapReduce 類型的作業(yè),無法支持像 Spark 這樣的新興計算框架。其次,JobTracker 本身是一個 單點故障 (Single Point of Failure) ,一旦它崩潰,整個集群就會癱瘓,所有正在運(yùn)行的任務(wù)都會失敗。最后,在超大規(guī)模集群中,JobTracker 需要管理所有任務(wù),其自身也成為了一個巨大的性能瓶頸。

YARN (Hadoop 2.0):資源管理的革命

為了解決 Hadoop 1.0 的核心缺陷,Hadoop 2.0 引入了 YARN (Yet Another Resource Negotiator),它將 JobTracker 的功能進(jìn)行了一次優(yōu)雅的“權(quán)責(zé)分離”。

YARN 如何分離職能?

YARN 將 JobTracker 的兩大職責(zé)拆分給了兩個獨(dú)立的組件:

  1. 全局的 ResourceManager (RM) :這是一個純粹的資源調(diào)度中心,是集群的唯一主宰。它只負(fù)責(zé)管理和分配整個集群的資源(如 CPU、內(nèi)存),但對應(yīng)用程序的具體內(nèi)容一無所知。
  2. 每個應(yīng)用專屬的 ApplicationMaster (AM) :當(dāng)一個計算任務(wù)(無論是 MapReduce 作業(yè)還是 Spark 作業(yè))被提交時,YARN 的 RM 首先會啟動一個專屬于該任務(wù)的“司令官”——ApplicationMaster。這個 AM 負(fù)責(zé)向 RM “申請”計算資源(比如“我需要 100 個容器,每個容器 4G 內(nèi)存、2 個核”),在獲得資源后,再由它自己負(fù)責(zé)在其獲得的資源上啟動、管理和監(jiān)控具體的計算任務(wù)。
  • 帶來了什么?

YARN 本身是 Hadoop 生態(tài)中的一個核心框架服務(wù)。用戶通常不直接操作 YARN,而是通過 spark-submit 或 mapred 等命令提交應(yīng)用。這些應(yīng)用框架會自動與 YARN 的 RM 通信,啟動自己的 AM,從而在集群上運(yùn)行。

這個解耦是革命性的。它將 Hadoop 集群從一個“只能跑 MapReduce 的專用平臺”升級為了一個通用的 “數(shù)據(jù)操作系統(tǒng)” 。從此,任何符合 YARN 規(guī)范的計算框架(如 Spark、Flink、Storm 等)都可以作為“應(yīng)用程序”運(yùn)行在同一個集群之上,共享硬件資源,極大地提升了集群的利用率和靈活性。

Spark:性能的飛躍

在 YARN 提供的通用資源管理平臺上,Spark 橫空出世,旨在解決 MapReduce 的性能瓶頸。當(dāng)一個 Spark 應(yīng)用提交到 YARN 集群時,YARN 的 RM 會先為其啟動 Spark 的 ApplicationMaster。隨后,這個 AM 會向 RM 申請更多資源(在 YARN 中稱為容器 Container)來運(yùn)行 Spark 的 Executor 進(jìn)程,這些 Executor 才是真正執(zhí)行計算任務(wù)的工作單元。

Spark 的性能優(yōu)勢源于其核心抽象——RDD。通過將中間計算結(jié)果保存在內(nèi)存中,并利用惰性計算和有向無環(huán)圖 (DAG) 來優(yōu)化整個計算流程,Spark 避免了 MapReduce 在多步驟任務(wù)中頻繁的、昂貴的磁盤讀寫。對于需要多次迭代的機(jī)器學(xué)習(xí)算法和需要快速響應(yīng)的交互式數(shù)據(jù)分析場景,Spark 提供了比 MapReduce 高出幾個數(shù)量級的性能提升。

Hive:降低大數(shù)據(jù)的門檻

雖然 MapReduce 和 Spark 提供了強(qiáng)大的計算能力,但直接用 Java 或 Scala 編寫分布式程序?qū)υS多人來說門檻太高。Hive 的出現(xiàn),就是為了讓更廣泛的用戶群體能夠利用大數(shù)據(jù)的能力。

Hive 是一套完整的 數(shù)據(jù)倉庫基礎(chǔ)設(shè)施 ,它不僅僅是一種語法。其核心組件包括:

  • HiveQL :一種與標(biāo)準(zhǔn) SQL 非常相似的查詢語言,讓數(shù)據(jù)分析師可以用熟悉的語法來查詢海量數(shù)據(jù)。
  • 引擎 :Hive 的核心引擎負(fù)責(zé)將用戶提交的 HiveQL 查詢語句進(jìn)行解析、優(yōu)化,并最終 翻譯 成底層的分布式計算作業(yè)(早期是 MapReduce,現(xiàn)在更多地配置為 Spark 或 Tez)。
  • Metastore :這是 Hive 的靈魂所在。它是一個獨(dú)立的元數(shù)據(jù)存儲服務(wù)(通常使用 MySQL 或 PostgreSQL 實現(xiàn)),記錄了 HDFS 上非結(jié)構(gòu)化數(shù)據(jù)文件的“結(jié)構(gòu)化”信息。它像一個戶口本,定義了“表”名、列名、數(shù)據(jù)類型,并指明了這些表對應(yīng)的數(shù)據(jù)實際存放在 HDFS 的哪個目錄下。正是因為有了 Metastore,Hive 才能讓用戶像查詢傳統(tǒng)數(shù)據(jù)庫表一樣查詢一堆分散的文本文件。
  • 服務(wù)接口 (HiveServer2) :Hive 還可以作為一個常駐服務(wù)運(yùn)行,提供 JDBC/ODBC 接口,允許各種商業(yè)智能 (BI) 工具(如 Tableau)和應(yīng)用程序像連接普通數(shù)據(jù)庫一樣連接到 Hive,進(jìn)行數(shù)據(jù)查詢和分析。

HBase:賦予 Hadoop 實時讀寫能力

HDFS 擅長存儲大文件并支持高吞吐量的順序讀取,但它天生不支持對數(shù)據(jù)的隨機(jī)、實時讀寫。你無法高效地執(zhí)行“查詢用戶 ID 為 123 的個人信息”這類操作。HBase 的出現(xiàn)正是為了彌補(bǔ)這一短板。

HBase 是一個構(gòu)建在 HDFS 之上的 NoSQL 數(shù)據(jù)庫。所謂 NoSQL(“Not Only SQL”),泛指所有非關(guān)系型的數(shù)據(jù)庫。相比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(如 MySQL),NoSQL 數(shù)據(jù)庫通常具備以下優(yōu)勢:

  • 靈活的數(shù)據(jù)模型 :它們不需要預(yù)先定義嚴(yán)格的表結(jié)構(gòu),可以輕松存儲半結(jié)構(gòu)化甚至非結(jié)構(gòu)化數(shù)據(jù)。
  • 超強(qiáng)的水平擴(kuò)展能力 :它們被設(shè)計為可以輕松地擴(kuò)展到成百上千臺服務(wù)器,以應(yīng)對數(shù)據(jù)量和訪問量的增長。
  • 高可用性 :通常內(nèi)置了數(shù)據(jù)復(fù)制和自動故障轉(zhuǎn)移機(jī)制。

HBase 本質(zhì)上是一個巨大的、稀疏的、分布式的、多維度的、已排序的哈希表。它允許你通過一個唯一的行鍵 (Row Key) 在毫秒級別內(nèi)從億萬行數(shù)據(jù)中定位并讀寫數(shù)據(jù),完美地滿足了需要對海量數(shù)據(jù)進(jìn)行實時隨機(jī)訪問的在線應(yīng)用場景,例如實時推薦系統(tǒng)、用戶畫像查詢、風(fēng)控系統(tǒng)等。

Flink 及其他:擁抱真正的流處理

隨著物聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)的發(fā)展,數(shù)據(jù)不再僅僅是離線存儲的“批數(shù)據(jù)”,而是像水流一樣源源不斷產(chǎn)生的“流數(shù)據(jù)”。

Spark Streaming 的微批處理 (Micro-batching)

Spark 最早通過 Spark Streaming 模塊來處理流數(shù)據(jù)。它的工作模式是“微批處理”:它將實時數(shù)據(jù)流按照一個極小的時間間隔(如 1 秒)切分成一個個微小的數(shù)據(jù)批次(mini-batch),然后用 Spark 引擎快速地處理這些小批次。這種方式巧妙地復(fù)用了 Spark 成熟的批處理引擎,可以實現(xiàn)很低的延遲(準(zhǔn)實時),并且吞吐量大。但它并非真正的“逐條處理”,因為數(shù)據(jù)總要攢夠一個批次的間隔才能被處理,因此存在一個固有的、最小等于批次間隔的延遲。

Flink 的真正事件驅(qū)動流處理

Apache Flink 則代表了另一條技術(shù)路線—— 真正的流處理 。它是一個 事件驅(qū)動 (Event-driven) 的框架,其核心理念是“數(shù)據(jù)流是第一公民”。在 Flink 中,每一條數(shù)據(jù)(一個事件)一旦抵達(dá),就會被立刻處理,而無需等待湊成一個批次。這種模式能夠?qū)崿F(xiàn)最低的毫秒級甚至亞毫秒級延遲。Flink 強(qiáng)大的 狀態(tài)管理 和 精確一次 (exactly-once) 處理語義保證,使其非常適合構(gòu)建復(fù)雜的、有狀態(tài)的實時應(yīng)用,如實時欺詐檢測、金融交易監(jiān)控和實時數(shù)據(jù)大屏等。在 Flink 的世界觀里,批處理只是流處理的一個特例——一個有限的數(shù)據(jù)流。

關(guān)于 Spark 的開發(fā)語言,為什么選擇 Scala

Spark 主要使用 Scala 開發(fā)。這部分是因為項目啟動時 Scala 正是一門“新潮”的語言。但更重要的技術(shù)原因是,Scala 作為一門運(yùn)行在 JVM 上的函數(shù)式語言,它能非常簡潔、高效地定義和傳遞用戶代碼(即 閉包 (closures) ),并且可以將其序列化后發(fā)送到工作節(jié)點上執(zhí)行,這是實現(xiàn)分布式計算的關(guān)鍵。

關(guān)于 RDD 概念的延伸 :雖然 RDD 的概念與 Spark 緊密相連,但其背后的核心思想——基于血緣的恢復(fù)和面向集合的 API——在許多其他系統(tǒng)中都有體現(xiàn),如 DryadLINQ 和 FlumeJava 。值得一提的是,Spark 自身也在不斷進(jìn)化。如今,更推薦使用 DataFrame 和 Dataset API。它們在 RDD 的基礎(chǔ)上,引入了更優(yōu)化的列式存儲和執(zhí)行計劃,性能通常比直接操作 RDD 更高。

最后,關(guān)于 能源效率 ,雖然它是計算機(jī)科學(xué)的一個重要議題,但在分布式系統(tǒng)軟件設(shè)計層面,它通常不是首要的優(yōu)化目標(biāo)。主要的節(jié)能工作集中在數(shù)據(jù)中心設(shè)計、硬件(如 CPU 動態(tài)調(diào)頻)和散熱等方面。因為在軟件層面進(jìn)行優(yōu)化的節(jié)能效果,遠(yuǎn)不如在這些物理層面進(jìn)行改進(jìn)來得顯著。

總而言之, Spark 不僅僅是 MapReduce 的一個替代品,更是數(shù)據(jù)處理范式的一次重要飛躍。


責(zé)任編輯:武曉燕 來源: Piper蛋窩
相關(guān)推薦

2015-03-04 11:19:59

2016-11-01 14:30:09

大數(shù)據(jù)大數(shù)據(jù)技術(shù)

2016-01-07 13:19:21

大數(shù)據(jù)分析生態(tài)圈

2020-09-21 09:57:03

大數(shù)據(jù)大數(shù)據(jù)技術(shù)數(shù)據(jù)

2020-12-17 11:04:22

2018-11-13 15:05:33

大數(shù)據(jù)MapReduce機(jī)器

2023-04-04 13:31:18

2022-12-08 00:09:20

CSS生態(tài)圈技術(shù)趨勢

2016-07-14 15:57:06

華為

2019-03-21 19:21:33

華為中國生態(tài)伙伴大會201智能進(jìn)化

2019-03-05 14:57:21

大數(shù)據(jù)Hadoop框架

2012-06-15 10:03:57

2018-10-11 20:38:27

大數(shù)據(jù)生態(tài)圈分布式

2013-07-22 17:41:58

2019-01-15 08:58:40

Kubernetes生態(tài)圈Docker

2025-09-15 06:25:00

2017-05-18 11:40:22

互聯(lián)網(wǎng)

2016-04-25 10:52:25

億信華辰

2015-09-02 13:15:31

Python

2019-04-30 14:19:24

Kafka大數(shù)據(jù)分布式流平臺
點贊
收藏

51CTO技術(shù)棧公眾號

日本一不卡视频| 欧美三级自拍| 一区二区三区免费在线观看| av一区二区三区免费| 日韩手机在线观看| 国产亚洲精品美女久久久久久久久久| 欧美亚洲尤物久久| 美女av免费观看| 久草视频在线看| 国产尤物一区二区在线| 17婷婷久久www| 91麻豆免费视频网站| 欧美毛片免费观看| 欧美日本在线看| 熟女少妇在线视频播放| 一级日本在线| 99久久久国产精品| 91精品国产综合久久香蕉| 五月婷婷开心网| 一本一本久久a久久综合精品| 亚洲黄色av网站| 小早川怜子一区二区三区| 女人让男人操自己视频在线观看| 国产精品国产精品国产专区不蜜 | 日韩毛片一区二区三区| 9999国产精品| 一本色道久久综合亚洲精品小说| 久久久久国产免费| 台湾天天综合人成在线| 色国产精品一区在线观看| 僵尸世界大战2 在线播放| 免费黄网站在线播放| 久久丝袜美腿综合| 国产精品久久久久久久久久直播| 国产一区二区三区中文字幕| 视频一区国产视频| **欧美日韩vr在线| 奇米影视第四色777| 很黄很黄激情成人| 欧美成人性生活| h色网站在线观看| 欧美gayvideo| 久久精品人人做人人爽| 人与嘼交av免费| 精品欧美久久| 一区二区三区四区在线观看视频| 国产精品无码一区二区三区免费| 老牛精品亚洲成av人片| 亚洲成人网久久久| 东京热av一区| 欧美理论电影在线精品| 亚洲成人网av| 欧美一区二区三区成人精品| 日本欧美三级| 亚洲欧美制服第一页| 99re久久精品国产| 日韩在线影视| 亚洲欧美日韩精品| 男女做爰猛烈刺激| 欧美日韩国产一区二区三区不卡| 亚洲第一区在线| 日韩成人av一区二区| 国产成人精品福利| 精品99久久久久久| av2014天堂网| 蜜臀av免费一区二区三区| 亚洲嫩模很污视频| 日本少妇xxxxx| 欧美xxav| 色综合久综合久久综合久鬼88| 欧美日韩黄色网| 欧美三级小说| 2021久久精品国产99国产精品| wwwwww国产| 美腿丝袜在线亚洲一区| 亚洲一区二区三区xxx视频| www视频在线| 99久久婷婷国产| 日韩偷拍一区二区| 国产黄色在线网站| 婷婷国产在线综合| 国产超碰在线播放| 日本亚洲视频| 国产视频在线一区二区| 中国1级黄色片| 欧美午夜电影在线观看 | 午夜在线视频免费观看| 日本伦理一区二区| 日韩欧美黄色动漫| 天天干天天色天天干| 成人看片黄a免费看视频| 亚洲免费中文字幕| 欧美日韩午夜视频| 亚洲在线一区| 成人免费视频a| 亚洲 欧美 自拍偷拍| 国产精品久久久久影院| 男女私大尺度视频| 欧美黄页免费| 日韩精品极品视频免费观看| 女教师淫辱の教室蜜臀av软件| 国产精品激情电影| 国产精品福利网站| 免费观看a视频| 国产精品美女www爽爽爽| 久久男人资源站| 你懂的网址一区二区三区| 欧洲美熟女乱又伦| 欧美深夜福利| 国产精品极品尤物在线观看| 亚洲av色香蕉一区二区三区| 国产午夜精品久久久久久久| 欧美视频在线第一页| 国产一区二区色噜噜| 亚洲精品国精品久久99热| 日本女人性生活视频| 一区二区国产在线观看| 国产在线日韩在线| 日本一二三区在线视频| 一区二区在线免费观看| 国产一二三四在线视频| 无码日韩精品一区二区免费| 欧美高清在线播放| 国产精品无码白浆高潮| 国产欧美视频在线观看| 六月丁香激情网| 超碰精品在线| 久久精品成人欧美大片古装| 天堂av免费在线观看| 91免费视频网| 天天夜碰日日摸日日澡性色av| 国产精品视频一区视频二区| 在线观看亚洲视频| 无码人妻精品一区二区三区不卡 | 在线观看免费一区二区| 国产精品美女网站| 国产精品视频一区二区久久| 欧美日韩久久久久| 影音先锋黄色资源| 亚洲激情av| 国产视频在线观看一区| 免费毛片在线看片免费丝瓜视频 | 国产精品欧美风情| 高清av电影在线观看| 91久久精品网| 男人的天堂官网 | 香蕉视频色在线观看| 色婷婷亚洲mv天堂mv在影片| 国产精品久久久久久久久借妻| 日本国产在线| 色综合色狠狠综合色| 李宗瑞91在线正在播放| 亚洲欧美春色| 青青草久久网络| 电影一区二区| 最近2019年手机中文字幕| 亚洲性在线观看| 国产精品天干天干在观线| 黑人粗进入欧美aaaaa| 日韩国产一区二区| 成人免费看片视频| 羞羞污视频在线观看| 亚洲高清在线观看| 69视频免费在线观看| 国产欧美一区二区精品性色超碰| 久久99999| 一区二区国产在线| 国产精品国产精品国产专区蜜臀ah | 免费看日产一区二区三区| 欧美成人在线免费视频| 四虎在线视频免费观看| 色久综合一二码| 日韩av毛片在线观看| 国产剧情av麻豆香蕉精品| 日韩黄色片在线| 人人精品亚洲| 国产欧美日韩高清| 调教一区二区| 亚洲欧美日韩在线高清直播| 一区二区日韩在线观看| 亚洲伊人伊色伊影伊综合网| 国产美女精品久久| 久久99精品国产91久久来源| 18黄暴禁片在线观看| 国产视频网站一区二区三区| 九九热视频这里只有精品| 午夜在线视频免费| 欧美日韩国产三级| 激情五月色婷婷| 国产精品女同一区二区三区| 日韩欧美国产片| 亚洲视频福利| 亚洲成色www久久网站| 亚洲一区电影| 国产美女扒开尿口久久久| 18视频在线观看网站| 亚洲乱码一区二区| 99久久精品无免国产免费| 欧美日韩激情网| 青青在线视频一区二区三区| 国产农村妇女毛片精品| 亚洲va国产va欧美va观看| 国产美女永久免费无遮挡| 国产成人精品一区二区三区网站观看 | 国产精品专区一| h片在线观看| 色伦专区97中文字幕| 手机看片福利在线| 538prom精品视频线放| 国产原创视频在线| 一区二区三区精品视频| 992在线观看| 久久久久久久久久久久久久久99 | 国产精品中文| 国产成人综合一区二区三区| 欧美24videosex性欧美| 北条麻妃一区二区三区中文字幕| 欧美女优在线| 欧美精品一区二区三区一线天视频| 中文字幕永久免费视频| 疯狂蹂躏欧美一区二区精品| 九九热精品免费视频| 国产精品久久久久久久午夜片| 国产51自产区| 国产一区啦啦啦在线观看| 天天操天天爱天天爽| aa国产精品| 国产精品www在线观看| 欧美在线网站| 中文字幕一区二区三区5566| 日本一区二区高清不卡| 日本黑人久久| 亚洲丝袜啪啪| 美女三级99| 亚洲人成网站77777在线观看| 国产高清自拍99| 日本免费一区二区三区视频| 91热福利电影| 91国产一区| 国产噜噜噜噜久久久久久久久| 91av一区| 国产精品视频自拍| 2019年精品视频自拍| 国产91亚洲精品| 毛片无码国产| 日韩av电影在线播放| 欧美极度另类| 国产精品成久久久久三级| 日本久久免费| 国产精品国语对白| 播放一区二区| 国产欧美精品日韩精品| 国产成人免费精品| 国产一区二区视频在线观看| 国产视频一区二区在线播放| 91日本在线视频| 成人性生交大片免费看中文视频| 亚洲一区二区久久久久久| 亚洲大奶少妇| 国内外成人免费视频| 网红女主播少妇精品视频| 欧美在线日韩精品| 成人精品影院| 在线无限看免费粉色视频| 亚洲免费二区| 91免费国产精品| 在线日本高清免费不卡| 国产日产欧美视频| 日韩va欧美va亚洲va久久| 九九热99视频| 国产91综合网| 熟女少妇一区二区三区| 中文欧美字幕免费| 免费在线一区二区三区| 午夜精品久久久| 国产女优在线播放| 日韩欧美中文字幕公布| 天堂中文在线看| 在线视频欧美性高潮| 中文字幕在线观看播放| 69av成年福利视频| 国产国产一区| 国产精品日韩二区| 欧美码中文字幕在线| 99re6这里有精品热视频| 香蕉久久久久久久av网站| 日本三级黄色网址| 成人av在线资源网| 娇小11一12╳yⅹ╳毛片| 亚洲va国产va欧美va观看| 欧美男人天堂网| 成人av网站在线观看免费| 欧美激情www| 神马影视一区二区| 亚洲av首页在线| 国产一区二区精品| 国产青草视频在线观看| 亚洲在线视频| 又色又爽又黄18网站| 国产日本亚洲高清| 国产在线拍揄自揄拍| 欧美日韩免费不卡视频一区二区三区| www.香蕉视频| 中文字幕精品一区久久久久 | 欧美色婷婷久久99精品红桃| 久久av综合网| 精品一区二区精品| 成年人网站免费在线观看| 亚洲精品高清在线| 精品国产青草久久久久96| 精品sm捆绑视频| 超碰免费公开在线| 国产精品日韩一区| 色婷婷精品视频| 97在线国产视频| 国产在线精品一区在线观看麻豆| 亚洲色成人网站www永久四虎 | 成人精品一区二区三区中文字幕 | 日本一区高清| 久久久伊人日本| 国产亚洲久久| 亚洲一区精品视频| 日韩成人免费电影| 在线免费观看黄色小视频| 亚洲国产综合视频在线观看| 国产高清视频网站| 精品国产一区二区三区久久久樱花 | 色婷婷色综合| 久久精品影视大全| 国产视频一区二区在线| 依依成人综合网| 亚洲精品美女视频| 国产h片在线观看| 国产精品免费视频一区二区| 欧美精品九九| 亚洲熟女乱综合一区二区| 亚洲欧美电影一区二区| 一级爱爱免费视频| 在线免费观看羞羞视频一区二区| gay欧美网站| 欧美高清视频一区| 免费精品视频| 精品人妻无码一区二区三区换脸| 欧美日韩亚洲视频一区| 日本在线视频1区| 日本精品久久中文字幕佐佐木| 色狼人综合干| 免费日韩视频在线观看| 久久久久久久久久久黄色| 婷婷激情五月综合| 欧美精品一区二区三区久久久竹菊| 国产伦精品一区二区三区四区视频_| 成人深夜在线观看| 成人免费区一区二区三区| 精品一区二区三区三区| 成人影院大全| 日韩欧美精品一区二区| 美女视频黄 久久| 中文字幕资源站| 欧美一卡二卡在线| 国产丝袜在线播放| 精品视频一区在线| 久久精品天堂| 成人信息集中地| 欧美mv日韩mv| 亚洲电影观看| 亚洲欧洲精品在线 | 欧美国产高清| 精品一区二区视频在线观看| 一本色道久久综合亚洲91| h视频在线免费| 亚洲bt天天射| 夜夜精品视频| 久久视频一区二区三区| 91精品国产综合久久国产大片| 日本成人不卡| 日韩一区不卡| 国产一区在线不卡| 免费黄色网址在线| 色狠狠久久aa北条麻妃| 中文无码日韩欧| www黄色在线| 亚洲免费观看高清在线观看| 五月婷婷在线观看视频| 国产欧美日韩免费| 黄色免费成人| 手机av在线不卡| 亚洲国产97在线精品一区| 看片一区二区| 成人网站免费观看入口| 亚洲国产精品二十页| www日本视频| 国产精品视频最多的网站| 黑丝一区二区三区| 99在线视频免费| 精品国产成人在线影院| 国产69精品久久久久按摩| 国产玉足脚交久久欧美| 国产精品久久久久久久裸模| 精品国产一级片|