我们有大约4000万张桌子的记录。
在使用Spark 1.6.2从Oracle读取数据时lowerBound
,如何选择upperBound
,和的值numPartitions
。
我有分区键。我们有datastax集群-3个节点-每个18核-每个27 GB
提前致谢。
最简单的启发式方法是计算列值的最小值和最大值。在SQL(普通JDBC)中,您可以运行:
select min(column) as lowerBound, max(column) as upperBound from table;
然后将lowerBound和upperBound设置为查询结果。
但是,它并不总是那么简单。有时,列的分布很偏斜-例如,SomeFunnyID
可能有[0..100]范围内的100x值,然后高于100000的100.000.000x值。然后,您的阅读将非常偏斜,因此速度变慢。
在这种情况下,我建议将dbtable
参数设置为select mod(s.someFunnyID, partitionCount) as partition_key, s.* from table s
,然后将查询设置lowerBound
为0
和"upperBound"
。partitionCount
val partitionCount = // here choose partition count
val df = spark.read.jdbc(...)
.option("dbtable", s"select mod(s.someFunnyID, $partitionCount) as partition_key, s.* from table s")
.option("lowerBound", "0")
.option("upperBound", partitionCount)
.option("partitionColumn", "partition_key")
.load()
对于partitionCount,我只有一种简单的试探法:执行者数量*执行者核心
请注意,每次必须对配置进行基准测试以查看其是否正确
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句