如何控制RDD分区的首选位置?

时间:2017-12-13 18:17:52

标签: apache-spark pyspark rdd

有没有办法手动设置RDD分区的首选位置? 我想确保在某台机器上计算某个分区。

我正在使用一个数组并且正在使用'并行化'从中创建RDD的方法。

此外我还没有使用HDFS,这些文件位于本地磁盘上。这就是我想修改执行节点的原因。

1 个答案:

答案 0 :(得分:6)

  

有没有办法手动设置RDD分区的preferredLocations?

是的,有,但它有特定的RDD,因此不同类型的RDD有不同的方法。

Spark使用RDD.preferredLocations获取计算每个分区/拆分的首选位置列表(例如,HDFS文件的块位置)。

  

final def preferredLocations(split:Partition):Seq [String]

     

获取分区的首选位置,同时考虑RDD是否为检查点。

如您所见,该方法为final,这意味着没有人可以覆盖它。

当您查看RDD.preferredLocations的{​​{3}}时,您会看到RDD如何知道其首选位置。它使用受保护的source code方法,自定义RDD可以(但不必)覆盖以指定展示位置偏好。

protected def getPreferredLocations(split: Partition): Seq[String] = Nil

所以,现在这个问题已经变形了#34;另一个关于什么是允许设置他们的首选位置的RDD。找到你的,看看源代码。

  

我正在使用一个数组并且正在使用'并行化'从那里创建RDD的方法。

如果您parallelize您的本地数据集已不再分发,可能就是这样,但是......为什么您要将Spark用于可以在一台计算机/节点上本地处理的内容?

如果您坚持并且确实希望将Spark用于本地数据集,那么SparkContext.parallelize后面的RDD就是......让我们来看看源代码...... RDD.getPreferredLocations其中ParallelCollectionRDD

让我们将您的问题重新解释为以下内容(希望我不会失去任何重要的事实):

  

允许创建ParallelCollectionRDD并明确指定位置首选项的运算符是什么?

令我惊讶的是(因为我对该功能一无所知),有一个运算符,即does allow for location preferences,...接受一个或多个位置首选项(Spark节点的主机名)对于每个对象。

  

makeRDD [T](seq:Seq [(T,Seq [String])]):RDD [T] 分发本地Scala集合以形成具有一个或多个位置首选项的RDD (每个对象的Spark节点的主机名)。为每个集合项创建一个新分区。

换句话说,不是使用parallelise,而是必须使用makeRDD(在Scala的Spark Core API中可用,但我不确定我将离开的Python作为为你锻炼身体:))

同样的理由我适用于任何其他创建某种RDD的RDD操作符/转换。