SparkStreaming拉取Kafka中數據,處理后入庫。整個流程速度很慢,除去代碼中可優化的部分,也在spark集群中找原因。
發現:
集群在處理數據時存在移動數據與移動計算的區別,也有些其他叫法,如:數據本地化、計算本地化、任務本地化等。
自己簡單理解:
假設集群有6個節點,來了一批數據共12條,數據被均勻的分布在了每個節點,也就是每個節點2條。現在要開始處理這些數據。
一種情況是:某數據由哪個節點處理被隨機的分配,類似A節點存了數據1和數據2卻可能被要求處理C節點的數據5和數據6,C節點的數據5和數據6就被備份到A節點,而A節點的數據又要備份到其他某一節點用於被處理。集群節點間存在大量數據移動,影響了速度。
另一種情況:某節點自身儲存的數據就由自身來處理,比如A節點存儲了數據1和數據2,那么數據1和數據2就由A節點來計算,C節點存儲了數據5和數據6,那么數據5和數據6就由C節點來計算。這也就避免了數據的移動。
當然實際要比我描述的復雜得多,我的理解肯定也有不對的地方。
瀏覽器打開spark 8080端口master界面,圖中紅色箭頭處如果顯示各機器IP地址那就很有可能會造成移動數據的問題。

解決:
先停止spark集群,在master機器用 start-master.sh 啟動,然后分別在每一台worker機器用 start-slave.sh -h 本機hostname spark://master機器hostname:7077 啟動。
過程中可能遇到很多問題,多注意每台機器上的幾個文件中的內容是否有問題:/etc/hosts, spark中conf文件夾中spark-env.sh和slaves
