2016-04-14 12 views
0

私はRDD [String、String]のペアを持っています。ここでkeyは文字列で、値はhtmlです。私はこのrddをn個のキーに基づいてn個のRDDSに分割し、それらをHDFSに格納したいと考えています。RDDを複数のRDDSに分割

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

スプリットHDFS上の個々RDDからキーや店舗のHTMLに基づいて、このRDD。なぜ私はそれをしたいのですか?メインのRDDからhtmlをHDFSに保存しようとすると、出力コーディネータがコミットを拒否するため、時間がかかります。 私はScalaでこれをやっています。

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 ObjectのtoString()をとてもうまく書きました。

+0

それは私のためにも機能しますが、HDFSに書き込むには多くの時間がかかります。 HDFSに書き込む前にデータを分割する必要があります。 –

0

スパークは、各RDDパーティションを1つのhdfsファイルパーティションに保存します。だから、良い並列性を達成するために、ソースRDDは多くのパーティションを持つべきです(実際にはデータ全体のサイズに依存します)。だから私はあなたのRDDをいくつかのRDDに分割するのではなく、むしろ多くのパーティションでRDDを使うことを望んでいると思います。 あなたは、repartition()またはcoallesce()でそれを行うことができます

関連する問題