1、關於Spark的調優部分
1)更好的序列化實現:在Spark中,需要序列化的地方包括寫入磁盤、Worker之間傳輸RDD等。默認的Java序列化性能比較低,所以將序列化的方式修改爲kryo;
2)配置多個臨時文件的目錄:在併發性高的情況下,對一個文件的操作會影響整體的性能,爲此可以創建多個文件夾,用於存放臨時文件;
3)啓用推測執行機制:類似於Hadoop中的Task任務處理,在某個Task處理速度明顯慢時,會啓用其它節點執行任務,有一個執行完就銷燬掉另一個未執行完的節點;
4)GC調優:原則上是減少Full GC,在調優之前,必須先檢查代碼部分
2、Spark的CheckPoint機制
CheckPoint的機制是建立一個檢查點,類似於快照。
在Spark的RDD依賴中,若依賴的關係太長,同時沒有將中間結果存儲,會導致計算出錯時從頭再來。爲此Spark中可以利用緩存機制將部分中間結果緩存起來,此時一定程度上解決了數據丟失問題。但是若存儲的內存或磁盤出錯,也會導致重新計算,此時出現了checkpoint機制,就是將比較重要的中間數據做一個檢查點存儲到一個高可用的地方。
補充:在SparkStreaming中,也存在checkpoint機制。在需要對歷史數據進行累計處理,可以設置一個檢查目錄,在該目錄中,存儲歷史數據。
3、Spark的數據傾斜
出現情況:join(一大一小的情況)或者groupBy(某個key出現的次數過多)
解決:使用廣播變量,將小的數據轉換Map進行廣播,廣播會將Map發送到每個節點中,合併時利用該Map進行,可以減輕數據傾斜;
groupBy出現的可以將key後添加固定格式的隨機數來減輕數據傾斜
4、SparkStreaming與Storm
相同點:都是分佈式、容錯、可擴展的處理系統
不同點:
Storm是實時數據計算,最快的處理可達10毫秒,對於數據的處理核心支持兩個級別:最多一次(可能會丟失)、最少一次(保證數據不丟失)
SparkStreaming是小批量計算,處理老版本只能到達秒級,新版本可以到達毫秒級。並且數據的處理只處理一次。由於Spark平臺的良好整合性,可以藉助於Spark的其它模塊,在開發效率上佔有一定的優勢。;
5、SparkStreaming的原理
SparkStreaming是將流式處理分解成一系列的短小的批處理作業,即按照batch size(如1秒)分成一段一段的數據DStream(discretized-離散化 Stream),每一段數據都轉換爲RDD,然後將針對SparkStreaming中的Dstream的Transformations操作轉換爲針對Spark RDD的Transformations操作,將RDD經過操作變成中間結果保存在內存中(也可以保存到磁盤)。
三種處理:只能處理最新的,處理歷史數據(checkpoint)和最新的,處理一段時間內的(滑動窗口機制)
6、Spark的模式(簡單介紹,具體請參考 https://www.jianshu.com/p/65a3476757a5 )
大致上分爲三種:本地單機模式、Spark自帶Cluster Manager的集羣模式、藉助於Yarn管理的集羣模式。
本地單機模式:主要是爲了測試代碼的邏輯;
Spark自帶Cluster Manager的集羣模式:啓動之前必須先啓動Spark的Master和Worker守護進程;
基於Yarn的Resource Manager的集羣模式:使用Yarn作爲Spark的Cluster Manager,來爲Spark的應用程序分配資源,並且啓動之前需要啓動Hadoop的各種服務。
提示:SparkSQL中的DataFrame,SparkStreaming中的DStream底層都是RDD
補充:SparkSQL的介紹
SparkSQL提供了一個成爲DataFrame(數據框),底層是RDD,類似於關係型數據庫中的表。
引入了新的RDD類型SchemaRDD;可以混合不同來源的數據,例如將HiveQL的數據和MySQL的數據進行join;在把執行語句解析後,變成RDD的計算。