簡體   English   中英

通過鍵減少到Spark中的元組列表

[英]Reduce by key into list of tuples in Spark

我正在嘗試轉置數據,以便它是每個鍵的元組列表,而不是數據列。

因此,作為輸入,我有:

1   234   54   7   9
2   654   34   2   1
1   987   22   4   6

我想作為輸出寫入實木復合地板文件:

1:2   ((234, 54, 7, 9), (987, 22, 4, 6))
2:6   ((654, 34 2 1))

作為輸入,我有兩組鑲木地板數據。 我閱讀它們並以數據框的形式加入。 然后,我將每行映射到鍵值對,然后用reduceByKey將每個鍵組合成大的元組列表。

val keyedRDD = joinedDF.map(row => (
  ""+row.getInt(0)+":"+(row.getInt(1)/PARTITION_SIZE),
  List(Record(
    row.getInt(1),
    row.getInt(2),
    row.getInt(3),
    row.getInt(4)
  ))
))

val reduced = keyedRDD.reduceByKey(_:::_)

這里的PARTITION_SIZE只是我為每次運行設置的變量,用於將數據拆分為該大小的塊。 就像這樣,如果我傳遞了100000條記錄,並且有200萬條記錄,那么編號為0-99,999的記錄將在一個存儲桶中,而編號為100,000-199,999的記錄將在另一個存儲桶中,依此類推。

記錄只是一個簡單的案例類來保存這些數據,我嘗試過使用簡單的元組,然后將它們自己放在具有相同結果的列表中。

我的理解是,這應該如上所述減少到每個鍵一個列表的輸出。 但是,我無法完成這項工作。 在火花歷史服務器中,即使Ganglia至少顯示80%的CPU使用率和高內存使用率,它始終顯示它掛在映射階段(甚至不啟動它)。 控制台卡在這些消息上:

16/01/18 01:26:10 INFO MapOutputTrackerMaster: Size of output statuses for shuffle 2 is 2485 bytes
16/01/18 01:26:10 INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations for shuffle 2 to ip-172-31-7-127.ec2.internal:34337
16/01/18 01:26:10 INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations for shuffle 2 to ip-172-31-7-129.ec2.internal:45407
16/01/18 01:26:17 INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations for shuffle 1 to ip-172-31-7-128.ec2.internal:59468
16/01/18 01:26:17 INFO MapOutputTrackerMaster: Size of output statuses for shuffle 1 is 75087 bytes
16/01/18 01:26:18 INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations for shuffle 1 to ip-172-31-7-127.ec2.internal:34337
16/01/18 01:26:18 INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations for shuffle 1 to ip-172-31-7-129.ec2.internal:45407

一個數據集約為3GB,另一個數據集約為22GB,因此實際上一點也不大。 但是我以為也許我的內存不足了(即使直到被卡住20多個小時才收到OOM或執行程序丟失消息)。 我嘗試使用帶有2個從屬節點的m3.xlarge,帶有6個從屬節點的m3.xlarge以及甚至具有6個從屬節點的r3.xlarge的EMR集群,仍然遇到相同的問題。 我已經設置了我的EMR群集,以為Spark提供最大可能的內存分配,給定Spark動態分配,與memoryFraction設置混淆等。

我只是不知道為什么它會掛在原處。 我嘗試簡化它,並使其在映射過程中成為(鍵,1)RDD,然后添加reduce,並在20分鍾內完成。

在昂貴的操作中追加到列表是一個常見的錯誤。 記住Scala對不可變對象的偏見。 最好的起點是,谷歌“ Scala列表追加性能”。 這將為您提供一些很棒的博客,詳細描述問題和建議。 通常,追加到列表是一項昂貴的操作,因為每個操作都會產生一個新列表-非常耗費計算量和內存。 您可以排在列表前面,或者最好的答案通常是列表緩沖區。 再次,查看博客並注意性能特征

http://www.scala-lang.org/docu/files/collections-api/collections_40.html

暫無
暫無

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

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