2016-04-14 78 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()