将一个 RDD 拆分为多个 RDDS

Posted

技术标签:

【中文标题】将一个 RDD 拆分为多个 RDDS【英文标题】:Split an RDD into multiple RDDS 【发布时间】:2016-04-14 15:23:14 【问题描述】:

我有一对 RDD[String,String],其中键是字符串,值是 html。我想根据 n 个键将此 rdd 拆分为 n 个 RDDS 并将它们存储在 HDFS 中。

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

根据键拆分此 RDD,并将每个 RDD 中的 html 单独存储在 HDFS 上。我为什么要这样做?当我试图将 html 从主 RDD 存储到 HDFS 时,由于输出协调器拒绝提交某些任务,这需要很长时间。 我在 Scala 中这样做。

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

【问题讨论】:

随便猜测一下,htmlRDD中有多少个partition和executor?可能会发生 spark 用要写入的查询压倒 HDFS 的情况。但只有当你有很多 spark executors 时才会发生这种情况。 【参考方案1】:

你也可以试试这个来代替破坏 RDD:

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

我试过这个,它对我有用。我有 RDD[JSONObject],它写的 JSON 对象的 toString() 非常好。

【讨论】:

它也适用于我,但写入 HDFS 需要很多时间。我应该在写入 HDFS 之前对数据进行分区吗?【参考方案2】:

Spark 将每个 RDD 分区保存到 1 个 hdfs 文件分区中。因此,为了实现良好的并行性,您的源 RDD 应该有很多分区(实际上取决于整个数据的大小)。所以我认为你不想把你的 RDD 分成几个 RDD,而是让 RDD 有很多分区。 您可以使用 repartition() 或 coallesce() 来完成

【讨论】:

以上是关于将一个 RDD 拆分为多个 RDDS的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个 RDD 拆分为两个或多个 RDD?

火花。将 RDD 拆分为批次

如何将一个RDD拆分成多个RDD并相互比较

将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns

在pySpark中将RDD拆分为n个部分

如何通过 Delimiter 拆分 Spark RDD 的行