2017-02-02 45 views
2

我已經寫了火花工作,這確實低於操作星火foreachpartition連接改進

  1. 從HDFS的文本文件中讀取數據。
  2. 執行distinct()調用來過濾重複項。
  3. 做一個mapToPair階段,併產生pairRDD
  4. 做一個reducebykey呼叫
  5. 做分組元組聚集邏輯。
  6. 現在請#5

    這裏的foreach它

    1. 作出卡桑德拉分貝
    2. 呼叫創建一個AWS SNS和SQS客戶端連接
    3. 做一些JSON記錄格式。
    4. 發佈記錄SNS/SQS

當我運行這個工作它創建了三個階段的火花

第一階段 - 它需要近45秒。執行不同的 第二階段 - mapToPair和reducebykey =需要1.5分鐘

第三階段=需要19分鐘

我做了什麼

  1. 我關掉卡桑德拉調用,這樣看DB打的原因 - 這是以更短的時間
  2. 我發現
  3. 得罪一部分是創建SNS/SQS連接的foreach分區

其採取更多比整個工作時間的60%多

我在foreachPartition中創建了SNS/SQS連接,以減少連接。我們是否有更好的方法

我不能對駕駛員創建連接對象,因爲這些不是序列

我沒有使用5克執行人9號,executore核心15,司機2G內存,執行內存

我使用16芯64演出存儲器 簇大小1個主9從所有相同的結構 EMR部署火花1.6

+0

你確定'創建一個AWS SNS和SQS客戶端連接 '正在60%的工作時間或'發佈記錄SNS/SQS'呢?這兩者之間略有不同。對於第一種情況,您需要最小化連接創建的數量,而對於第二種情況,您需要分配數據(並創建更多連接實例)。有趣!!!! – code

+0

如果是第二種情況,我會用解決方案發布答案​​。 – code

回答

1

聽起來好像將要設置正好一個每節點SNS/SQS連接,然後用它來處理每個節點上的所有數據。

我認爲foreachPartition在這裏是正確的想法,但您可能想事先合併RDD。這會在同一個節點上摺疊分區而不洗牌,並且可以避免啓動額外的SNS/SQS連接。

在這裏看到: https://spark.apache.org/docs/latest/api/scala/index.html#[email protected](numPartitions:Int,shuffle:Boolean,partitionCoalescer:Option[org.apache.spark.rdd.PartitionCoalescer])(implicitord:Ordering[T]):org.apache.spark.rdd.RDD[T]

+0

是的,coalesce正是我的解決方案。還有一點我想在此添加。我有很多像23kb,45kb等小文件,並且通過coalesce將它縮小到正確的分區,現在我能夠在20分鐘內處理接近25GB的數據。在這裏改進更多 – Sam

+0

謝謝布拉德利..還有一件事..這是說我需要1TB數據來處理我應該創建多少分區合併? – Sam

+0

所以我會使用足夠多的分區,以便每個分區都適合內存,或者我擁有的核心數量。無論哪個更大。 –