在交互工作流處理大型查詢
一個挑戰與交互式數據工作流處理大型查詢。這包括查詢生成過多的輸出行,獲取許多外部分區,或計算上非常大的數據集。這些查詢可能會非常慢,飽和集群資源,並使其他人很難共享相同的集群。
查詢監督是一個過程,防止查詢壟斷集群資源通過檢查大型查詢和終止的最常見原因的查詢通過一個閾值。本文描述了如何啟用和配置查詢監督。
重要的
啟用查詢監管機構對所有通用集群使用UI創建的。
一個破壞性的查詢的例子
分析師執行一些臨時查詢實時數據倉庫。分析師使用共享集群自動定量,可以讓多個用戶同時使用一個集群。假設有兩個表,每個有一百萬行。
進口org。apache。火花。sql。功能。_火花。相依。集(“spark.sql.shuffle.partitions”,10)火花。範圍(1000000)。withColumn(“join_key”,點燃(”“))。createOrReplaceTempView(“出現”)火花。範圍(1000000)。withColumn(“join_key”,點燃(”“))。createOrReplaceTempView(“table_y”)
這些表大小可控的Apache火花。但是,他們每一雙都包含一個join_key
列在每一行一個空字符串。這可能發生,如果數據沒有完全清洗或如果有重要數據傾斜一些鍵比其他人更為普遍。這些空連接鍵被更為普遍比其他任何價值。
在以下代碼中,分析師加入這兩個表的鍵,並產生輸出一萬億條結果,這些都是產生一個執行人(得到的遺囑執行人””
鍵):
選擇id,數(id)從(選擇x。id從出現x加入table_yy在x。join_key=y。join_key)集團通過id
這個查詢似乎運行。但沒有了解的數據,分析師認為,“隻有”一個任務了在執行工作。查詢從未結束,離開分析師沮喪和困惑為什麼它不工作。
在本例中隻有一個有問題的連接鍵。有時可能會有更多。
啟用和配置查詢監督
要啟用和配置查詢監督機構,以下步驟是必需的。
讓監管機構
spark.databricks.queryWatchdog.enabled
。任務運行時配置
spark.databricks.queryWatchdog.minTimeSecs
。顯示輸出,
spark.databricks.queryWatchdog.minOutputRows
。配置的輸出率
spark.databricks.queryWatchdog.outputRatioThreshold
。
防止一個查詢創建太多的輸出輸入的行數行,您可以啟用查詢監督機構和配置的最大輸出行數的多個輸入的行數。在這個例子中,我們使用一個比1000(默認)。
火花。相依。集(“spark.databricks.queryWatchdog.enabled”,真正的)火花。相依。集(“spark.databricks.queryWatchdog.outputRatioThreshold”,1000升)
後者配置宣稱任何給定的任務不應該生產超過1000倍的數量輸入行。
提示
輸出比例是完全可定製的。我們建議開始降低,看到什麼閾值適用於您和您的團隊。一係列的1000年到10000年是一個很好的起點。
查詢監督防止用戶不僅壟斷集群資源的工作永遠不會完成,它也節省時間通過fast-failing查詢就不會完成。例如,下麵的查詢將失敗後幾分鍾,因為它超過了比率。
選擇z。idjoin_key,總和(z。id),數(z。id)從(選擇x。id,y。join_key從出現x加入table_yy在x。join_key=y。join_key)z集團通過join_key,z。id
這就是你會看到:
通常足以使查詢監督並設置輸出/輸入閾值比,但你也可以選擇設置兩個附加屬性:spark.databricks.queryWatchdog.minTimeSecs
和spark.databricks.queryWatchdog.minOutputRows
。這些屬性指定的最小時間給定的查詢必須在取消之前運行的任務,任務的最小數量的輸出行查詢。
例如,您可以設置minTimeSecs
到一個更高的價值,如果你想給它一個機會產生大量的行每個任務。同樣地,您可以設置spark.databricks.queryWatchdog.minOutputRows
一千萬如果你想要停止查詢任務後,查詢已經產生了一千萬行。少東西,查詢成功,即使輸出/輸入比例是超過。
火花。相依。集(“spark.databricks.queryWatchdog.minTimeSecs”,10 l)火花。相依。集(“spark.databricks.queryWatchdog.minOutputRows”,100000 l)
提示
如果你在筆記本中配置查詢監督機構,配置不存在跨集群重啟。如果你想為所有用戶配置查詢監管機構的一個集群,我們建議你使用集群配置。