2016-04-14 82 views
0

我有一對RDD [String,String]其中key是一個字符串,值爲html。我想根據n個鍵將這個rdd分成n個RDDS並將它們存儲在HDFS中。將RDD拆分爲多個RDDS

htmlRDD = [key1,html 
      key2,html 
      key3,html 
      key4,html 
      ........] 

根據密鑰拆分此RDD,並將每個RDD的html分別存儲在HDFS上。爲什麼我想這樣做?當我嘗試將主RDD中的html存儲到HDFS時,由於某些任務被輸出協調器拒絕,所以需要很長時間。 我在斯卡拉這樣做。

htmlRDD.saveAsHadoopFile("hdfs:///Path/",classOf[String],classOf[String], classOf[Formatter]) 
+0

只是瘋狂的猜測,有多少分區和執行者在htmlRDD?可能發生的情況是,火花只是用查詢來填滿HDFS。但是,只有當你有很多火花執行者時纔會發生這種情況。 – evgenii

回答

0

您還可以在地方打破RDD的嘗試:

htmlRDD.saveAsTextFile("hdfs://HOST:PORT/path/"); 

我嘗試這樣做,它爲我工作。我有RDD [JSONObject],它很好地寫入了JSON對象的toString()。

+0

它也適用於我,但寫入HDFS需要很長時間。我應該在寫入HDFS之前對數據進行分區。 –

0

Spark將每個RDD分區保存到1個hdfs文件分區中。所以爲了達到良好的並行性,你的源RDD應該有很多分區(實際上取決於整個數據的大小)。所以我認爲你想把你的RDD分成幾個RDD,而不是把RDD分成多個分區。 你可以使用repartition()或coallesce()