At a high level, every Spark application consists of a driver program that runs the user’s main function and executes various parallel operations on a cluster.
來自 <http://spark.apache.org/docs/latest/rdd-programming-guide.html>
提供兩個抽象,第一個抽象是RDD,第二個是共享變量
一、RDD彈性分佈式數據集
分佈式數據架構,即 rDD,Spark的核心數據結構。
RDD 的三種種創建方式:
1、來自內存中的對象集合(也稱爲並行化的一個集合)sc.parallize(data)data可以是一個Array
2、從Hadoop文件系統(或與Hadoop兼容的其他持久化存儲系統,如Hive、
Cassandra、 Hbase)輸入(如HDFS)創建
3、從父RDD轉換得到新的RDD
第一種方法用於對少量的輸入數據進行並行的CPU密集型計算。
第二種方法是創建一個對外部數據集的引用,sc.textFile(),括號裏的路徑可以是任何Hadoop文件系統的路徑。
第三種方法,從已有的RDD進行轉換,Transformation,轉換是惰性的。
轉換常用的操作有:映射、分組、聚合、重新分區、採樣、連接RDD以及把RDD作爲集合處理
持久化:.cache()標記需要緩存的中間結果,並不會立即緩存RDD
序列化:一般用Java序列化機制,spark中採用Kryo序列化機制。要使用它需要在conf中設置spark.serializer的屬性
共享變量:廣播變量和累加器
RDD的兩種操作算子
變換(Transformation)和動作(Action)
變換操作是延時執行的,從一個RDD轉換生成另一個RDD的操作不是馬上執行,而是要等到有Action操作時才觸發。
Action算子會觸發spark作業提交,並將數據輸出到spark系統。
RDD 的內部屬性。
1、分區列表
2、計算每個分片的函數
3、對父RDD的依賴列表
4、對Key-Value對數據類型RDD的分區器,控制分區策略和分區數。
5、每個數據分區的地址列表(如HDFS上的數據塊的地址)。
Spark數據存儲的核心是RDD,RDD可以被理解爲一個抽象的數組,但這個數組是分佈在集羣上的,邏輯上RDD的每個分區叫一個Partition。經歷每一次Transformation操作之後,就會將RDD轉換成另一個新的RDD
本質上RDD 是數據的元數據結構,存儲的是數據分區及其邏輯結構映射關係,存儲rdd之前的依賴轉換關係。實際的物理塊block是由blockManager進行管理的。
Spark算子分類,在程序運行過程中通過算子對RDD進行轉換。
1、spark算子的作用:算子是RDD中定義的函數。包括輸入函數、運行轉換函數、輸出函數,每一步操作都可以認爲是一個算子。
輸入:如textFile從文件讀取、parallellize方法輸入scala集合或數據輸入spark,數據進入spark後轉換爲spark數據塊,通過blockmanager進行管理
運行:輸入spark形成RDD後就可以通過變換算子,如filter、map等轉換爲新的RDD。如果數據需要複用,就可以通過cache()將數據緩存到內存。
輸出:saveAsTextFile輸出到HDFS或collect()操作輸出scala集合,count()直接返回。
RDD是個抽象類,具體實現由其子類如MappedRDD、ShuffledRDD等。
2、spark算子的分類:
三類:value型的transformation算子、key-value型的transformation算子、Action算子,會觸發SparkContext提交Job作業。
第一類:又可以分爲五種:
如map(),實現子類MappedRDD的方法。flatmap(),與map類似
mapPartitions、glom。這些都是輸入輸出一對一型
union、cartesian笛卡爾積。這些是輸入與輸出多對一型
groupBy 輸入與輸出多對多
filter、distinct、substract(集合的差操作)、sample、takeSample輸出爲輸入的子集
cache、persist Cache類型
第二類:Key-Value型的
三種類型:輸入分區與輸出分區一對一如mapValues(只對值進行map操作)
對單個RDD或兩個RDD聚集:單個如combineByKey、reduceByKey、partitonBy
對兩個rdd聚集:如cogroup
連接 join、LeftOutJoin、rightOutJoin
第三類:Actions算子
分類:無輸出、HDFS、scala集合、數據類型
foreach、saveAsTextFile、saveAsObjectFile、collect、collectAsMap、reduceByKeyLocally、lookup、count、top、reduce、fold、aggregate
Spark作業的運行機制:driver和executor
兩種類型的任務,shffle map和result,除了結果計算的最終階段外,其他任務都算作shfflemap 任務。
當對RDD執行一個動作時,會自動提交一個spark作業,導致sparkcontext調用runJob,然後調用傳遞給作爲driver的一部分運行的調度程序。。調度程序由DAG調度程序和任務調度程序組成。DAG把作業分解爲若干階段,這些階段構成一個DAG;任務調度程序則把每個階段的任務提交到集羣。
二、共享變量