spark
1. Spark的四大特性
- 速度快
-
spark比mapreduce快的兩個原因
-
- 基于記憶體
1. mapreduce任務后期在計算的是時候,每一個job的輸出結果都會落地到磁盤,后續有其他的job要依賴于前面job的輸出結果,這個時候就需要進行大量的磁盤io操作,性能較低 2. spark任務后期在進行計算的時候,job的結果是可以保存在記憶體中的,后面有其他的job需要以言語前面job的輸出結果,這個時候可以直接從記憶體中讀取,避免了磁盤io操作,性能比較高 spark程式和mapreduce程式都會產生shuffle階段,在shuffle階段中他們產生的資料都會保留在磁盤中-
- 行程與執行緒
1 mapreduce任務以行程的方式運行在yarn集群中,比如說有100個mapTask,一個task就需要一個行程,這些task要運行就需要開啟100個行程 2 spark任務以執行緒的方式運行在行程中,比如說有100個task,則一個task就對應一個執行緒- 易用性
- 可以用java、scala、python、R等不同的語言來快速撰寫spark程式
- 通用性
- 兼容性
- spark程式有多種運行模式
- standAlone
- spark自帶的獨立運行模式,整個任務的資源分配由spark集群的的Master來負責
- yarn
- 可以把spark程式提交到yarn上運行,整個任務的資源分配由yarn中的ResourceManager負責
- mesos
- apache開源的一個類似于yarn的資源調度平臺
- standAlone
- spark程式有多種運行模式
-
2. spark集群架構
? 
- Driver
- 他會執行客戶端寫好的main方法,構建一個SparkContext物件(該物件是所有spark程式的執行入口)
- Application
- 是一個spark的應用程式,包含了客戶端的代碼和任務運行的資源資訊
- ClusterManager
- 給程式提供計算資源的外部服務
- standAlone
- spark自帶的集群模式,整個任務的資源分配由spark集群的Master負責
- yarn
- 把spark程式提交到yarn中運行,整個任務的資源分配由yarn中的ResourceManager負責
- mesos
- apache開源的一個類似于yarn的資源調度平臺
- standAlone
- 給程式提供計算資源的外部服務
- 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 |
| 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 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/35419.html
標籤:大數據
上一篇:實戰kudu集成impala
下一篇:mysql配置遠程登錄
