當我從本地RDD注冊一張表和從DB注冊一張表時,我發現兩個表之間的join操作真的很慢。
來自DB的表實際上是一個有多個join操作的SQL,本地RDD只有20條記錄。
我很好奇它背后的機制。
我們是否從遠程資料庫中提取資料并在本地 Spark 集群中執行所有任務?
或者我們是否有一個“有趣的”SQL 引擎來向資料庫發送優化的查詢并等待查詢結果回傳?在我看來,這種方式沒有意義,因為查詢在 DB 中執行得非常快。
uj5u.com熱心網友回復:
Spark SQL 將在其一側運行查詢。當你在第一步定義一些表加入查詢時,它會在集群中獲取表并將它們作為RDD或Dataframe保存在記憶體中,最后運行一些任務來執行查詢操作。
在您的示例中,我們假設第一個 RDD 已經在記憶體中,但第二個需要獲取。該資料源會要求你的SQL引擎取表。但是在交付表之前,由于它是一個具有多個連接的查詢,您的 SQL 引擎將在其一側運行查詢(與 Spark 集群不同)并在表準備好時交付結果。假設 SQL 引擎需要TA秒來運行查詢(在 SQL 客戶端中可以看到總結果,而不是最高結果),并且將資料移動到 sql 集群(可能通過網路)需要TB秒。在TA TB第二個資料準備好 Spark 運行。
如果TC是加入操作的時間,則總時間將為total = TA TB TC。您需要檢查瓶頸在哪里。我認為TB可能是大資料的關鍵。
但是,當使用具有兩個或更多 worker 的集群時,請確保所有節點都參與操作。有時,由于編碼錯誤,spark 會只使用一個節點進行操作。確保您的資料分布在集群上,以便從資料區域性中受益。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333876.html
下一篇:ApacheBeamjava.lang.IllegalArgumentException:無效的lambda反序列化
