2016-04-14 4 views
0

У меня есть пара RDD [String, String], где ключ - это строка, а значение - html. Я хочу разбить этот rdd на n RDDS на основе n ключей и сохранить их в HDFS.Разделить RDD на несколько RDDS

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

Разделить это RDD на основе ключей и хранить html с каждого RDD отдельно на HDFS. Почему я хочу это сделать? Когда я пытаюсь сохранить html с основного RDD на HDFS, это занимает много времени, так как некоторым задачам отказывают в фиксации координатором вывода. Я делаю это в Скале.

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

Просто дикая догадка, сколько разделов и исполнителей есть в htmlRDD? Может случиться так, что искра просто перегружает HDFS запросами на запись. Но это может произойти только в том случае, если у вас много исполнителей искры. – evgenii

ответ

0

Вы также можете попробовать это на месте нарушения РДА:

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

Я попробовал это, и это работает для меня. У меня был RDD [JSONObject], и он очень хорошо написал toString() JSON Object.

+0

Он тоже работает для меня, но для записи в HDFS требуется много времени. Должен ли я разбивать данные перед записью в HDFS. –

0

Spark сохраняет каждый раздел RDD в 1 раздел раздела hdfs. Поэтому для достижения хорошего параллелизма исходный RDD должен иметь много разделов (фактически зависит от размера целых данных). Поэтому я думаю, что вы хотите разделить свой RDD не на несколько RDD, а скорее на RDD со многими разделами. Вы можете сделать это с помощью repartition() или coallesce()

Смежные вопросы