Spark基礎和RDD

来源:https://www.cnblogs.com/William364248886/archive/2020/01/29/12239488.html
-Advertisement-
Play Games

spark 1. Spark的四大特性 1. 速度快 spark比mapreduce快的兩個原因 1. 基於記憶體 2. 進程與線程 2. 易用性 1. 可以用java、scala、python、R等不同的語言來快速編寫spark程式 3. 通用性 4. 相容性 1. spark程式有多種運行模式 s ...


spark

1. Spark的四大特性

  1. 速度快
  • spark比mapreduce快的兩個原因

      1. 基於記憶體
    1. mapreduce任務後期在計算的是時候,每一個job的輸出結果都會落地到磁碟,後續有其他的job要依賴於前面job的輸出結果,這個時候就需要進行大量的磁碟io操作,性能較低
    
    2. spark任務後期在進行計算的時候,job的結果是可以保存在記憶體中的,後面有其他的job需要以言語前面job的輸出結果,這個時候可以直接從記憶體中讀取,避免了磁碟io操作,性能比較高
    
    spark程式和mapreduce程式都會產生shuffle階段,在shuffle階段中他們產生的數據都會保留在磁碟中
      1. 進程與線程
      1 mapreduce任務以進程的方式運行在yarn集群中,比如說有100個mapTask,一個task就需要一個進程,這些task要運行就需要開啟100個進程
    
      2 spark任務以線程的方式運行在進程中,比如說有100個task,則一個task就對應一個線程
    1. 易用性
    2. 可以用java、scala、python、R等不同的語言來快速編寫spark程式
    3. 通用性
    4. 相容性
      1. spark程式有多種運行模式
        • standAlone
          • spark自帶的獨立運行模式,整個任務的資源分配由spark集群的的Master來負責
        • yarn
          • 可以把spark程式提交到yarn上運行,整個任務的資源分配由yarn中的ResourceManager負責
        • mesos
          • apache開源的一個類似於yarn的資源調度平臺

2. spark集群架構

Spark cluster components

  • Driver
    • 他會執行客戶端寫好的main方法,構建一個SparkContext對象(該對象是所有spark程式的執行入口)
  • Application
    • 是一個spark的應用程式,包含了客戶端的代碼和任務運行的資源信息
  • ClusterManager
    • 給程式提供計算資源的外部服務
      • standAlone
        • spark自帶的集群模式,整個任務的資源分配由spark集群的Master負責
      • yarn
        • 把spark程式提交到yarn中運行,整個任務的資源分配由yarn中的ResourceManager負責
      • mesos
        • apache開源的一個類似於yarn的資源調度平臺
  • Master
    • Spark集群的主節點,負責任務資源的分配
  • Worker
    • Spark集群的從節點,負責任務計算的節點
  • Executor
    • 是一個在worker節點啟動的進程
  • Task
    • spark任務的以task線程的方式運行在worker節點的executor進程中的

3. RDD是什麼

  • RDD (Resilient Distributed Dataset)叫做彈性分散式數據集,是Spark中最基本的抽象單位。它代表的是是一個不可變的、可分區的、裡面元素可以並行計算的數據集合。
    • Resilient 彈性的,表示RDD中的數據既可以保存在磁碟上也能保存在記憶體中
    • Distibuted 分散式的,表示RDD的數據是分散式存儲的,方便後期的各種計算
    • Dataset 一個數據集合,可以存儲很多數據

4. RDD的五大屬性

  • A list of partitions
    • 一個分區列表,數據集的基本組成單位
      • 這裡表示的是一個RDD可能會有多個分區,每個分區會存儲該RDD的一部分數據,Spark中任務是以task線程的方式運行的,一個分區就對應一個task
  • A function of computing each split
    • 一個用來計算每個分區的函數
      • Spark中RDD的計算是以分區為單位的
  • A list of dependencies on other RDDs

    • 一個RDD會依賴於其他多個RDD

      這裡是說RDD和RDD之間是有依賴關係的,spark任務的容錯機制就是根據這個特性(血統)而來
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)

    • 一個Patitioner,即RDD的分區函數(可選項)

          spark中實現了兩種類型的分區函數
          1 基於哈希的HashPartitioner,(key.hashcode % 分區數 = 分區號)
          2 基於範圍的RangePartitioner
      
          只有對於key-value的RDD,並且產生shuffle,才會有Partitioner
          非key-value的RDD的Partitioner的值是None
  • Optionally, a list of preferred locations to compute each split in (e.g. block locations for an HDFS file)

    • 一個列表,存儲每個Partition的優先位置(可選項)

      spark任務在調度的時候會優先考慮存有數據的節點開啟計算任務,以減少數據的網路傳輸,提成計算效率

5. RDD運算元分類

  • transformation(轉換)
    • 根據已經存在的RDD轉換生成另外一個新的RDD,它是延遲載入,不會立即執行
      • map、flatMap、reduceByKey
  • action(動作)
    • 會觸發任務的運行
      • 將RDD計算的結果數據返回給Driver端,或者保存到外部存儲介質(磁碟、記憶體、HDFS)
      • collect、saveAsTextFile

6. RDD常見的運算元操作

6.1 transformation運算元

轉換 含義
map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函數轉換後組成
filter(func) 返回一個新的RDD,該函數由經過func函數計算並且返回值為true的輸入元素組成
flatMap(func) 類似於map,但每一個輸入元素可以被映射為0或多個輸出元素(所以func應該返回一個序列,而不是單一的元素)
mapPartitions(func) 類似於map,但獨立地在RDD的每一個分片上運行,因此在類型為T的RDD上運行時,func的函數類型必須是Iterator[T] => Iterator[U]
mapPartitionsWithIndex(func) 類似於mapPartitions,但func帶有一個整數參數表示分片的索引值,因此在類型為T的RDD上運行時,func的函數類型必須是Iterator[T] => Iterator[U]
union(otherDataset) 對源RDD和參數RDD求並集,並返回一個新的RDD
intersection(otherDataset) 對源RDD和參數RDD求交集,並返回一個新的RDD
distinct([numTasks])) 對源RDD進行去重之後返回一個新的RDD
groupByKey([numTasks]) 在一個(k,v)類型的RDD上調用,返回一個(k,v)的RDD
reduceByKey(func, [numTasks]) 在一個(k,v)類型的RDD上調用,返回一個(k,v)的RDD,使用指定的reduce函數,將相同key的值聚合到一起,與groupByKey類似,reduce任務的個數可以通過第二個參數來設置
sortByKey([ascending], [numTasks]) 在一個(k,v)的RDD上調用,k必須實現Ordered介面,返回一個按照key進行排序的(k,v)RDD
sortBy(func,[ascending], [numTasks]) 與sortByKey類似,但是更靈活,可以自定義排序func
join(otherDataset, [numTasks]) 在類型為(k,v)和(k,w)的RDD上調用,返回一個相同 key對應的所有元素對在一起的(k,(v,w))的RDD
cogroup(otherDataset, [numTasks]) 在類型為(K,V)和(K,W)的RDD上調用,返回一個(K,(Iterable,Iterable))類型的RDD
coalesce(numPartitions) 減少RDD的分區數到指定值
repartition(numPartitions) 重新給RDD分區
repartitionAndSortWithinPartitions(partitioner) 重新給RDD分區,並且每個分區內以記錄的key排序

6.2 action運算元

動作 含義
reduce(func) reduce將RDD中元素前兩個傳給輸入函數,產生一個新的return值,新產生的return值與RDD中下一個元素(第三個元素)組成兩個元素,再被傳給輸入函數,直到最後只有一個值為止。
collect() 在驅動程式中,以數組的形式返回數據集的所有元素
count() 返回RDD的元素個數
first() 返回RDD的第一個元素(類似於take(1))
take(n) 返回一個由數據集的前n個元素組成的數組
takeOrdered(n, [ordering]) 返回自然順序或者自定義順序的前 n 個元素
saveAsTextFile(path) 將數據集中的元素以textFile的形式保存到HDFS文件系統或者其他支持的文件系統,對於每個元素,Spark將會調用toString方法,將它裝換為文件中的文本
saveAsSequenceFile(path) 將數據集中的元素以Hadoop sequenceFile的格式保存到指定的目錄,可以是HDFS或者其他Hadoop支持的文件系統
saveAsObjectFile(path) 將數據集的元素以Java序列化的方式保存到指定的目錄下
countByKey() 針對(k,v)類型的RDD,返回一個(k,int)的map,表示每一個key對應的元素個數
foreach(func) 在數據集上每個元素上,運行函數func
foreachPartition(func) 在數據集的每個分區上,運行函數func

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、結構(Struct)是CTS中五種基本類型之一,是一種值類型,同樣封裝了同屬一個邏輯單元的數據和行為,這些數據和行為通過結構中的成員表示;結構與類共用大多數相同的語法,但結構比類受到的限制更多,結構適用於表示輕量級類型;使用struct關鍵字定義結構: //定義一個公共結構MyStruct pu ...
  • 大家在使用EntityFrameworkCore的DBFirst的腳手架(Scaffolding)時應該遇到過Build Failed的錯誤,而沒有任何提示,我也遇到過不少次,目前已經完美解決並將排查方法分享給大家: (1)對於要使用腳手架的項目,首先要確保項目是可以正常編譯運行的,在VisualS ...
  • 這是第三篇了,第一篇只是介紹,第二篇介紹了api項目的運行和啟動,如果api項目沒什麼問題了,調試都正常了,那基本上就沒什麼事了,由於這一篇是講前端項目的,所以需要運行angular項目了,由於前端項目是需要調用介面的,好像要配置跨域,跨域這個東西,你可以在asp.net core項目上配置,這樣在 ...
  • 前兩章學習了WPF事件的工作原理,現在分析一下在代碼中可以處理的各類事件。儘管每個元素都提供了許多事件,但最重要的事件通常包括以下5類: 生命周期事件:在元素被初始化、載入或卸載時發生這些事件。 滑鼠事件:這些事件是滑鼠動作的結果。 鍵盤事件:這些事件是鍵盤動作(如按下鍵盤上的鍵)的結果。 手寫筆事 ...
  • 一、類(Class)是CTS中五種基本類型之一,是一種引用類型,封裝了同屬一個邏輯單元的數據(Data)和行為(Behavior),這些數據和行為通過類中的成員表示;使用class關鍵字定義類: //定義一個公共類MyClass public class MyClass { public int M ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 C WPF 一個設計界面 今天正月初三,大家在家呆著挺好,不要忘了自我充電。 武漢人民加油,今早又有噩耗,24號(8號)一路走好。 閱讀導航 1. 本文背景 2. ...
  • Linux起源 操作系統出現時間線: Unix1970年誕生 ,71年用C語言重寫 Apple II 誕生於1976年 window誕生於1985年 Linux誕生於1991年,由大學生Linus Torvalds和後來的眾多愛好者共同開發完成。 想必大家看了這個時間線應該能想明白為啥Linux要出 ...
  • docker search nextcloud docker pull docker.io/nextcloud docker images mkdir /home/nextcloud chmod -R 777 nextcloud/ docker run -d --restart=always --n ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...