Java 强制分区必须存储在特定的执行器上

Java 强制分区必须存储在特定的执行器上,java,scala,apache-spark,rdd,shuffle,Java,Scala,Apache Spark,Rdd,Shuffle,我有5个RDD分区和5个工人/执行者。如何让Spark将每个RDD的分区保存在不同的工作进程(IP)上 如果我说Spark可以在一个worker上保存几个分区,而在其他worker上保存0个分区,对吗?也就是说,我可以指定分区的数量,但Spark仍然可以在单个节点上缓存所有内容 复制不是一个选项,因为RDD是巨大的 我找到的变通办法 获取首选位置 RDD的getPreferredLocations方法不提供分区将存储在指定节点上的100%保证。Spark将在Spark.locality.wait

我有5个RDD分区和5个工人/执行者。如何让Spark将每个RDD的分区保存在不同的工作进程(IP)上

如果我说Spark可以在一个worker上保存几个分区,而在其他worker上保存0个分区,对吗?也就是说,我可以指定分区的数量,但Spark仍然可以在单个节点上缓存所有内容

复制不是一个选项,因为RDD是巨大的

我找到的变通办法 获取首选位置 RDD的
getPreferredLocations
方法不提供分区将存储在指定节点上的100%保证。Spark将在
Spark.locality.wait期间进行尝试,但之后,Spark将在另一个节点上缓存分区

,您可以将非常高的值设置为
spark.locality.wait
并覆盖
getPreferredLocations
。坏消息是,Java无法做到这一点,需要编写Scala代码。至少Scala内部包有Java代码。即:

class NodeAffinityRDD[U: ClassTag](prev: RDD[U]) extends RDD[U](prev) {

  val nodeIPs = Array("192.168.2.140","192.168.2.157","192.168.2.77")

  override def getPreferredLocations(split: Partition): Seq[String] =
    Seq(nodeIPs(split.index % nodeIPs.length))
}
SparkContext的makeRDD 。这种方法缺乏文档。据我所知,我可以指定首选位置,然后将较高的值设置为
spark.locality.wait
。坏消息-首选位置


这两种方法都有一个缺点,即spark.locality.wait太高,如果某些节点不可用,则会导致集群饥饿

P.S.更多上下文 我有多达10000个
sales XXX.parquet
文件,每个文件代表不同地区不同商品的销售情况。每个
sales XXX.拼花地板的
可能从几KBs到几GBs不等。所有
sales XXX.拼花地板
s加在一起可能在HDFS上占用数十或数百GB的空间。 我需要对所有销售进行全文搜索。我必须用Lucene一个接一个地为每个销售XXX.拼花地板编制索引。现在我有两个选择:

  • 保持Lucene索引在Spark中。已经有了,但看起来很可疑有更好的解决方案吗?
  • 将Lucene索引保留在本地文件系统中。然后我可以将reduce映射到每个worker的索引查找结果上。但这种方法要求每个工作节点保持相同数量的数据如何确保Spark在每个工作节点上保留相同数量的数据?

  • 我希望您知道random
    @
    没有任何用处:)它不会通知任何尚未在给定线程中处于活动状态的人
    spark.deploy.spreadOut
    通常对我有效,但据我所知,它不可移植,也不提供任何保证。这里的最终目标是什么?你缓存数据,假设没有工作错误,但接下来会发生什么?你是否真的观察到spark将所有数据放在一个节点上,或者这只是理论上的吗?@zero323对此表示抱歉。但是
    @
    并不是随机的,我只是选择了堆栈溢出上排名前五的Spark用户:)请看我的问题的P.S.部分。我真的需要spark.deploy.spreadOut吗?@puhlen这只是理论上的,我还没有做过这种测试。我应该担心这个吗?请看我问题的
    P.S.更多内容
    部分别担心:)我唯一的观点是@不起作用。阅读“更多的背景”——在这个尺度上,我不会太担心倾斜,甚至不会尝试微观管理。更让我困扰的是10000个RDD(我还没有尝试过,所以这只是一种预感,但它可能会驱动一些组件,包括LRU跟踪、疯狂)和全文搜索。乍一看,我宁愿看一些内存中的数据网格,也许是简洁的。