我正在使用Spark 2.4.3,扩展名为GeoSpark 1.2.0。
我有两个表作为范围距离加入。一个表(t1
),如果〜100K行只有一列,那是Geospark的几何。另一个表(t2
)大约有3000万行,由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()
我尝试了不同的配置,无论是在本地运行还是在笔记本电脑的本地群集上运行(总内存16GB和8核),但都没有运气,因为该程序在GeoSpark的“加入时不同”崩溃,并经过大量改组。但是我无法从SparkSQL语法中删除改组。我想在最大的表上添加一个额外的列ID,例如每200行左右添加一个相同的整数,然后重新分区,但是也没有用。
我期望使用GeoSpark索引的分区程序,但是我不确定它是否正常工作。
有什么主意吗?
答案 0 :(得分:0)
我自己找到了一个答案,因为GC开销的问题是由于分区,还有GeoSpark的Partitioner所需的内存(基于索引),以及由于长时间的地理查询计算而导致的超时,解决了这些问题。 GeoSpark网站本身建议的以下参数:
spark.executor.memory 4g
spark.driver.memory 10g
spark.network.timeout 10000s
spark.driver.maxResultSize 5g