国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一篇文章幫助小白快速入門 Spark

開發 架構
很多人都用過Hadoop,包含兩部分 HDFS 和 MapReduce,其中 MapReduce 是Hadoop的分布式計算引擎,計算過程中需要頻繁落盤,性能會弱一些。今天,帶大家 快速熟悉一個大數據框架,Spark。

大家好,我是Tom哥。

互聯網時代,隨著業務數據化,數據越來越多。如何用好數據,做好數據業務化,我們需要有個利器。

很多人都用過Hadoop,包含兩部分 HDFS 和 MapReduce,其中 MapReduce 是Hadoop的分布式計算引擎,計算過程中需要頻繁落盤,性能會弱一些。

今天,帶大家 快速熟悉一個大數據框架,Spark。

Spark 是內存計算引擎,性能更好一些。盛行自 2014年,支持 流計算 Streaming、數據分析 SQL、機器學習 MLlib、圖計算 GraphFrames 等多種場景。

語言支持很多,如 Python、Java、Scala、R 和 SQL。提供了種類豐富的開發算子,如 RDD、DataFrame、Dataset。

有了這些基礎工具,開發者就可以像搭樂高一樣,快速完成各種業務場景系統開發。

一、先來個體感

首先,我們看一個簡單的代碼示例,讓大家有個體感。

import org.apache.spark.rdd.RDD
val file: String = "/Users/onlyone/spark/demo.txt"
// 加載文件
val lineRDD: RDD[String] = spark.sparkContext.textFile(file)
val wordRDD: RDD[String] = lineRDD.flatMap(line => line.split(" "))
val kvRDD: RDD[(String, Int)] = wordRDD.map(word => (word, 1))
val wordCounts: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y)
wordCounts.foreach(wordCount => println(wordCount._1 + " appeared " + wordCount._2 + " times"))

我們看到,入口代碼是從第四行的 spark 變量開始。

在 spark-shell 中 由系統自動創建,是 SparkSession 的實例化對象,可以直接使用,不需要每次自己 new 一個新對象。

SparkSession 是 Spark 程序的統一開發入口。開發一個 Spark 應用,必須先創建 SparkSession。

二、RDD

彈性分布式數據集,全稱 Resilient Distributed Datasets,是一種抽象,囊括所有內存和磁盤中的分布式數據實體,是Spark最核心的模塊和類。

RDD 中承載數據的基本單元是數據分片。在分布式計算環境中,一份完整的數據集,會按照某種規則切割成多份數據分片。這些數據分片被均勻地分發給集群內不同的計算節點和執行進程,從而實現分布式并行計算。

RDD 包含 4大屬性:

  • 數據分片,partitions。
  • 分片切割規則, partitioner。
  • RDD 依賴關系, dependencies。
  • 轉換函數,compute。

RDD 表示的是分布式數據形態,RDD 到 RDD 之間的轉換,本質上是數據形態上的轉換,這里面的一個重要角色就是算子。

三、算子

算子分為兩大類,Transformations 和 Actions。

  • Transformations 算子:通過函數方法對數據從一種形態轉換為另一種形態。
  • Actions 算子:收集計算結果,或者將數據物化到磁盤。

劃重點:mapPartitions 與 map 的功能類似,但是mapPartitions 算子是以數據分區為粒度初始化共享對象,比如:數據庫連接對象,S3文件句柄等。

結合上面的兩類算子,Spark 運行劃分為兩個環節:

  • 不同數據形態之間的轉換,構建計算流圖 (DAG)。
  • 通過 Actions 類算子,以回溯的方式去觸發執行這個計算流圖。

題外話,回溯在Java 中也有引入,比如 Stream 流也是類似機制。

一個流程可能會引入很多算子,但是他們并不會立即執行,只有當開發者調用了 Actions 算子,之前調用的轉換算子才會執行。這個也稱為 延遲計算。

延遲計算是 Spark 分布式運行機制的一大亮點。可以讓執行引擎從全局角度來優化執行流程。

四、分布式計算

Spark 應用中,程序的入口是帶有 SparkSession 的 main 函數。

SparkSession 提供了 Spark 運行時的上下文,如 調度系統、存儲系統、內存管理、RPC 通信),同時為開發者提供創建、轉換、計算分布式數據集的開發 API。

運行這個 SparkSession 的main函數的JVM進程,我們稱為 Driver。

Driver 職責:

解析用戶代碼,構建 DAG 圖,然后將計算流圖轉化為分布式任務,將任務分發給集群的 Executor 執行。定期與每個 Executor 通信,及時獲取任務的進展,從而協調整體的執行進度。

Executors 職責:

調用內部線程池,結合事先分配好的數據分片,并發地執行任務代碼。每個 Executors 負責處理 RDD 的一個數據分片子集。

分布式計算的核心是任務調度,主要是 Driver 與 Executors 之間的交互。

Driver 的任務調度依賴于 DAGScheduler、TaskScheduler 和 SchedulerBackend。

計算過程:

Driver 通過 foreach 這個 Action 算子,觸發計算流圖的執行,上圖自左向右執行,以 shuffle 為邊界,創建、分發分布式任務。

其中的 textFile、flatMap、map 三個算子合并成一份任務,分發給每一個 Executor。Executor 收到任務后,對任務進行解析,把任務拆解成 textFile、flatMap、map 3 個步驟,然后分別對自己負責的數據分片進行處理。

每個 Executor 執行完得到中間結果,然后向 Driver 匯報任務進度。接著 Driver 進行后續的聚合計算,由于數據分散在多個分片,會觸發 shuffle 操作。

shuffle 機制是將原來多個 Executor中的計算結果重新路由、分發到同一個 Executor,然后對匯總后的數據再次處理。在集群范圍內跨進程、跨節點的數據交換。可能存在網絡性能瓶頸,需要特別關注。

在不同 Executor 完成數據交換之后,Driver 分發下一個階段的任務,對單詞計數。

同一個key的數據已經分發到相同的 Executor ,每個 Executor 獨自完成計數統計。

最后,Executors 把最終的計算結果統一返回給 Driver。

劃重點:DAG 到 Stages 的拆分過程,以 Actions 算子為觸發起點,從后往前回溯 DAG,以 Shuffle 為邊界劃分 Stages。

收集結果:

收集結果,按照收集的路徑不同,主要分為兩類:

  1. 把計算結果從各個 Executors 收集到 Driver 端。
  2. 把計算結果通過 Executors 直接持久化到文件系統。如:HDFS 或 S3 分布式文件系統。

五、調度系統

1、DAGScheduler

根據用戶代碼構建 DAG,以 Shuffle 為邊界切割 Stages。每個Stage 根據 RDD中的Partition分區個數決定Task的個數,然后構建 TaskSets,然后將 TaskSets 提交給 TaskScheduler 請求調度。

2、TaskScheduler

按照任務的本地傾向性,挑選出 TaskSet 中適合調度的 Task,然后將 Task 分配到 Executor 上執行。

3、SchedulerBackend

通過ExecutorDataMap 數據結構,來記錄每一個計算節點中 Executors 的資源狀態,如 RPC 地址、主機地址、可用 CPU 核數和滿配 CPU 核數等。

4、Task

運行在Executor上的工作單元。

5、Job

SparkContext提交的具體Action操作,常和Action對應。

6、Stage

每個Job會被拆分很多組任務(task),每組任務被稱為Stage,也稱 TaskSet。

調度系統的核心思想:數據不動、代碼動。

六、內存管理

Spark 的內存分為 4 個區域,Reserved Memory、User Memory、Execution Memory 和 Storage Memory。

  1. Reserved Memory:固定為 300MB,Spark 預留的,用來存儲各種 Spark 內部對象的內存區域。
  2. User Memory:存儲開發者自定義的數據結構,例如 RDD 算子中引用的數組、列表、映射。
  3. Execution Memory:執行分布式任務。分布式任務的計算,主要包括數據的轉換、過濾、映射、排序、聚合、歸并等。
  4. Storage Memory:緩存分布式數據集,如 RDD Cache、廣播變量等。

整個內存區域,Execution Memory 和 Storage Memory 最重要。在 1.6 版本之后,Spark 推出了統一內存管理模式,這兩者可以相互轉化。

七、共享變量

Spark 提供兩類共享變量,分別是廣播變量(Broadcast variables)和累加器(Accumulators)。

1、廣播變量

val list: List[String] = List("Tom哥", "Spark")
// scSparkContext實例
val bc = sc.broadcast(list)

廣播變量的用法很簡單,通過調用 SparkContext 下的 broadcast 即可完成廣播變量的創建。

如果要讀取封裝的共享數據內容,調用它的 bc.value 函數。

好奇寶寶會問,既然 list 可以獲取字符串列表,為什么還要封裝廣播變量呢?

答案:

Driver 端對普通的共享變量的分發是以 Task 為粒度的,系統中有多少個 Task,變量就需要在網絡中分發多少次,存在巨大的內存資源浪費。

使用廣播變量后,共享變量分發的粒度以 Executors 為單位,同一個 Executor 內多個不同的 Tasks 只需訪問同一份數據拷貝即可。也就是說,變量在網絡中分發與存儲的次數,從 RDD 的分區數,減少為集群中 Executors 的個數。

2、累加器

累加器也是在 Driver 端定義,累計過程是通過在 RDD 算子中調用 add 函數為累加器計數,從而更新累加器狀態。

應用執行完畢之后,開發者在 Driver 端調用累加器的 value 函數,獲取全局計數結果。

Spark 提供了 3 種累加器,longAccumulator、doubleAccumulator 和 collectionAccumulator ,滿足不同的業務場景。

責任編輯:姜華 來源: 微觀技術
相關推薦

2019-04-17 15:16:00

Sparkshuffle算法

2022-02-21 09:44:45

Git開源分布式

2019-06-06 15:22:07

SparkShuffle內存

2019-07-26 15:01:42

SparkShuffle內存

2017-08-04 15:33:33

大數據數據可視化方法

2020-10-09 08:15:11

JsBridge

2021-01-12 09:04:12

Django FormForm組件開發

2017-09-05 08:52:37

Git程序員命令

2024-06-25 08:18:55

2021-04-09 08:40:51

網絡保險網絡安全網絡風險

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2020-10-23 07:56:04

Java中的IO流

2020-12-23 08:39:11

Go語言基礎技術

2023-05-08 08:21:15

JavaNIO編程

2022-08-04 09:39:39

Kubernetes聲明式系統

2020-06-03 11:06:26

DNS域名緩存

2021-01-26 23:46:32

JavaScript數據結構前端

2021-06-24 09:05:08

JavaScript日期前端

2014-08-08 15:22:20

點贊
收藏

51CTO技術棧公眾號

久久精品国产亚洲| 国产精品偷伦免费视频观看的 | 丁香婷婷综合五月| 成人在线免费高清视频| 成人国产视频在线观看| 99视频在线视频| 精品久久久久久国产91| 国产福利视频在线| 亚洲美女在线看| 18国产精品| 91丝袜美腿美女视频网站| 国产视频一区免费看| 今天免费高清在线观看国语| 日本一区二区三区dvd视频在线 | 在线成人激情| 亚洲精品在线观看免费| 99久久精品免费观看| 在线免费看黄av| 国产精品极品在线| 中文字幕av一区二区三区| 国产欧美在线播放| 久久久久久久欧美精品| 日韩亚洲欧美一区二区| 亚洲欧美日韩在线不卡| 五月婷婷丁香色| 日韩精品一区二区三区在线| 欧美一区=区三区| 97碰碰视频| 亚洲国产精品v| 一级毛片视频在线观看| 97婷婷大伊香蕉精品视频| 久久狠狠亚洲综合| 羞羞视频在线观看| 欧美激情综合色| 久久99精品一区二区三区| eeuss在线观看| 国内精品久久影院| 国产成人高清在线| 三级网站视频在在线播放| 国产精品影院在线观看| 成人免费视频网站在线观看| 一二三四社区在线视频| 久久亚洲国产精品| 国产最新精品免费| 182tv在线播放| 亚洲男女性事视频| 高清毛片在线观看| 成人av播放| 图片区小说区国产精品视频| 国产综合av| 亚洲福利视频在线| 日韩国产欧美在线观看| 18免费在线视频| a级国产乱理论片在线观看99| 精品日韩美女的视频高清| 亚洲91中文字幕无线码三区| 伊人精彩视频| 91免费人成网站在线观看18| 欧美天天综合色影久久精品| 五月激情综合| 每日更新av在线播放| 色一情一乱一伦一区二区三欧美| 欧美系列日韩一区| 日本视频中文字幕一区二区三区| 欧美1234区| www.超碰com| 一卡二卡三卡日韩欧美| 亚洲午夜成aⅴ人片| 美女主播精品视频一二三四| 国产美女主播在线播放| 久久亚洲精品成人| 亚洲人精品午夜| 日韩精品欧美激情一区二区| 亚洲欧洲精品天堂一级 | 国产视频亚洲色图| 日韩中文av| 深夜福利视频一区| 先锋影音亚洲资源| 亚洲女人初尝黑人巨大| 久久蜜桃av一区二区天堂| 狠狠综合久久av一区二区蜜桃| 久久精品色图| 在线视频福利一区| 国产精品久久久久久久电影| 91精品国产91久久久久久一区二区 | 国产精品第五页| 日韩精品国产精品| 欧美欧美黄在线二区| eeuss影院www在线播放| 亚洲熟妇无码一区二区三区导航| 成人精品一区二区三区电影黑人| 亚洲视频777| 欧美浪妇xxxx高跟鞋交| 国产欧美一区二区三区网站| 日韩精品亚洲专区| 欧美电影一二区| 天堂久久av| 欧美日韩五码| brazzers在线观看| 免费在线你懂的| 樱花在线免费观看| 激情综合网五月激情| 另类图片国产| 婷婷成人在线| 国内精品国产成人国产三级粉色| 伊人色综合一区二区三区影院视频| www 日韩| 国产色a在线| 韩国理伦片一区二区三区在线播放| 999精品视频在这里| av中文字幕在线观看第一页 | 夜夜揉揉日日人人青青一国产精品| 成人午夜精品一区二区三区| 狠狠色丁香久久婷婷综| 日韩国产成人精品| 经典一区二区三区| 激情综合色播五月| 久久99蜜桃精品| 日本vs亚洲vs韩国一区三区| 亚洲国内自拍| 欧美亚洲三区| 懂色av一区二区夜夜嗨| 国产乱色国产精品免费视频| 精品综合久久久久久8888| 精品一区二区三区蜜桃| 老司机一区二区| 丁香亚洲综合激情啪啪综合| 日本一区二区成人在线| 国产精品乱码久久久久久| 午夜成人在线视频| 日韩欧美色电影| 综合国产在线视频| 日本精品一区二区三区在线| 超碰97国产在线| 国产麻豆电影在线观看| 青青在线视频免费| 黄页网站在线播放| 女同视频在线观看| 秋霞一区二区| 激情欧美一区二区三区| 国产老肥熟一区二区三区| 国产日本一区二区| 欧美日韩国产乱码电影| 在线视频精品一| 91精品国产自产在线| 视频一区在线免费观看| 国产无套内射久久久国产| 亚洲福利二区| 国产成人精品一区二三区在线观看| 午夜电影一区| 久久99精品网久久| 欧美性xxxx18| 欧美理论电影在线观看| 秋霞在线观看一区二区三区| 国产黄色片大全| 国产精品一区三区在线观看| 亚洲激情av| 国产精品成人在线观看| 中文字幕久久亚洲| 亚洲欧洲一区二区在线观看| 色综合成人av| 精品日产免费二区日产免费二区| 国产mv日韩mv欧美| 欧美性大战久久| 成人春色激情网| 免费看成人a| 亚洲精品视频一二三区| 91蜜桃在线免费视频| 亚洲成人久久久久| 久久福利电影| 第三区美女视频在线| 精品国产乱码久久久| 91美女在线视频| 久久影视电视剧免费网站| 成人免费观看在线| 校园春色亚洲色图| 久久精品久久综合| 亚洲美女又黄又爽在线观看| 亚洲国产精品日韩| 国产污视频在线播放| 久久99精品视频| 尤物九九久久国产精品的特点| 成年丰满熟妇午夜免费视频| 久久野战av| 国产欧美一区二区在线| 久久精品精品电影网| 亚洲福利精品视频| 麻豆成人入口| 亚洲成av人片观看| 久久福利电影| 午夜av成人| 中文字幕巨乱亚洲| 国产欧美一区二区三区四区 | 亚洲精品电影网| 国产免费一区二区视频| 久久狠狠久久| 欧美精品丝袜中出| 秋霞在线一区二区| 夜色77av精品影院| 亚洲精品观看|