Apache spark 连接一个大型和巨大的spark数据帧

Apache spark 连接一个大型和巨大的spark数据帧,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我有两个数据帧,df1有600万行,df2有10亿行 我尝试了标准的df1.join(df2,df1(“id”)df2(“id2”)),但内存不足 df1太大,无法放入广播联接 我甚至试过布卢姆过滤器,但它也太大了,不适合广播,仍然有用 我尝试过的唯一没有出错的方法是将df1分解为300000行块,并在foreach循环中与df2连接。但这需要一个数量级的时间,比它可能需要的时间长(可能是因为它太大,无法作为一个持久性元素进行匹配,从而导致它重做拆分到该点)。重新组合结果也需要一段时间 你是如何

我有两个数据帧,df1有600万行,df2有10亿行

我尝试了标准的
df1.join(df2,df1(“id”)df2(“id2”))
,但内存不足

df1太大,无法放入广播联接

我甚至试过布卢姆过滤器,但它也太大了,不适合广播,仍然有用

我尝试过的唯一没有出错的方法是将df1分解为300000行块,并在foreach循环中与df2连接。但这需要一个数量级的时间,比它可能需要的时间长(可能是因为它太大,无法作为一个持久性元素进行匹配,从而导致它重做拆分到该点)。重新组合结果也需要一段时间

你是如何解决这个问题的

请注意:


df1是df2的一个子集
df1=df2。在哪里(“fin您可以尝试设置spark.shuffle.memoryFraction=0.0吗?


这将导致洗牌将所有内容溢出到磁盘,并且您永远不会得到OOM错误,因为我认为您存在分区太大的问题(可能是由于数据太大) 您可以尝试以下几种方法:

  • 尝试将spark.sql.shuffle.partitions定义为2048或更多(默认值为200)。加入df-s时将有shuffle。尝试使用此参数,使较大数据/此参数的总容量约为64Mb-100Mb(取决于文件格式)。通常,您应该在spark UI中看到每个任务(每个分区)处理“正常”数据量(最大64MB-100MB)

  • 如果第一个不起作用,我可以建议在RDDAPI中执行此连接。将df转换为RDD。然后通过HashPartitioner(分区数)对两个RDD进行分区。当分区数应该像我之前描述的那样计算时

  • spark开发人员最近添加了一个新选项:您可以将ginormous表存储到N个存储桶中(即存储它以备加入)。存在一些限制,但它可以完全消除洗牌ginormous数据。bucketBy仅受saveAsTable api支持,而不受saveAsTable api的支持。在获得bucketBy数据并对其进行bucketBy处理后,在下一次迭代中,您可以在提供bucketing规范的同时将该数据作为外部表加载(请参阅)

    创建表ginormous --…此处必须指定架构 使用拼花地板 由(a,b,c)聚集成N个桶 地点'hdfs://your-path"


  • 然后,当您将ginormous表加载为Bucked表时,您可以加载大表并将其重新划分为相同数量的bucket和相同的列(df.repartition(N,a,b,c))

    您有多少个节点?您的群集管理器是什么?Mesos,1000多个。@MatthewH我面临着同样的问题-您最终使用了什么?您是在dataframe世界中设法做到这一点的……还是必须为此编写RDD代码?
    spark.cores.max=1000
    spark.executor.memory=15G
    spark.akka.frameSize=1024
    spark.shuffle.consolidateFiles=false
    spark.task.cpus=1
    spark.driver.cores=1
    spark.executor.cores=1
    spark.memory.fraction=0.5
    spark.memory.storageFraction=0.3
    spark.sql.shuffle.partitions=10000
    spark.default.parallelism=10000
    
    16/03/11 04:36:07 ERROR LiveListenerBus: SparkListenerBus has already stopped! Dropping event SparkListenerTaskEnd(11,1,ResultTask,FetchFailed(BlockManagerId(68dcb91c-1b45-437d-ac47-8e8c1e4bc386-S199, mapr, 46487),3,176,4750,org.apache.spark.shuffle.FetchFailedException: java.io.FileNotFoundException: /tmp/mesos/work/slaves/68dcb91c-1b45-437d-ac47-8e8c1e4bc386-S199/frameworks/c754216b-bf80-4d84-97f1-2e907030365e-2545/executors/16/runs/5a5a01c5-205e-4380-94d3-7fa0f6421b85/blockmgr-ea345692-05bb-4f42-9ba1-7b93311fb9d4/0e/shuffle_3_340_0.index (No such file or directory)
    
    Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 465 in stage 6.3 failed 4 times, most recent failure: Lost task 465.3 in stage 6.3 (TID 114448, mapr): java.lang.OutOfMemoryError: Direct buffer memory