簡體   English   中英

在pyspark中廣播大型陣列(〜8GB)

[英]Broadcast large array in pyspark (~ 8GB)

在Pyspark中,我試圖廣播大約8GB的大型numpy數組。 但是它失敗,並顯示錯誤“ OverflowError:無法序列化大於4GiB的字符串”。 我的執行者內存和15g驅動程序內存為15g。 我嘗試使用默認和kyro序列化程序。 兩者均不起作用,並顯示相同的錯誤。 誰能建議如何擺脫這個錯誤,以及解決大型廣播變量的最有效方法?

PySpark不使用Java端序列化進行廣播,因此使用Kryo或任何其他序列化設置都無濟於事。 這只是版本4之前的pickle協議的限制。

從理論上講,應該可以將PySpark代碼調整為使用Python 3.4+中協議的特定版本,但總的來說,我不認為這樣做值得。 通常在PySpark中廣播大變量,因為執行者之間不會共享它。

如果您確實需要此功能,最簡單的解決方案是將陣列拆分為多個大小小於4GB的塊。 它不會使PySpark廣播更加有效,但應該可以解決您的問題。

offset = ...
a_huge_array = np.array(...)

a_huge_array_block_1 = sc.broadcast(a_huge_array[0:offset])
a_huge_array_block_2 = sc.broadcast(a_huge_array[offset:2*offset])
...

更智能的方法是使用本地文件系統而不是變量來分發文件,然后通過內存映射訪問這些文件。 例如,您可以使用平面文件內存映射的SQLite

這不是PySpark的問題,這是Spark工具的限制。

Spark使用scala數組存儲廣播元素,因為Scala的最大Integer為2 * 10 ^ 9,所以總的字符串字節為2 * 2 * 10 ^ 9 = 4GB,因此可以查看Spark代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM