presto spill to disk
2019獨角獸企業重金招聘Python工程師標準>>>
概況
為了預防內存緊張的operator,presto允許將中間操作的結果轉存到磁盤上。這個機制的目的是為了讓那些需要的內存超過一臺機器一個query內存限制的query能夠執行。
這個機制類似于操作系統級的頁交換。但是,它是被應用在應用程序級去滿足presto的特殊需求。
溢寫的屬性在https://prestodb.io/docs/current/admin/properties.html#tuning-spilling這里描述
內存管理和溢寫
默認情況下,presto殺掉那些執行內存超過會話屬性query_max_memory 或 query_max_memory_per_node。這個機制保證內存的公平分配,防止內存分配造成死鎖。當集群中有很多小查詢的時候,這是非常有效的。但是會殺掉那些超過限制的大查詢。
為了克服這個問題,可撤回的內存概念被提出。一個查詢可以請求不限制的內存,但是這個內存可以被任何時候被內存管理回收。當內存被回收,這個查詢在內存中的數據被溢寫到磁盤上,稍后繼續處理。
事實上,當集群是空閑的時候,所有內存都可以獲取,一個消耗內存的查詢可以用完整個集群的內存。相反的,當集群沒有足夠的內存,同樣的查詢當前的數據被強制寫到磁盤上。被溢寫到磁盤上的查詢可能有一個較長的執行時間比完全在內存中運行。
請注意開啟溢寫到磁盤機制不保證消耗內存的查詢運行成功。當加載數據到內存的時候,查詢運行程序可能無法將中間數據劃分為足夠小的塊,以便每個塊都適合于內存,導致 out of memory 錯誤。
溢出磁盤
溢寫中間數據到磁盤,然后再加載到內存是一個高IO的操作,因此,磁盤可能是這些查詢的瓶頸。為了提高性能,建議在分開的磁盤上提供多重路徑。相關屬性https://prestodb.io/docs/current/admin/properties.html#tuning-spilling。
系統驅動盤不要被用作溢寫,也不要運行在JVM運行和寫日志的地方。這樣做可能會導致系統不穩定。除此之外,建議監控溢寫路徑磁盤的飽和狀態。
presto將溢寫路徑作為獨立的磁盤,沒有必要用?RAID 做溢寫。
支持的操作
不是所有的操作支持溢寫到磁盤,每一個處理溢寫不同。目前,這個機制被用于如下操作。
Joins
在join期間,其中一個表被存在內存。這個表被稱為生成表。如果另一張表里的記錄與生成表里的記錄匹配,則被傳遞給下一個操作。join中最費內存的部分就是生成表。
當任務的并發性大于1,生成表被分區。分區的數目等于任務的并發數task.concurrency 。屬性配置如https://prestodb.io/docs/current/admin/properties.html#task-properties
當生成表被分區,溢寫磁盤機制能降低join操作需要內存的峰值。當一個查詢接近內存限制,生成表的部分分區被溢寫到內存,與此同時,這些分區內的另一張表的記錄也被寫入磁盤。被溢寫到磁盤的分區數量決定著占用磁盤空間的大小。
后面,被溢寫的分區一個一個的讀會內存,完成join操作。
有了這個機制,join操作使用的內存峰值被降低到生成表的最大分區的大小。假設沒有數據傾斜,這將是整個生成表的 1/task.concurrency
Aggregations
聚合函數處理一組數據返回一個值。如果分組數目非常大,需要的內存也自然就很多。當啟動溢寫機制,直接計算的聚合結果被寫到磁盤,當有內存資源的時候,它被讀入內存合并。
?
轉載于:https://my.oschina.net/u/2000675/blog/2056427
總結
以上是生活随笔為你收集整理的presto spill to disk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建造《流浪地球》地下城重要技术:我国地下
- 下一篇: 三星电子平均年薪超1.3亿韩元!就这还降