2015-04-22 16 views
7

我想知道如何在Spark中使用collectAsMap。更具體地說,我想知道所有分區的數據聚合會在哪裏發生?聚集要麼發生在主人身上,要麼發生在工人身上。在第一種情況下,每個工作人員在主人上發送其數據,當主人從每個工作人員收集數據時,主人將彙總結果。在第二種情況下,工作人員負責彙總結果(在他們之間交換數據之後),然後將結果發送給主人。Spark CollectAsMap

對我來說,找到一種方法是非常重要的,因爲主人能夠獨立收集每個分區的數據,而無需工作人員交換數據。

+0

在您的術語,我認爲你的意思是說驅動程序,而不是主人。驅動程序是將收集結果彙總並從Spark羣集發送的位置。 – Rich

回答

6

你可以在這裏看到他們是如何做collectAsMap的。由於RDD類型是一個元組,它看起來好像只是使用普通的RDD收集,然後將這些元組轉換成一個鍵值對映射。但是他們在評論中提到不支持multi-map,所以你需要在數據中進行1對1的鍵/值映射。

collectAsMap function

收集什麼做的是執行星火工作,並取回從工人每個分區的結果,並與司機減少/ CONCAT相聚合它們。

collect function

所以考慮到,應該是司機收集來自單獨每個分區中的數據,而無需工作人員交換數據進行collectAsMap的情況。

請注意,如果您在使用collectAsMap之前對RDD進行了轉換,導致混洗髮生,則可能有一箇中間步驟,導致工作人員在他們之間交換數據。查看你的集羣管理員的應用程序UI,以查看更多關於Spark如何執行你的應用程序的信息。

1

首先,在所有操作中,RDD中存在的所有數據都將從不同的執行者/工作人員傳送到主/司機。收集和收集AsMap只會整理來自各個執行者/工作者的數據。這就是爲什麼總是建議不要使用收集,除非你沒有其他選擇。

我必須說,這是從性能角度考慮的最後一個集合。

  1. collect:將返回結果作爲數組。
  2. collectAsMap會將成對RDD的結果作爲Map集合返回。而且,由於它正在返回Map集合,您將只能獲得具有唯一鍵的對,並且將會刪除具有重複鍵的對。

問候,

Neeraj