1. Spark核心編程進階-yarn模式下日誌查看詳解
yarn模式下調試運行中的spark作業
在yarn模式下,spark作業運行相關的executor和ApplicationMaster都是運行在yarn的container中的
一個作業運行完了以後,yarn有兩種方式來處理spark作業列印出的日誌
這種方式的話,顧名思義,就是說,將散落在集群中各個機器上的日誌,最後都給聚合起來,讓我們可以統一查看
如果打開了日誌聚合的選項,即yarn.log-aggregation-enable,container的日誌會拷貝到hdfs上去漏嘩,並從機器中刪除
對於這種情況,可以使用yarn logs -applicationId <app ID>命令,來查看日誌
yarn logs命令,會列印出application對應的所有container的日誌出來,當然,因為日誌是在hdfs上的,我們自然也可以通過hdfs的命令行來直接從hdfs中查看日誌
日誌在hdfs中的目錄,可以通過查看yarn.nodemanager.remote-app-log-dir和yarn.nodemanager.remote-app-log-dir-suffix屬性來獲知
日誌也可以通過spark web ui來查看executor的輸出日誌
但是此時需要啟動History Server,需要讓spark history server和maprece history server運行著
並且在yarn-site.xml文件中,仿枯配置yarn.log.server.url屬性
spark history server web ui中的log url,會將你重定向到maprece history server上,去查看日誌
如果沒有打開聚合日誌選項,那麼日誌默認就是散落在各個機器上的本次磁碟目錄中的,在YARN_APP_LOGS_DIR目錄下
根據hadoop版本的不同,通常在/tmp/logs目錄下備搜洞,或者$HADOOP_HOME/logs/userlogs目錄下
如果你要查看某個container的日誌,那麼就得登錄到那台機器上去,然後到指定的目錄下去,找到那個日誌文件,然後才能查看
2. 科普Spark,Spark是什麼,如何使用Spark
科普Spark,Spark是什麼,如何使用Spark
1.Spark基於什麼演算法的分布式計算(很簡單)
2.Spark與MapRece不同在什麼地方
3.Spark為什麼比Hadoop靈活
4.Spark局限是什麼
5.什麼情況下適合使用Spark
Spark與Hadoop的對比
Spark的中間數據放到內存中,對於迭代運算效率更高。
Spark更適合於迭代運算比較多的ML和DM運算。因為在Spark裡面,有RDD的抽象概念。
Spark比Hadoop更通用
Spark提供的數據集操作類型有很多種,不像Hadoop只提供了Map和Rece兩種操作。比如map, filter, flatMap, sample, groupByKey, receByKey, union, join, cogroup, mapValues, sort,partionBy等多種操作類型,Spark把這些操作稱為Transformations。同時還提供Count, collect, rece, lookup, save等多種actions操作。
這些多種多樣的數據集操作類型,給給開發上層應用的用戶提供了方便。各個處理節點之間的通信模型不再像Hadoop那樣就是唯一的Data Shuffle一種模式。用戶可以命名,物化,控制中間結果的存儲、分區等。可以說編程模型比Hadoop更靈活。
不過由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。
容錯性
在分布式數據集計算時通過checkpoint來實現容錯,而checkpoint有兩種方式,一個是checkpoint data,一個是logging the updates。用戶可以控制採用哪種方式來實現容錯。
可用性
Spark通過提供豐富的Scala, Java,Python API及互動式Shell來提高可用性。
Spark與Hadoop的結合
Spark可以直接對HDFS進行數據的讀寫,同樣支持Spark on YARN。Spark可以與MapRece運行於同集群中,共享存儲資源與計算,數據倉庫Shark實現上借用Hive,幾乎與Hive完全兼容。
Spark的適用場景
Spark是基於內存的迭代計算框架,適用於需要多次操作特定數據集的應用場合。需要反復操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小(大資料庫架構中這是是否考慮使用Spark的重要因素)
由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。總的來說Spark的適用面比較廣泛且比較通用。
運行模式
本地模式
Standalone模式
Mesoes模式
yarn模式
Spark生態系統
Shark ( Hive on Spark): Shark基本上就是在Spark的框架基礎上提供和Hive一樣的H iveQL命令介面,為了最大程度的保持和Hive的兼容性,Shark使用了Hive的API來實現query Parsing和 Logic Plan generation,最後的PhysicalPlan execution階段用Spark代替Hadoop MapRece。通過配置Shark參數,Shark可以自動在內存中緩存特定的RDD,實現數據重用,進而加快特定數據集的檢索。同時,Shark通過UDF用戶自定義函數實現特定的數據分析學習演算法,使得SQL數據查詢和運算分析能結合在一起,最大化RDD的重復使用。
Spark streaming: 構建在Spark上處理Stream數據的框架,基本的原理是將Stream數據分成小的時間片斷(幾秒),以類似batch批量處理的方式來處理這小部分數據。Spark Streaming構建在Spark上,一方面是因為Spark的低延遲執行引擎(100ms+)可以用於實時計算,另一方面相比基於Record的其它處理框架(如Storm),RDD數據集更容易做高效的容錯處理。此外小批量處理的方式使得它可以同時兼容批量和實時數據處理的邏輯和演算法。方便了一些需要歷史數據和實時數據聯合分析的特定應用場合。
Bagel: Pregel on Spark,可以用Spark進行圖計算,這是個非常有用的小項目。Bagel自帶了一個例子,實現了Google的PageRank演算法。
End.
3. 怎樣給Spark傳遞函數
Spark的運算元很大程度上是上通過向集群上的驅動程序傳遞函數來實現的,編寫Spark應用的關鍵就是使用運算元(或者稱為轉換),給Spark傳遞函數來實現。常用的向Spark傳遞函數的方式有兩種(來自於Spark官方文檔,Spark編程指南):
第一種:匿名函數,處理的代碼比較少的時候,可以採用匿名函數,直接寫在運算元裡面:
?
1
myrdd.map(x => x+ 1)
第二種:全局單例對象中的靜態方法:先定義object對象MyFunctions,以及靜態方法:funcOne,然後傳遞MyFunctions.funcOne給RDD運算元。
?
1
2
3
4
5
6
7
8
object MyFunctions {
def funcOne(s: String): String = { ... }
}
myRdd.map(MyFunctions.funcOne)
在業務員開發中,需要把RDD的引用傳遞給某一個類的實例的某個方法,傳遞給RDD的函數,為類實例的實例方法:
?
1
2
3
4
5
6
7
class MyClass {
def funcOne(s: String): String = { ... }
def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(funcOne }
}
在這個例子中,我們定義了一個類MyClass,類的實例方法doStuff中傳入了一個RDD,RDD
運算元中調用了類的另外一個實例方法funcOne,在我么New 一個MyClass
的實例並調用doStuff的方法的時候,需要講整個實例對象發給集群,所以類MyClass必須可以序列化,需要extends
Serializable。
相似的,訪問方法外部的對象變數也會引用整個對象,需要把整個對象發送到集群:
?
1
2
3
4
5
6
class MyClass {
val field = "Hello"
def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(x => field
+ x) <span style="font-size:9pt;line-height:1.5;">}</span>
?
1
}
為了避免整個對象都發送給集群,可以定義一個局部變數來保存外部對象field的引用,這種情況尤其在一些大對象里,可以避免整個對象發送到集群,提高效率。
?
1
2
3
4
5
6
7
def doStuff(rdd: RDD[String]): RDD[String] = {
val field_ = this.field
rdd.map(x => field_ + x)
}
Spark應用最終是要在集群中運行的,許多問題在單一的本地環境中無法暴露出來,有時候經常會遇到本地運行結果和集群運行結果不一致的問題,這就要求開
發的時候多使用函數式編程風格,盡量使的寫的函數都為純函數。純函數的好處是:無狀態,線程安全,不需要線程同步,應用程序或者運行環境
(Runtime)可以對純函數的運算結果進行緩存,運算加快速度。
那麼什麼是純函數了?
純函數(Pure Function)是這樣一種函數——輸入輸出數據流全是顯式(Explicit)的。顯式(Explicit)
的意思是,函數與外界交換數據只有一個唯一渠道——參數和返回值;函數從函數外部接受的所有輸入信息都通過參數傳遞到該函數內部;函數輸出到函數外部的所
有信息都通過返回值傳遞到該函數外部。如果一個函數通過隱式(Implicit)方式,從外界獲取數據,或者向外部輸出數據,那麼,該函數就不是純函數,
叫作非純函數(Impure Function)。隱式(Implicit)的意思是,函數通過參數和返回值以外的渠道,和外界進行數據交換。比如,讀取全局變數,修改全局變數,都叫作以隱式的方式和外界進行數據交換;比如,利用I/O API(輸入輸出系統函數庫)讀取配置文件,或者輸出到文件,列印到屏幕,都叫做隱式的方式和外界進行數據交換。
在計算過程中涉及到對象的交互時,盡量選用無狀態的對象,比如對於一個bean,成員變數都為val的,在需要數據交互的地方new 一個新的。
關於(commutative and associative)交換律和結合律。在傳遞給reudce,receByKey,以及其他的一些merge,聚合的操作中的函數必須要滿足交換律和結合律,交換律和結合律就是我們數學上學過的:
a + b = b + a,a + b + c = a + (b + c)
定義的函數func(a,b)和f(b,a)應該得到相同的結果,f(f(a,b),c)和f(a,f(b,c))應該得到相同的結果。
最後說一下廣播變數和累加器的使用。在程序中不要定義一個全局的變數,如果需要在多個節點共享一個數據,可以採用廣播變數的方法。如果需要一些全局的聚合計算,可以使用累加器。
4. 《spark編程指南》pdf下載在線閱讀全文,求百度網盤雲資源
《spark編程指南》網路網盤pdf最新全集下載:
鏈接:https://pan..com/s/1SpkSEHyL685IfMzG04Ag
5. 有什麼關於 Spark 的書推薦
附錄從spark的角度解釋了Scala,並詳細解釋了Scala函數編程和面向對象編程。
6. spark編程 mysql得不到數據
「這里說明一點:本文提到的解決 Spark insertIntoJDBC找不到Mysql驅動的方法是針對單機模式(也就是local模式)。在集群環境下,下面的方法是不行的。
編程是編定程序的中文簡稱,就是讓計算機代碼解決某個問題,對某個計算體系規定一定的運算方式,使計算體系按照該計算方式運行,並最終得到相應結果的過程。
為了使計算機能夠理解人的意圖,人類就必須將需解決的問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人的指令一步一步去工作,完成某種特定的任務。這種人和計算體系之間交流的過程就是編程。
在計算機系統中,一條機器指令規定了計算機系統的一個特定動作。
一個系列的計算機在硬體設計製造時就用了若干指令規定了該系列計算機能夠進行的基本操作,這些指令一起構成了該系列計算機的指令系統。在計算機應用的初期,程序員使用機器的指令系統來編寫計算機應用程序,這種程序稱為機器語言程序。
以上內容參考:網路-編程