有没有办法手动设置RDD分区的首选位置? 我想确保在某台机器上计算某个分区。
我正在使用一个数组并且正在使用'并行化'从中创建RDD的方法。
此外我还没有使用HDFS,这些文件位于本地磁盘上。这就是我想修改执行节点的原因。
答案 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操作符/转换。