2017-06-29 49 views
0

我正在查詢數據,然後在上面建立一個可視化文件。目前我的整個管道工作正常,但有時可能需要10分鐘才能返回我的查詢結果,我非常肯定我錯過了一些優化或其他導致速度降低的關鍵步驟。Spark Slow Performance

詳情: 我在3500 csv中有大約500gb。我將它們存儲在Azure Blob存儲帳戶中,並在Azure HDInsights上運行Spark羣集。我正在使用spark 2.1。

這裏是腳本(PySpark3在Azure上Jupyter筆記本電腦),我用它來攝取數據:

csv_df = spark.read.csv('wasb://[email protected]/folder/*.csv', header=True, inferSchema=True) //Read CSV 
csv_df.write.parquet('wasb://[email protected]/folder/parquet_folder/csvdfdata.parquet’) //Write Parquet 
parquet_df = spark.read.csv('wasb://[email protected]/folder/parquet_folder/csvdfdata.parquet) //Read Parquet 
parquet_df.createOrReplaceTempView(‘temp_table’) //Create a temporary table 
spark.sql("create table permenant_table as select * from temp_table"); //Create a permanent table 

我然後使用ODBC驅動程序和此代碼中提取數據。我知道odbc可以減慢一些事情,但我相信10分鐘比預期的要多。 https://github.com/Azure-Samples/hdinsight-dotnet-odbc-spark-sql/blob/master/Program.cs 我的拉數據的代碼與此相似^

問題是管道工作正常,但它太慢了,無法使用。我創建的可視化效果最好需要在幾秒鐘內提取數據。

其他詳情: 查詢良好的金額使用DateID其在int format = 20170629(2017年6月29日) 示例查詢日期= select DateId, count(PageId) as total from permanent_table where (DateId >= 20170623) and (DateId <= 20170629) group by DateId order by DateId asc

任何幫助將不勝感激!提前致謝! 謝謝!

回答

0

首先,澄清一點:您從ODBC連接運行哪些查詢?是表創建查詢嗎?他們需要很長時間。確保您只在預先創建的配置表格上運行ODBC讀取查詢。

現在假設你做了上面的事情,你可以做幾件事情來讓查詢在幾秒鐘內運行。

  1. HDI上的節約服務器使用動態資源分配。因此,在分配資源時,第一個查詢將花費額外的時間。之後,它應該更快。您可以檢查Ambari的狀態 - > Yarn UI - > Thrift應用程序使用多少資源 - 它應該使用羣集的所有核心。

  2. 3500個文件太多。創建parquet table coalesce(num_partitions)(或將其重新分區)爲較小數量的分區時。調整它以便每個分區大約有100MB或者沒有足夠的數據 - 每個羣集的核心至少有一個分區。

  3. 在您的數據生成腳本中,您可以跳過一步 - 而不是創建臨時表 - 直接以實木複合格式創建配置單元表。將csv_df.write.parquet替換爲csv_df.write.mode(SaveMode.Overwrite).saveAsTable("tablename")

  4. 對於日期查詢,您可以按年,月,日列將數據分區(首先需要提取它們)。如果你這樣做,你不必擔心#2。你可能會得到太多的文件,如果是這樣的話,你需要將分區減少到只有一年,每月。

  5. 您的羣集的大小。對於500GB的文本文件,您應該可以使用D14v2很少的節點(可能是2-4)。但取決於你的查詢的複雜性。

+0

嗨Maxiluk,感謝您的提示。我用dateId分區,並且以極快的速度提高了我的速度!對於500GB我現在下降到2分鐘左右。理想情況下,我想推幾秒鐘。我應該加快進行其他優化? 另外我的最終數據大小將接近12TB,目前我正在使用500GB進行測試。鑑於你會推薦使用什麼集羣配置?我目前正在使用D12 v2的頭節點(2個節點8個核心)和4個D4 v2工作節點(4個節點,32個核心)。我應該使用什麼配置? –

+0

嗨,抱歉,延遲與迴應。有很多優化你可以做。我在下面的Spark性能優化系列視頻中記錄了最重要的視頻:https://channel9.msdn.com/Shows/Data-Exposed/Spark-Performance-Series-1-with-Maxim-Lukiyanov – maxiluk

+0

關於12TB的簇大小你會使用D14_v2工作節點10-40個。數量越多,你的速度就越快。 – maxiluk