簡體   English   中英

在Spark + Scala中序列化/廣播大型地圖

[英]Serialize/Broadcast large Map in Spark + Scala

我的數據集由數據點組成,這些數據點是(雙精度數的)5000個元素的數組,並且每個數據點都分配有一個clusterId。

出於我要解決的問題的目的,我需要針對每個clusterId匯總這些數組(逐元素),然后在每個數據點與其各自的匯總集群數組之間進行點積計算。

我正在處理的數據點總數為4.8mm,它們分布在約5萬個群集中。

我使用'reduceByKey'獲取每個clusterId的聚合數組(這是我的關鍵)-使用此數據集,我有兩個不同的選擇:

  • 將聚合(clusterId,aggregateVector)對連接到原始數據集-這樣每個aggregateVector可用於每個分區
  • 本地收集(clusterId,AggregationVector)的rdd並將其序列化回我的執行器-再次,這樣我就可以使AggregationVectors可用於每個分區

我的理解是,聯接會根據聯接鍵進行重新分區,因此,在我的情況下,鍵的唯一值約為50k,這將非常慢。

我嘗試的是第二種方法-我設法收集了RDD語言環境-並將其轉換為一個clusterId映射作為鍵,將5000個元素的Array [Double]用作值。

但是,當我嘗試將此變量廣播/序列化為閉包時,出現了“ java.lang.OutOfMemoryError:請求的數組大小超出了VM限制 ”。

我的問題是-考慮到我需要向每個執行者提供聚合數據的問題的性質,鑒於聚合數據集(在我的情況下為50k x 5000)可能非常大,最好的方法是什么?

謝謝

我強烈推薦加入。 5000個值x 50,000個元素x每個值8個字節已經是2 GB,這是可以管理的,但絕對是在“嚴重減慢速度,並可能破壞某些東西”的范圍內。

沒錯,有時重新分區有時會很慢,但我認為您對此更加擔心。 它仍然是一個完全並行/分布式的操作,這使其本質上可以無限擴展。 不收集東西到驅動程序中。

暫無
暫無

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

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