如何避免与Geospark的范围查询中超过GC高架限制



我使用的是Spark 2.4.3,Geospark 1.2.0。

我有两个表作为范围距离。一张表(t1(,如果只有一列〜100k行,那就是Geospark的几何形状。另一个表(t2(为〜30m行,由Int值和Geospark的几何列组成。

我想做的只是一个简单的:

    val spark = SparkSession
      .builder()
//      .master("local[*]")
      .config("spark.serializer", classOf[KryoSerializer].getName)
      .config("spark.kryo.registrator", classOf[GeoSparkKryoRegistrator].getName)
      .config("geospark.global.index", "true")
      .config("geospark.global.indextype", "rtree")
      .config("geospark.join.gridtype", "rtree")
      .config("geospark.join.numpartition", 200)
      .config("spark.sql.parquet.filterPushdown", "true")
//      .config("spark.sql.shuffle.partitions", 10000)
      .config("spark.sql.autoBroadcastJoinThreshold", -1)
      .appName("PropertyMaster.foodDistanceEatout")
      .getOrCreate()
GeoSparkSQLRegistrator.registerAll(spark)
spark.sparkContext.setLogLevel("ERROR")
spark.read
  .load(s"$dataPath/t2")
  .repartition(200)
  .createOrReplaceTempView("t2")
spark.read
  .load(s"$dataPath/t1")
  .repartition(200)
  .cache()
  .createOrReplaceTempView("t1")
val query =
  """
    |select /*+ BROADCAST(t1) */
    |  t2.cid, ST_Distance(t1.geom, t2.geom) as distance
    |  from t2, t1 where ST_Distance(t1.geom, t2.geom) <= 3218.69""".stripMargin
spark.sql(query)
  .repartition(200)
  .write.mode(SaveMode.Append)
  .option("path", s"$dataPath/my_output.csv")
  .format("csv").save()

我尝试了不同的配置,当我在本地运行时或在我的笔记本电脑上的本地群集上运行时(tot mem 16GB和8个内核(,但是由于程序崩溃时,没有任何运气。但是,我无法从SparkSQL语法中删除改组。我想在最大表格上添加一个额外的列ID,例如每200行左右相同的整数,然后再进行重新分配,但也没有起作用。

我期待着一个盖施标索引的分区者,但我不确定它是否有效。

有什么想法?

我自己找到了一个答案,因为GC开销的问题是由于分区而引起的,也是Geospark(基于索引(和长时间的暂停所需的记忆已解决的地理计算添加了Geospark网站本身建议的以下参数:

spark.executor.memory 4g
spark.driver.memory 10g
spark.network.timeout 10000s
spark.driver.maxResultSize 5g

相关内容

  • 没有找到相关文章

最新更新