2017-05-28 69 views
1

我在試驗Spark與多集羣是否可以改善慢SQL查詢。我爲master創建了兩名工作人員,他們使用本地Spark Standalone運行。是的,我將內存和內核數量減半以在本地機器上創建工作人員。我使用partitionColumn,lowerBound,UpperBoundnumberPartitions指定分區爲sqlContext,以便任務(或分區)可以分佈在工作者上。我把它們描述如下(partitionColumn是唯一的):使用Spark Multi Clusters改進SQL查詢

df = sqlContext.read.format("jdbc").options(
    url = "jdbc:sqlserver://localhost;databasename=AdventureWorks2014;integratedSecurity=true;", 
    driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver", 
    dbtable = query, 
    partitionColumn = "RowId", 
    lowerBound = 1, 
    upperBound = 10000000, 
    numPartitions = 4).load() 

我跑我在主腳本指定選項之後,但我不能讓沒有羣集上運行的火花時,對任何性能改進。我知道我應該沒有減少實驗完整性的記憶。但是我想知道,如果情況不是這樣的話,或者任何原因,情況可能如此。任何想法都歡迎。非常感謝。

+0

性能優勢通常發生在規模上,而不是在本地機器上進行試驗。 – mtoto

回答

1

這裏有很多因素起到作用,儘管每個因素的權重可能因個案而異。

  • 由於nicely pointed out通過mtoto,一臺機器上增加工人的數量,是不可能帶來任何性能提升。

    單個機器上的多個工作人員可以訪問相同的固定資源池。由於工作人員不參與處理本身,因此只需使用該池中的較高部分進行管理。

    有合理的情況下,我們更喜歡更多數量的執行器JVM,但它與增加工作者數量(前者是應用程序資源,後者是羣集資源)不一樣。

  • 目前還不清楚您是否將相同數量的內核用於基準和多工作器配置,但核心並不是您必須考慮使用Spark的唯一資源。典型的Spark作業是IO(主要是網絡和磁盤)綁定。如果不確定是否有足夠的磁盤和網絡配置,單個節點上增加的線程數量將使它們等待數據。

    單獨增加內核僅適用於受CPU限制的作業(並且這些作業在單臺計算機上通常會更好)。

  • 如果外部資源無法跟上請求,擺弄Spark資源將無濟於事。來自單個非複製數據庫的大量併發批量讀取操作只會限制服務器。

    在這種特殊情況下,您可以通過在與Spark相同的節點上運行數據庫服務器,使其更加惡化。它有一些優點(所有流量都可以通過回送),但除非數據庫和Spark使用不同的磁盤組,否則它們將通過磁盤IO(以及其他資源)進行競爭。

注意

目前尚不清楚是什麼query,但如果當對數據庫直接執行它是緩慢的,從星火將它更慢獲取它。您應該首先仔細查看查詢和/或數據庫結構和配置。

+0

感謝您的解釋。我花了些時間來了解你的回答。查詢速度很慢,因爲我故意使用where子句對沒有索引的字段進行表掃描。據我所知,在從存儲(磁盤I/O)和內存(內存綁定)讀取後,查詢中的謂詞評估是使用本地核心緩存(CPU綁定)執行的。在這種情況下,按比例運行多個羣集肯定會提高核心性能。 –

+0

但是,如果磁盤I/O消耗了很多性能,那麼我可能需要創建SQL複製或導入hdfs中的數據,以便以分佈式方式讀取數據,此外還可以通過運行更多的機器作爲從機來增加磁盤帶寬。 –

+0

在這種情況下,您可能需要嘗試[商用SQL Server JDBC驅動程序](https://www.progress.com/jdbc/microsoft-sql-server)來隔離性能問題。我爲Progress工作,商業驅動程序使用更少的內存和CPU來提高吞吐量,並且在出現不匹配的字符集時可以更好地處理表掃描。 –