我想知道如何在Spark中使用collectAsMap。更具體地說,我想知道所有分區的數據聚合會在哪裏發生?聚集要麼發生在主人身上,要麼發生在工人身上。在第一種情況下,每個工作人員在主人上發送其數據,當主人從每個工作人員收集數據時,主人將彙總結果。在第二種情況下,工作人員負責彙總結果(在他們之間交換數據之後),然後將結果發送給主人。Spark CollectAsMap
對我來說,找到一種方法是非常重要的,因爲主人能夠獨立收集每個分區的數據,而無需工作人員交換數據。
我想知道如何在Spark中使用collectAsMap。更具體地說,我想知道所有分區的數據聚合會在哪裏發生?聚集要麼發生在主人身上,要麼發生在工人身上。在第一種情況下,每個工作人員在主人上發送其數據,當主人從每個工作人員收集數據時,主人將彙總結果。在第二種情況下,工作人員負責彙總結果(在他們之間交換數據之後),然後將結果發送給主人。Spark CollectAsMap
對我來說,找到一種方法是非常重要的,因爲主人能夠獨立收集每個分區的數據,而無需工作人員交換數據。
你可以在這裏看到他們是如何做collectAsMap的。由於RDD類型是一個元組,它看起來好像只是使用普通的RDD收集,然後將這些元組轉換成一個鍵值對映射。但是他們在評論中提到不支持multi-map,所以你需要在數據中進行1對1的鍵/值映射。
收集什麼做的是執行星火工作,並取回從工人每個分區的結果,並與司機減少/ CONCAT相聚合它們。
所以考慮到,應該是司機收集來自單獨每個分區中的數據,而無需工作人員交換數據進行collectAsMap
的情況。
請注意,如果您在使用collectAsMap
之前對RDD進行了轉換,導致混洗髮生,則可能有一箇中間步驟,導致工作人員在他們之間交換數據。查看你的集羣管理員的應用程序UI,以查看更多關於Spark如何執行你的應用程序的信息。
首先,在所有操作中,RDD中存在的所有數據都將從不同的執行者/工作人員傳送到主/司機。收集和收集AsMap只會整理來自各個執行者/工作者的數據。這就是爲什麼總是建議不要使用收集,除非你沒有其他選擇。
我必須說,這是從性能角度考慮的最後一個集合。
問候,
Neeraj
在您的術語,我認爲你的意思是說驅動程序,而不是主人。驅動程序是將收集結果彙總並從Spark羣集發送的位置。 – Rich