PySpark TaskMemoryManager:进行aboutSimilarityJoin

时间:2018-12-04 20:11:26

标签: apache-spark machine-learning pyspark apache-spark-mllib

问题

我有一个Spark数据框df,具有约650万行,包含两列:

  • ID:字符串
  • 特征:[经度,纬度]均为浮点型。

对于每个ID,我在Spark机器学习库中使用BucketedRandomProjectionLSH.approxSimilarityJoin来获取欧几里德距离低于特定阈值的最近邻居。在进行近似相似性联接时,我遇到了一个错误(请参见下面的“错误”部分)。

我的想法是,这可能是由于计算量过多而使执行程序用尽了内存,但是我不确定。您能帮我还是给我一些暗示可能是什么原因造成的?我也想知道是否有更好的方法来获取每个ID的最近邻居。谢谢。

代码

brp = BucketedRandomProjectionLSH(
    inputCol='features', 
    outputCol='hashes', 
    bucketLength=2, 
    numHashTables=2)

nn_model = brp.fit(df)

df_transformed = nn_model.transform(df)

df_nearest_neighbors = nn_model\
    .approxSimilarityJoin(
        datasetA=df_transformed, 
        datasetB=df_transformed, 
        threshold=0.5, 
        distCol='dist')\
    .select(
        col('datasetA.ID').alias('ID_NN'), 
        col('datasetB.ID').alias('ID'), 
        col('dist').alias('DIST'))

df_nearest_neighbors.select('ID').distinct().count()

错误

在执行上述代码时,Spark作业运行了很长时间后遇到以下错误。

[org.apache.spark.memory.TaskMemoryManager] - Failed to allocate a page (67108864 bytes), try again.

集群配置

  • 火花2.3.1
  • 纱线客户
  • 44个执行程序,每个2个内核,4G执行程序内存
  • 6G驱动程序内存

0 个答案:

没有答案