1. 程式人生 > >spark——spark中常說RDD,究竟RDD是什麼?

spark——spark中常說RDD,究竟RDD是什麼?

本文始發於個人公眾號:TechFlow,原創不易,求個關注


今天是spark專題第二篇文章,我們來看spark非常重要的一個概念——RDD。

在上一講當中我們在本地安裝好了spark,雖然我們只有local一個叢集,但是仍然不妨礙我們進行實驗。spark最大的特點就是無論叢集的資源如何,進行計算的程式碼都是一樣的,spark會自動為我們做分散式排程工作。

RDD概念

介紹spark離不開RDD,RDD是其中很重要的一個部分。但是很多初學者往往都不清楚RDD究竟是什麼,我自己也是一樣,我在系統學習spark之前程式碼寫了一堆,但是對於RDD等概念仍然雲裡霧裡。

RDD的英文全名是Resilient Distributed Dataset,我把英文寫出來就清楚了很多。即使第一個單詞不認識,至少也可以知道它是一個分散式的資料集。第一個單詞是彈性的意思,所以直譯就是彈性分散式資料集。雖然我們還是不夠清楚,但是已經比只知道RDD這個概念清楚多了,

RDD是一個不可變的分散式物件集合,每個RDD都被分為多個分割槽,這些分割槽執行在叢集的不同節點上。

很多資料裡只有這麼一句粗淺的解釋,看起來說了很多,但是我們都get不到。細想有很多疑問,最後我在大神的部落格裡找到了詳細的解釋,這位大神翻了spark的原始碼,找到了其中RDD的定義,一個RDD當中包含以下內容:

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

我們一條一條來看:

  1. 它是一組分割槽,分割槽是spark中資料集的最小單位。也就是說spark當中資料是以分割槽為單位儲存的,不同的分割槽被儲存在不同的節點上。這也是分散式計算的基礎。
  2. 一個應用在各個分割槽上的計算任務。在spark當中資料和執行的操作是分開的,並且spark基於懶計算的機制,也就是在真正觸發計算的行動操作出現之前,spark會儲存起來對哪些資料執行哪些計算。資料和計算之間的對映關係就儲存在RDD中。
  3. RDD之間的依賴關係,RDD之間存在轉化關係,一個RDD可以通過轉化操作轉化成其他RDD,這些轉化操作都會被記錄下來。當部分資料丟失的時候,spark可以通過記錄的依賴關係重新計算丟失部分的資料,而不是重新計算所有資料。
  4. 一個分割槽的方法,也就是計算分割槽的函式。spark當中支援基於hash的hash分割槽方法和基於範圍的range分割槽方法。
  5. 一個列表,儲存的是儲存每個分割槽的優先儲存的位置。

通過以上五點,我們可以看出spark一個重要的理念。即移動資料不如移動計算,也就是說在spark執行排程的時候,會傾向於將計算分發到節點,而不是將節點的資料蒐集起來計算。RDD正是基於這一理念而生的,它做的也正是這樣的事情。

建立RDD

spark中提供了兩種方式來建立RDD,一種是讀取外部的資料集,另一種是將一個已經儲存在記憶體當中的集合進行並行化。

我們一個一個來看,最簡單的方式當然是並行化,因為這不需要外部的資料集,可以很輕易地做到。

在此之前,我們先來看一下SparkContext的概念,SparkContext是整個spark的入口,相當於程式的main函式。在我們啟動spark的時候,spark已經為我們建立好了一個SparkContext的例項,命名為sc,我們可以直接訪問到。

我們要建立RDD也需要基於sc進行,比如下面我要建立一個有字串構成的RDD:

texts = sc.parallelize(['now test', 'spark rdd'])

返回的texts就是一個RDD:

除了parallelize之外呢,我們還可以從外部資料生成RDD,比如我想從一個檔案讀入,可以使用sc當中的textFile方法獲取:

text = sc.textFile('/path/path/data.txt')

一般來說,除了本地除錯我們很少會用parallelize進行建立RDD,因為這需要我們先把資料讀取在記憶體。由於記憶體的限制,使得我們很難將spark的能力發揮出來。

轉化操作和行動操作

剛才我們在介紹RDD的時候其實提到過,RDD支援兩種操作,一種叫做轉化操作(transformation)一種叫做行動操作(action)。

顧名思義,執行轉化操作的時候,spark會將一個RDD轉化成另一個RDD。RDD中會將我們這次轉化的內容記錄下來,但是不會進行運算。所以我們得到的仍然是一個RDD而不是執行的結果。

比如我們建立了texts的RDD之後,我們想要對其中的內容進行過濾,只保留長度超過8的,我們可以用filter進行轉化:

textAfterFilter = texts.filter(lambda x: len(x) > 8)

我們呼叫之後得到的也是一個RDD,就像我們剛才說的一樣,由於filter是一個轉化操作,所以spark只會記錄下它的內容,並不會真正執行。

轉化操作可以操作任意數量的RDD,比如如果我執行如下操作,會一共得到4個RDD:

inputRDD = sc.textFile('path/path/log.txt')
lengthRDD = inputRDD.filter(lambda x: len(x) > 10)
errorRDD = inputRDD.filter(lambda x: 'error' in x)
unionRDD = errorRDD.union(lengthRDD)

最後的union會將兩個RDD的結果組合在一起,如果我們執行完上述程式碼之後,spark會記錄下這些RDD的依賴資訊,我們把這個依賴資訊畫出來,就成了一張依賴圖:

無論我們執行多少次轉化操作,spark都不會真正執行其中的操作,只有當我們執行行動操作時,記錄下來的轉化操作才會真正投入運算。像是first(),take(),count()等都是行動操作,這時候spark就會給我們返回計算結果了。

其中first的用處是返回第一個結果,take需要傳入一個引數,指定返回的結果條數,count則是計算結果的數量。和我們逾期的一樣,當我們執行了這些操作之後,spark為我們返回了結果。

本文著重講的是RDD的概念,我們下篇文章還會著重對轉化操作和行動操作進行深入解讀。感興趣的同學不妨期待一下吧~

今天的文章就是這些,如果覺得有所收穫,請順手點個關注或者轉發吧,你們的舉手之勞對我來說很重要。

相關推薦

spark——sparkRDD究竟RDD是什麼?

本文始發於個人公眾號:TechFlow,原創不易,求個關注 今天是spark專題第二篇文章,我們來看spark非常重要的一個概念——RDD。 在上一講當中我們在本地安裝好了spark,雖然我們只有local一個叢集,但是仍然不妨礙我們進行實驗。spark最大的特點就是無論叢集的資源如何,進行計算的程式碼都是

配置sparksql讀hivedataframe和RDDRDD轉換成Dataframe檢視withcolumn

文章目錄 退出spark-shell 使用spark自帶檔案建立dataframe 退出安全模式 配置spark讀hive 1.pom檔案增加 2.resource下加檔案 3.修改h

spark 如何查看單個RDD分區的內容(創建分區查看分區數)

ons red code put NPU 如何 art scores 內容 spark 創建分區 val scores = Array(("Fred", 88), ("Fred", 95), ("Fred", 91), ("Wilma", 93), ("Wilma", 95

sparkRDDDataSetDataFrame的區別

接觸到spark不可避免的會接觸spark的Api;           rdd,DataFrame,DataSet, 接下來就大致說一下他們的有點以及各自的區別; 首先DataFrame,Data

spark的pair rdd看這一篇就夠了

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是spark專題的第四篇文章,我們一起來看下Pair RDD。 定義 在之前的文章當中,我們已經熟悉了RDD的相關概念,也瞭解了RDD基本的轉化操作和行動操作。今天我們來看一下RDD當中非常常見的PairRDD,也叫做鍵值對RDD

Spark效能調優-RDD運算元調優篇(深度好文面試建議收藏)

## RDD運算元調優 不廢話,直接進入正題! #### 1. RDD複用 在對RDD進行運算元時,要避免相同的運算元和計算邏輯之下對RDD進行重複的計算,如下圖所示: ![RDD的重複計算](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/210228_1.png)

Spark SQL RDD 轉換到 DataFrame

pre ase replace 推斷 expr context 利用反射 轉換 port 1.people.txtsoyo8, 35小周, 30小華, 19soyo,882./** * Created by soyo on 17-10-10. * 利用反射機制推斷RDD

spark RDDDataFrame,DataSet 介紹

列式存儲 ren gre rds 包含 執行 這一 ces 中一 彈性分布式數據集(Resilient Distributed Dataset,RDD) RDD是Spark一開始就提供的主要API,從根本上來說,一個RDD就是你的數據的一個不可變的分布式元素集

大資料之Spark(二)--- RDDRDD變換RDD的Action解決spark的資料傾斜問題spark整合hadoop的HA

一、Spark叢集執行 ------------------------------------------------------- 1.local //本地模式 2.standalone //獨立模式 3.yarn //yarn模式

spark怎麼建立RDD一個建立RDD的方式有哪些它們的區別是什麼!!(Unit2)

spark的程式設計介面包括 1.分割槽資訊,資料集的最小分片     (1)Patitions()用法:   scala> val part=sc.textFile("/user/README.md",6) part: org.apache

spark RDDreduceByKey vs groupByKey

Spark 中有兩個類似的api,分別是 reduceByKey 和 groupByKey 。這兩個的功能類似,但底層實現卻有些不同,那麼為什麼要這樣設計呢?我們來從原始碼的角度分析一下。 先看兩者的呼叫順序(都是使用預設的Partitioner,即defaultPartitioner) 所用 spark 版

spark讀取日誌檔案RDD轉化成DataFrame

一、先開啟Hadoop和spark 略 二、啟動spark-shell spark-shell --master local[2] --jars /usr/local/src/spark-1.6.1-bin-hadoop2.6/libext/com.mysql.jdbc

Spark 的鍵值對(pair RDD)操作Scala實現

一:什麼是Pair RDD?          Spark為包含鍵值對對型別的RDD提供了一些專有操作,這些操作就被稱為Pair RDD,Pair RDD是很多程式的構成要素,因為它們提供了並行操作對各個鍵或跨節點重新進行資料分組的操作介面。 二:Pair RDD的操作例項

Spark效能調優之——在實際專案重構RDD架構以及RDD持久化

一、RDD架構重構與優化是什麼。 儘量去複用RDD,差不多的RDD,可以抽取為一個共同的RDD,供後面的RDD計算時,反覆使用。 二、怎麼做? 快取級別: case "NONE" => NONE case "DISK_ONL

sparkRDD1】彈性分散式資料集RDD介紹

scala> val rdd = sc.textFile("hdfs://yarn1:8020/hmbbs_logs/access_2013_05_31.log") 16/04/27 21:45:41 INFO MemoryStore: ensureFreeSpace(219256) called w

Spark筆記整理(二):RDDspark核心概念名詞

大數據 Spark [TOC] Spark RDD 非常基本的說明,下面一張圖就能夠有基本的理解: Spark RDD基本說明 1、Spark的核心概念是RDD (resilient distributed dataset,彈性分布式數據集),指的是一個只讀的,可分區的分布式數據集,這個數據集的全

Spark函數詳解系列之RDD基本轉換

9.png cal shuff reac 數組a water all conn data 摘要: RDD:彈性分布式數據集,是一種特殊集合 ? 支持多種來源 ? 有容錯機制 ? 可以被緩存 ? 支持並行操作,一個RDD代表一個分區裏的數據集 RDD有兩種操作算子: Tra

Spark筆記整理(十三):RDD持久化性能測試(圖文並茂)

才會 不執行 分享 綠色 做的 specified ffffff cto 最好 [TOC] 1 前言 其實在之前的文章《Spark筆記整理(五):Spark RDD持久化、廣播變量和累加器》中也有類似的測試,不過當時做的測試僅僅是在本地跑代碼,並以Java/Scala代碼

統計日誌檔案訪問數量Spark加強版WordCount

  寫在前面 學習Scala和Spark基本語法比較枯燥無味,搞搞簡單的實際運用可以有效的加深你對基本知識點的記憶,前面我們完成了最基本的WordCount功能的http://blog.csdn.net/whzhaochao/article/details/72358215,這篇主

第二天 -- Spark叢集啟動流程 -- 任務提交流程 -- RDD依賴關係 -- RDD快取 -- 兩個案例

第二天 – Spark叢集啟動流程 – 任務提交流程 – RDD依賴關係 – RDD快取 – 兩個案例 文章目錄 第二天 -- Spark叢集啟動流程 -- 任務提交流程 -- RDD依賴關係 -- RDD快取 -- 兩個案例 一、Spa