val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word, 1))
對於上面的例子,我們知道有兩個轉換函數。他們都必須在同一個進程\服務器上運行,但是我想使第二個轉換運行在與第一個服務器不同的服務器上以實現可伸縮性,是否有可能?我們可以爲運行在不同服務器上的Spark Streaming創建不同的轉換函數嗎?
val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word, 1))
對於上面的例子,我們知道有兩個轉換函數。他們都必須在同一個進程\服務器上運行,但是我想使第二個轉換運行在與第一個服務器不同的服務器上以實現可伸縮性,是否有可能?我們可以爲運行在不同服務器上的Spark Streaming創建不同的轉換函數嗎?
要澄清事情:Spark轉換不是一個實際的執行。 Spark中的轉換是懶惰的,這意味着在您調用某個動作(例如save
,collect
)之前,什麼都不會執行。行動是Spark的一項工作。
因此,基於上述情況,您可以控制作業,但無法控制轉換。 Spark的工作將通過拆分其中的已處理數據(RDD)來分發給多個執行者。每個執行者將在其拆分中應用該工作(多重轉換),然後再次收集結果。這將顯着減少網絡使用。
如果你可以執行你所提出的問題,那麼中間結果(你實際上不關心的)應該通過網絡進行轉換,而這又會增加很大的網絡開銷。
對於正常的火花批處理作業,它將分佈在多個執行器上,但是您確定火花流式微批處理的作業也將分發到多個執行器上? –
從Spark Streaming編程指南[https://spark.apache.org/docs/2.1.0/streaming-programming-guide.html]:「在內部,它的工作原理如下:Spark Streaming接收實時輸入數據流並將數據分批處理,然後由Spark引擎處理,以批量生成最終結果流。「所以基本上沒有區別。 – Mousa
你爲什麼不讓Spark處理可伸縮性?這是它的全部目的... –
也許一些變化非常嚴重,所以我需要將它們與其他變換隔離。無論如何,如果我需要這個要求,有可能嗎?比如將第一次轉換的結果轉移到另一臺服務器上,另一臺服務器繼續以平穩的方式繼續進行轉換。 –
使用Spark這樣的框架的重點在於避免處理低級細節。另外,Spark是存在的最具可擴展性的平臺之一。除非你是分佈式系統的「主人」,否則你很難想出一個比僅僅使用Spark更可擴展的應用程序。 –