嗨,我正在使用spark Mllib,并在1M数据集和1k数据集之间进行了大约相似。
当我这样做的时候,我就把1k广播了。
我看到的是,w工作停止在倒数第二个任务上。
所有的执行程序都死了,但是其中一个执行程序却运行了很长时间,直到内存耗尽。
我检查了神经节,它显示内存一直在增加直到达到极限
,磁盘空间不断减少,直到完成:
我调用的操作是写操作,但对count的操作相同。
现在,我想知道:集群中的所有分区是否可能会汇聚为一个节点并创建此瓶颈?
这是我的代码段:
var dfW = cookesWb.withColumn("n", monotonically_increasing_id())
var bunchDf = dfW.filter(col("n").geq(0) && col("n").lt(1000000) )
bunchDf.repartition(3000)
model.
approxSimilarityJoin(bunchDf,broadcast(cookesNextLimited),80,"EuclideanDistance").
withColumn("min_distance", min(col("EuclideanDistance")).over(Window.partitionBy(col("datasetA.uid")))
).
filter(col("EuclideanDistance") === col("min_distance")).
select(col("datasetA.uid").alias("weboId"),
col("datasetB.nextploraId").alias("nextId"),
col("EuclideanDistance")).write.format("parquet").mode("overwrite").save("approxJoin.parquet")
答案 0 :(得分:1)
我会尽力回答。 在Spark中,有一些被称为随机操作的事情,它们按照您的想法进行操作,经过一些计算后,它们会将所有信息转移到单个节点上。 如果您考虑一下,这些操作将无法将所有数据最终放入单个节点中。
连接操作示例: 您必须在2个不同的节点上进行分区
partition 1:
s, 1
partition 2:
s, k
,您想加入s。 如果您没有在同一台计算机上同时获得这两行,则将无法计算它们是否需要连接。
计数和减少以及更多操作相同。 您可以阅读有关随机播放操作的信息,也可以询问我是否需要进一步说明。
一个可能的解决方案是: 而不是仅将数据保存在内存中,您可以使用类似:
dfW.persist(StorageLevel.MEMORY_AND_DISK_SER)
还有其他一些持久性选项,但是它基本上是将分区和数据不仅以内存形式保存在磁盘中,而且还以序列化的方式保存在磁盘中以节省空间。