第四階段筆記
scala
第一天筆記
一、流行的三大語言發展史
Java:1990年開始研發,1995年投入使用
Python:1991年誕生
Scala:2003年誕生=》2013年=》10年期間無人問津=》太難了=》2013年spark框架開源了=》spark底層原始碼是Scala語言編寫的=》write less do more
二、什麼是Scala
是一門多正規化的程式語言,有著面向物件和麵向函數語言程式設計的特性
三、為什麼要學習Scala
1、優雅
2、速度快
3、能融合到hadoop生態圈
4、Spark底層原始碼是scala編寫
四、scala編譯器安裝
1、windows上安裝
2、Linux上安裝
3、開發工具上安裝
第二天筆記
一、定長陣列和變長陣列
定長陣列:陣列長度不可變
變長陣列:陣列長度可變
二、定長和變長陣列之間的轉換
定長轉變長:呼叫toBuffer方法
變長轉定長:呼叫toArray方法
三、函式
Map:對映,針對列表當中的每一個元素進行操作,操作完成後,返回一個新的列表
特點:操作之前列表當中有多少個元素,操作之後,還是多少個
filter:過濾出來我們想要的結果,摒棄掉不要的結果
四、tuple元組
最多隻能存放22個元素
五、集合
List:有序、有索引,裡面元素可以重複
Set:無序、無索引,裡面元素唯一
Map:key/value形式
在scala中,集合分為可變集合和不可變集合,
不可變集合由:scala.collection.immutable._這個包掌管
Scala當中預設建立的集合都是不可變集合
1、List
Nil:空列表,指的是List(Nothing)
:: :cons,右連線的作用
六、Option物件
Option物件裡有兩個子類
一個是Some:預設不為空
一個是None:預設為空
七、佇列Queue
特點:先進先出
第三天筆記
一、常用函式
Map:對映,針對列表當中的每一個元素進行操作,操作完成後返回一個新的列表,操作之前多少個元素,操作之後個數不變
flatMap:=map+flatten,先對映,再扁平化管理,操作之後元素的個數大於等於操作之前元素的個數。
輔助構造器首行必須呼叫主構造器或其他輔助構造器
三、App
App是特質,trait相當於java當中的介面
四、繼承
子類繼承父類,子類擁有父類當中的屬性和方法,也有自己獨特的屬性和方法
五、關鍵字
Override:重寫父類當中非抽象的屬性或方法,必須加override關鍵字;重寫父類當中抽象的屬性和方法,選加override關鍵字
Super:子類呼叫父類當中的方法,使用super關鍵字
六、抽象類
抽象欄位或抽象方法必須存在於抽象類當中或者特質中
七、樣例類
樣例類分為兩種,一種是多例樣例類:case class ; 一種是單例樣例類:case object
Case class:後面要跟構造引數
Case object:後面不能跟構造引數
八、偏函式
偏函式:一組沒有match的case語句
作用:驗證傳入的引數是否正確
第四天筆記
一.操作方法需將方法轉換成函式
1.val f1=m_ :將方法m轉換成函式
2.val f1:(Int)=>Int=m :方法自動轉換成函式
二.匿名函式
箭頭左邊是引數列表,右邊是函式體
三.遞迴函式
自己呼叫自己
四.高階函式
操作其他函式的函式
五.函式巢狀
函式內部的函式稱之為區域性函式
六.函式柯里化
將原來接受兩個引數的函式變成新的接受一個引數的函式過程,新的函式返回一個以原有第二個引數為參的函式
例: def add(x:Int,y:Int)=x+y
七、閉包
方法體當中,匿名函式計算呼叫了方法的引數就叫做閉包
八、隱式值
作用域內,相同型別的值只能存在一個
如果隱式值或隱式檢視在別的作用域內,可以通過import關鍵字呼叫
九、隱式檢視
等號左側是指要賦予誰功能
等號右側是指要賦予什麼功能
spark
第五天筆記
一、spark為什麼比mapreduce
1、mapreduce中間結果儲存在磁碟,而spark中間結果儲存在記憶體當中
2、Mapreduce執行任務開啟的是程序,而spark開啟的是執行緒
二、spark要取代hadoop
Spark不是要取代hadoop,spark是一個類似於hadoop當中mapreduce的計算框架,目的是要取代mapreduce,而分散式儲存要依賴hadfs,資源排程依然要依賴yarn。
三、執行模式
1.Standalone模式
2.Standalone-HA高可用模式
3.Yarn模式(yarn on client模式,yarn on cluster模式)
4.Local模式:local、local[N]、local[*]
四、常用術語總結
DAG有向無環圖:有方向無閉環,描述的是RDD的執行流程
一個DAG有向無環圖=一個Job
一個Job=多個stage
一個stage=一個taskSet
一個taskSet=多個task
RDD:彈性分散式資料集
運算元分為兩類:一個是transformations(轉換運算元),一個是action(執行運算元)
轉換運算元:懶執行策略,只做連線,不運算
執行運算元:帶動轉換運算元進行運算,得出結果
五、如何區分轉換運算元還是執行運算元
返回值型別是RDD的就是轉換運算元
返回值型別不是RDD的就是執行運算元
六、spark的bin目錄
Spark-shell:進入到編輯接面,可以直接書寫程式碼,用於學習測試使用
Spark-submit:提交jar包,用於開發生產使用
七、reduceByKey
針對的是(k,v)型別的資料,操作完以後依然是(k,v)型別
八、為什麼要有高可用模式
為了防止主節點單點故障問題
第六天筆記
一、什麼是RDD?RDD有什麼特點?RDD是否可以攜帶資料?
RDD:彈性分散式資料集
特點:不可變,可分割槽,可平行計算的集合
不可以攜帶資料,類似於java當中的介面
二、RDD運算元
RDD運算元分為兩類:一類是轉換運算元(Transformation),一類是執行運算元(Action)
轉換運算元:懶執行策略,只做連線,不運算,直到遇到執行運算元,才會帶動執行。
執行運算元:帶動轉換運算元運算
三、兩類運算元的區分
返回值是RDD的就是轉換運算元
返回值不是RDD的就是執行運算元
四、分割槽方式
非key,value資料分割槽方式為None
Key,value的資料可以有分割槽方式,沒有指定之前是None,但是可以指定,有這個功能
五、依賴
依賴分為兩種:一種是窄依賴,一種是寬依賴
窄依賴:父RDD的一個分割槽只能被子RDD的一個分割槽所依賴=》獨生子女
寬依賴:父RDD的一個分割槽會被子RDD的多個分割槽所依賴=》超生子女
六、DAG有向無環圖
描述的就是RDD的執行流程
七、Stage如何劃分
根據RDD的執行流程構建DAG有向無環圖,劃分好圖後,採用回溯方法,從後往前推,遇到窄依賴包含到當前stage中,遇到寬依賴斷開,形成stage。
寬依賴是劃分stage的重要依據
八、reduceByKey和groupByKey哪個效率高?為什麼?
reduceByKey效率高:因為前期進行了預聚合
九、map和mapPartitions哪個效率高
MapPartitions效率高
第七天筆記
一、reduceByKey和reduce哪個是轉換運算元,哪個是執行運算元?
reduceByKey是轉換運算元,reduce是執行運算元
二、快取的方式
快取的方式有兩種,一種cache(),一種是persist
def cache(): this.type = persist()
Cache底層呼叫的persist的無參構造,預設情況下,僅將資料快取在記憶體中。
Persist:可以將資料快取在記憶體或磁碟等地方,相對來說,比較安全
val result: RDD[Int] = result.persist(StorageLevel.MEMORY_AND_DISK)
工作當中,使用的快取方式就是這個MEMORY_AND_DISK
三、join既有可能是窄依賴,也有可能是寬依賴
四、Lineage(血統)
五、分割槽
非key,value資料分割槽方式為None
Key,value資料預設分割槽方式為None,可以指定分割槽方式
在這裡插入圖片描述
action運算元才會有RDD 一個DAG(有向無環圖)=job
轉換運算元:
- 1.map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函式轉換後組成
2.filter(func) 返回一個新的RDD,該RDD由經過func函式計算後返回值為true的輸入元素組成
3.flatMap(func) 類似於map,但是每一個輸入元素可以被對映為0或多個輸出元素(所以func應該返回一個序列,而不是單一元素)
4.mapPartitions(func) 類似於map,但獨立地在RDD的每一個分片上執行,因此在型別為T的RDD上執行時,func的函式型別必須是Iterator[T] =>
Iterator[U]
5.mapPartitionsWithIndex(func) 類似於mapPartitions,但func帶有一個整數引數表示分片的索引值,因此在型別為T的RDD上執行時,func的函式型別必須是
(Int, Interator[T]) => Iterator[U]
6.union(otherDataset) 對源RDD和引數RDD求並集後返回一個新的RDD
7.intersection(otherDataset) 對源RDD和引數RDD求交集後返回一個新的RDD(交集)
8.distinct([numTasks])) 對源RDD進行去重後返回一個新的RDD
9.groupByKey([numTasks]) 在一個(K,V)的RDD上呼叫,返回一個(K, Iterator[V])的RDD
10.reduceByKey(func, [numTasks]) 在一個(K,V)的RDD上呼叫,返回一個(K,V)的RDD,使用指定的reduce函式,將相同key的值聚合到一起,與groupByKey類似,reduce任務的個數可以通過第二個可選的引數來設定
11.aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 先按分割槽聚合 再總的聚合 每次要跟初始值交流 例如:aggregateByKey(0)(+,+) 對k/v的RDD進行操作
12.sortByKey([ascending], [numTasks]) 在一個(K,V)的RDD上呼叫,K必須實現Ordered介面,返回一個按照key進行排序的(K,V)的RDD
13.sortBy(func,[ascending], [numTasks]) 與sortByKey類似,但是更靈活 第一個引數是根據什麼排序 第二個是怎麼排序 false倒序 第三個排序後分區數 預設與原RDD一樣
14.join(otherDataset, [numTasks]) 在型別為(K,V)和(K,W)的RDD上呼叫,返回一個相同key對應的所有元素對在一起的(K,(V,W))的RDD
相當於內連線(求交集)
15.cogroup(otherDataset, [numTasks]) 在型別為(K,V)和(K,W)的RDD上呼叫,返回一個(K,(Iterable,Iterable))型別的RDD
16.cartesian(otherDataset) 兩個RDD的笛卡爾積 的成很多個K/V
17.coalesce(numPartitions) 重新分割槽 第一個引數是要分多少區,第二個引數是否shuffle 預設false 少分割槽變多分割槽 true 多分割槽變少分割槽 false
18.repartition(numPartitions) 重新分割槽 必須shuffle 引數是要分多少區 少變多
19.foldByKey(zeroValue)(seqOp) 該函式用於K/V做摺疊,合併處理 ,與aggregate類似 第一個括號的引數應用於每個V值 第二括號函式是聚合例如:+
執行運算元:
- 1.reduce(func) 通過func函式聚集RDD中的所有元素,這個功能必須是可交換且可並聯的
2.collect() 在驅動程式中,以陣列的形式返回資料集的所有元素
3.count() 返回RDD的元素個數
4.first() 返回RDD的第一個元素(類似於take(1))
5.take(n) 返回一個由資料集的前n個元素組成的陣列
6.takeSample(withReplacement,num, [seed]) 返回一個數組,該陣列由從資料集中隨機取樣的num個元素組成,可以選擇是否用隨機數替換不足的部分,seed用於指定隨機數生成器種子
7.takeOrdered(n, [ordering]) 使用自然順序或自定義比較器返回RDD的前n個元素。
8.saveAsTextFile(path) 將資料集的元素以textfile的形式儲存到HDFS檔案系統或者其他支援的檔案系統,對於每個元素,Spark將會呼叫toString方法,將它轉換為檔案中的文字
9.saveAsSequenceFile(path) 將資料集中的元素以Hadoop sequencefile的格式儲存到指定的目錄下,可以使HDFS或者其他Hadoop支援的檔案系統
10.saveAsObjectFile(path) 使用Java序列化以簡單格式編寫資料集的元素,然後可以使用Java序列化載入SparkContext.objectFile()。
11.countByKey() 針對(K,V)型別的RDD,返回一個(K,Int)的map,表示每一個key對應的元素個數。
12.foreach(func) 在資料集的每一個元素上,執行函式func進行更新。