RDD簡介與基礎編程

1. 什么是RDD?

RDD(Resilient Distributed Dataset)叫做彈性分布式數據集,是Spark中最基本的數據處理模型。在代碼中,RDD是一個抽象類,他代表著一個彈性的、不可變的、可分區的、里面的元素可并行計算的集合。注意,RDD只是封裝了計算邏輯,并不保存數據。RDD是一個抽象類,需要子類去實現。不可變指的是計算邏輯不可變,如果想要改變,則要產生新的RDD。

2. 五大核心屬性

源碼中五大屬性介紹如下

1)分區列表

分區的主要目的是實現并行計算/分布式計算

2)分區計算函數

以分區為單位,進行計算,每個分區的計算函數都是一樣的

3)RDD之間的依賴關系

一個RDD能夠轉換成另一個RDD,形成一種包裝的依賴關系

4)分區器

負責如何劃分分區,分區器是Option屬性,可能有,可能沒有

5)計算每個分區的首選位置

數據存儲的節點和數據計算節點可能不一樣,判斷計算發給哪個節點更好,移動數據不如移動計算

3. 執行原理

Spark框架在執行計算時,先申請資源,然后將數據處理邏輯分解成一個個計算任務,然后將計算任務發送到已經分配資源的計算節點上,按照指定的計算模型進行計算。以Yarn集群環境為例:

其中,Yarn只是負責資源調度的,而NodeManager中的Driver才是負責任務調度的,而NodeManager中的Executor是負責任務執行的。

4. 從集合中創建RDD

通過parallelize和makeRDD方法

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")val sc = new SparkContext(sparkConf)val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[Int] = sc.makeRDD(seq)rdd.collect().foreach(println)sc.stop()

其中local[*]表示使用當前本機的核數,如果不寫[*]就用單核。parallelize和makeRDD方法本質是一樣的,makeRDD方法內部調用了parallelize方法。

makeRDD可以加上第二個參數,表示分區數量,如果不傳,會使用默認值scheduler.conf.getInt("spark.default.parallelism", totalCores),即會從sparkConf中獲取配置參數,如果沒配置,則使用totalCores,即當前環境最大核數。當然,這是針對本地模式的源碼分析。

另外使用saveAsTextFile保存每個分區的文件。

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")val sc = new SparkContext(sparkConf)val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[Int] = sc.makeRDD(seq, 2)rdd.saveAsTextFile("output")rdd.collect().foreach(println)sc.stop()

結果如下(2個分區):

可以設置sparkConf中的分區數量配置參數為5

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")
sparkConf.set("spark.default.parallelism", "5")val sc = new SparkContext(sparkConf)val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[Int] = sc.makeRDD(seq)rdd.saveAsTextFile("output")rdd.collect().foreach(println)sc.stop()

結果如下

?

分區數據的劃分可以參考

036 RDD-集合數據源-分區數據的分配

5. 從文件中創建RDD

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")val sc = new SparkContext(sparkConf)val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[String] = sc.textFile("path")rdd.collect().foreach(println)sc.stop()

path可以是文件夾,也可以是文件?,還可以加上通配符*。另外,path可以是分布式文件系統的路徑。這里的textFile是以行為單位進行讀取數據,不考慮數據來自于哪個文件。如果需要考慮數據來源于哪個文件,則需要用到wholeTextFiles方法。

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")val sc = new SparkContext(sparkConf)val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[String] = sc.wholeTextFiles("path")rdd.collect().foreach(println)sc.stop()

讀取結果形式類似如下:

可以看出,是以文件為單位進行讀取,文件全路徑名稱和文件內容以逗號隔開。

textFile也可以通過第二個參數指定分區數量,如果不傳,默認為min(scheduler.conf.getInt("spark.default.parallelism", totalCores), 2),但是第二個參數并不完全是最終分區的數量,這里只是表示最小分區數,實際分區數量可能比這個值要大。實際分區數量怎么計算可以考037 RDD-文件數據源-分區的設定。分區數據的劃分可參考038 RDD-文件數據源-分區數據的分配和039 RDD-文件數據源-分區數據的分配-案例分析???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711051.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android TextView 實現富文本顯示

android TextView 實現富文本顯示,實現抖音直播間公屏消息案例 使用: val tvContent: TextView helper.getView(R.id.tvContent)//自己根據UI業務要求,可以控制 圖標顯示 大小val levelLabel MyImgLabel( bitmap 自己業務上的bitmap )va…

第零章_計算機導論

0.1 計算機:輔助人腦的好工具 所謂的計算機就是一種計算器,而計算器其實是:『接受用戶輸入指令與數據,經由中央處理器的數學與邏輯單元運算處理后,以產生或儲存成有用的信息』。因此,只要有輸入設備(不管是鍵盤還是觸摸…

UE5基于RumtimeFBXImport插件使用C++加載服務器上fbx文件方法

UE5的RumtimeFBXImport插件其實只能加載本機的fbx文件,要加載服務器上的fbx文件的話,需要先將該fbx文件下載到本地,然后再使用RumtimeFBXImport插件加載。 示例文件如下: #include "Loader/WebLoader.h" #include &quo…

HTML5:七天學會基礎動畫網頁4

backgorund-size 值與說明 length(單位像素):設置背景圖片高度和寬度,第一個值設置寬度,第二個值設置高度,如果只給出一個值,第二個是設置為auto。 percentage(百分比):以父元素的百分比來設置背景圖像的寬度和高度&#xff0c…

CSS技巧:實現兩個div在同一行顯示的方法

css如何讓兩個div在同一行顯示 - web開發 - 億速云 在Web開發中,經常遇到需要將多個元素水平排列在同一行的情況。其中一個常見的需求是將兩個div元素放置在同一行上,使它們并排顯示。在本文中,我們將介紹幾種實現這一效果的CSS方法。 1. 使…

TypeScript基礎知識:類型推導和上下文類型化

在 TypeScript 中,類型推導和上下文類型化是兩個重要的概念。它們使得代碼編寫更加簡潔、可讀性更高,并且幫助我們避免冗余的類型注解。本文將深入探討這兩個概念,并通過示例代碼演示它們的用法和好處。 一、類型推導 類型推導是 TypeScript…

day06_菜單管理(查詢菜單,添加菜單,添加子菜單,修改菜單,刪除菜單,角色分配菜單,查詢菜單,保存菜單,動態菜單)

文章目錄 1 菜單管理1.1 表結構介紹1.2 查詢菜單1.2.1 需求說明1.2.2 頁面制作1.2.3 后端接口SysMenuSysMenuControllerSysMenuServiceMenuHelperSysMenuMapperSysMenuMapper.xml 1.2.4 前端對接sysMenu.jssysMenu.vue 1.3 添加菜單1.3.1 需求說明1.3.3 頁面制作1.3.3 后端接口…

【git隨筆,日常積累】

Git常用基礎 branch 查看所有分支: git branch -a切換到分支:git checkout develop創建分支并切換到:git checkout -b develop創建一個新分支:git checkout --orphan new_branch --orphan 選項用于創建一個沒有歷史記錄的分支 刪…

騰訊云安裝MYSQL遠程連接不上解決方案

推薦安裝步驟博客,寫的很詳細,如果不會安裝的話,可以根據安裝步驟一直走。 Windows10下超詳細Mysql安裝_win10安裝mysql-CSDN博客 修改 my.cnf或者my.ini 找到里面bind-address將bind-address 127.0.0.1設置成bind-address 0.0.0.0&#x…

AI英語學習助手-幫助建立詞庫和句子-極簡安裝(python基于Django和 OpenAI GPT API的網站程序)

AI英語學習助手-幫助建立詞庫和句子-極簡安裝(python基于Django和 OpenAI GPT API的網站程序) 學了很久的英語,但是發現還是被單詞困住了,天天查句子查單詞太麻煩,現在有了Chat GPT,能夠很好得幫助學習英語…

CSP-202109-2-非零段劃分

CSP-202109-2-非零段劃分 【70分思路-暴力枚舉】 這段代碼的目的是在給定一個由自然數(非負整數)組成的數組后,通過選擇一個適當的正整數 p,將數組中所有小于 p 的數變為 0,從而使得數組中非零段的數量達到最大。這里…

使用 gma 繪制隋唐洛陽城

背景 最近河南文旅大伙,給家鄉帶了一波熱度,想想又是王子又是公主,著實羨慕。出門在外,還是對加很有感覺得,不過很遺憾,本人不能為家鄉做出貢獻,只能使用這種小伎倆,稍稍展示&#…

【網絡編程】理解客戶端和服務器并使用Java提供的api實現回顯服務器

目錄 一、網絡編程 二、客戶端和服務器 三、客戶端和服務器的交互模式 四、TCP 和 UDP UDP socket api 的使用 1、DatagramSoket 2、DatagramPacket TCP socket api 的使用 1、ServerSocket 2、Socket 一、網絡編程 本質上就是學習傳輸層給應用層提供的 api&#x…

Leetcode 128. 最長連續序列

最長連續序列 給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1: 輸入:nums [100,4,200,1,3,2] 輸出&am…

ARM簡介

ARM:ARM是Advanced RISC Machine的縮寫,意為高級精簡指令集計算機。 英國ARM公司,2016年被軟銀創始人孫正義斥資320億美元收購了。現在是軟銀旗下的芯片設計公司,總部位于英國劍橋,專注于設計芯片,賣芯片生…

揭秘:頭部房企如何借助數據分析實現穩健發展?

房地產行業是我國國民經濟中的重要支柱產業之一,在房地產市場供求關系發生重大變化的當下,房企面臨多重挑戰。Kyligence 服務的這家頭部房企把發展的重點聚焦于內生,關注內生的轉化率、接管的效率以及內生毛利率的提升,引入 Kylig…

基于springboot實現保險信息網站系統項目【項目源碼+論文說明】計算機畢業設計

基于springboot實現保險信息網站系統演示 摘要 隨著互聯網的不斷發展,現在人們獲取最新資訊的主要途徑來源于網上新聞,當下的網上信息宣傳門戶網站的發展十分的迅速。而保險產品,作為當下人們非常關注的一款能夠給人們帶來醫療、生活、養老或…

面試筆記系列七之多線程+分布式系統基礎知識點整理及常見面試題

目錄 多線程 介紹一下線程的生命周期及狀態? 線程的sleep、wait、join、yield如何使用? sleep與yield方法的區別在于, 進程調度算法 創建線程有哪些方式? 什么是守護線程? ThreadLocal的原理是什么,…

當大語言模型遇到AI繪畫-google gemma與stable diffusion webui融合方法-礦卡40hx的AI一體機

你有想過建一臺主機,又能AI聊天又能AI繪畫,還可以直接把聊天內容直接畫出來的機器嗎? 當Google最新的大語言模型Gemma碰到stable diffusion webui會怎么樣? 首先我們安裝stable diffusion webui(automatic1111開源項目&#xff…

微信小程序構建npm失敗解決方式

安裝完所需要的依賴后,在微信開發者工具菜單欄中選擇:“工具” -> “構建 npm”,但是失敗。 解決方法:修改 project.config.json 開發者工具創建的項目,miniprogramRoot 默認為 miniprogram,package.js…