在 Spark API 中,makeRDD 函数和 parallelize 函数有什么区别?

In Spark API, What is the difference between makeRDD functions and parallelize function?

我有一个问题,在制作 spark 应用程序的过程中。 在 Spark API 中,makeRDD 函数和 parallelize 函数有什么区别?

没有任何区别。引用 makeRDD doctring:

This method is identical to parallelize.

如果你看一下实现,它只是调用 parallelize:

def makeRDD[T: ClassTag](
    seq: Seq[T],
    numSlices: Int = defaultParallelism): RDD[T] = withScope {
  parallelize(seq, numSlices)
}

归根结底,这是一个品味问题。需要考虑的一件事是 makeRDD 似乎特定于 Scala API。 PySpark 和内部 SparkR API 仅提供 parallelize.

注意makeRDD 有第二种实现,它允许您设置位置首选项,但给定不同的签名,它不能与 [=11= 互换].

如@zero323 所述,makeRDD 有 2 个实现。一个与并行化相同。 other 是将数据局部性注入 Spark 应用程序的一种非常有用的方法,即使您没有使用 HDFS。

例如,当您的数据已根据某些业务逻辑分布在 Spark 集群的磁盘上时,它会提供数据局部性。假设您的目标是创建一个 RDD,该 RDD 将从磁盘加载数据并使用函数对其进行转换,并且您希望尽可能 运行 在数据本地进行此操作。

为此,您可以使用 makeRDD 创建一个空 RDD,并将不同的位置首选项分配给每个 RDD 分区。每个分区都可以负责加载您的数据。只要您用分区本地数据的路径填充分区,那么后续转换的执行将是节点本地的。

Seq<Tuple2<Integer, Seq<String>>> rddElemSeq = 
                       JavaConversions.asScalaBuffer(rddElemList).toSeq();
RDD<Integer> rdd = sparkContext.makeRDD(rddElemSeq, ct);
JavaRDD<Integer> javaRDD = JavaRDD.fromRDD(rdd, ct);
JavaRDD<List<String>> keyRdd = javaRDD.map(myFunction);
JavaRDD<myData> myDataRdd = keyRdd.map(loadMyData);

在此代码段中,rddElemSeq 包含每个分区的位置首选项(IP 地址)。每个分区还有一个 Integer ,它就像一个键。我的函数 myFunction 使用该键并可用于生成该分区本地数据的路径列表。然后可以在下一行加载该数据。