performance - read - spark sql broadcasttimeout



如何在Spark SQL中加入大數據框?(最佳實踐,穩定性,性能) (1)

我遇到了與在Spark SQL中加入大數據框時丟失shuffle的輸出位置相同的錯誤。 這個建議是設置MEMORY_AND_DISK和/或spark.shuffle.memoryFraction 0 。 然而spark.shuffle.memoryFraction在Spark> = 1.6.0中被棄用,如果我沒有緩存任何RDD或Dataframe,設置MEMORY_AND_DISK應該不會有幫助,對嗎? 此外,我得到了很多其他的WARN日誌和任務重試,導致我認為這項工作是不穩定的。

所以我的問題是:

  • 在Spark SQL> = 1.6.0中加入巨大數據框的最佳實踐是什麼?

更具體的問題是:

  • 如何調整執行者數量spark.sql.shuffle.partitions以獲得更好的穩定性/性能?
  • 如何在並行水平 (執行者/核心數量 )和分區數量之間找到適當的平衡點? 我發現增加執行程序的數量並不總是解決方案,因為它可能會由於網絡流量而產生I / O讀取超時異常。
  • 還有其他相關參數需要調整嗎?
  • 我的理解是,加入存儲為ORCParquet的數據比用於連接操作的文本或Avro提供更好的性能。 Parquet和ORC有什麼重要區別?
  • SQLContext vs HiveContext在連接操作的穩定性/性能方面是否有優勢?
  • 當連接中涉及的數據先前是registerTempTable()saveAsTable()時,性能/穩定性方面是否有所不同?

到目前為止,我正在使用這個答案和本章作為一個起點。 還有幾個與此主題相關的計算器頁面。 但是,我還沒有找到這個流行問題的全面答案。

提前致謝。


這是很多問題。 請允許我一一回答:

執行者的數量在生產環境中大部分是可變的。 這取決於可用的資源。 在執行洗牌時,分區的數量非常重要。 假設您的數據現在傾斜了,可以通過增加分區數來降低每個任務的負載。 理想情況下,一個任務需要幾個減號。 如果任務花費太長時間,您的容器可能被搶先,工作也將失去。 如果任務只需要幾毫秒,那麼啟動任務的開銷將占主導地位。

並行性的水平和調整你的執行者的大小,我想參考Cloudera的優秀指南: https//blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-作業部分-2 /

ORC和Parquet只對靜止的數據進行編碼。 在進行實際連接時,數據是以Spark的內存格式存儲的。 自從Netflix和Facebook採用它並付出了很多努力,實木複合地板越來越受歡迎。 實木複合使您可以更有效地存儲數據,並具有Spark使用的某些優化(謂詞下推)。

您應該使用SQLContext而不是HiveContext,因為HiveContext已被棄用。 SQLContext更通用,不僅適用於Hive。

執行registerTempTable ,數據存儲在SparkSession中。 這不影響連接的執行。 它存儲的只是執行操作時調用的執行計劃(例如saveAsTable )。 在執行saveAsTable ,數據被存儲在分佈式文件系統上。

希望這可以幫助。 我還建議觀看我們在Spark Summit上的演講,了解如何加入: https//www.youtube.com/watch?v = 6zg7NTw- kTQ 。 這可能會提供一些見解。

乾杯,福克





spark-dataframe