簡體   English   中英

Apache Spark為什么不兼容函數?

[英]Why Apache Spark take function not parallel?

閱讀http://spark.apache.org/docs/latest/programming-guide.html上的 Apache Spark指南,它指出:

在此輸入圖像描述

為什么取功能不能並行運行? 並行實現這種功能有什么困難? 是否與事實有關,為了獲取RDD的前n個元素,需要遍歷整個RDD?

實際上,雖然take並不是完全平行的,但它也不是完全順序的。

例如,假設您take(200) ,每個分區有10個元素。 take將首先獲取分區0並看到它有10個元素。 它假定它需要20個這樣的分區來獲得200個元素。 但是最好在並行請求中要求更多。 所以它需要30個分區,它已經有1.所以它接下來並行地獲取分區1到29。 這可能是最后一步。 如果它非常不吉利,並且沒有找到總共200個元素,它將再次進行估算並同時請求另一批。

查看代碼,它有詳細記錄: https//github.com/apache/spark/blob/v1.2.0/core/src/main/scala/org/apache/spark/rdd/RDD.scala#L1049

我認為文檔是錯誤的。 只有在需要單個分區時才會進行本地計算。 這是第一次傳遞(獲取分區0)的情況,但通常不是后續傳遞中的情況。

你會如何並行實現它? 假設您有4個分區,並希望獲得前5個元素。 如果您事先知道每個分區的大小,那將很容易:例如,如果每個分區有3個元素,則驅動程序會詢問所有元素的分區0,並詢問分區1是否有2個元素。 所以問題是知道每個分區有多少個元素。

現在,您可以先計算分區大小,但這需要限制所支持的RDD轉換集,多次計算元素或其他一些權衡,並且通常需要更多的通信開銷。

暫無
暫無

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

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