我们有大约4000万张桌子记录。
如何使用Spark 1.6.2从Oracle读取数据时选择lowerBound
,upperBound
和numPartitions
的值。
我有分区键。 我们有数据集群--3个节点 - 每个18个核心 - 每个27 GB
提前致谢。
答案 0 :(得分:2)
最简单的启发式方法是计算列值的最小值和最大值。在SQL(普通JDBC)中,您可以运行:
select min(column) as lowerBound, max(column) as upperBound from table;
将lowerBound和upperBound设置为查询结果。
但是,并不总是这么简单。有时列的分布非常偏斜 - 即,SomeFunnyID
可能有100x值,范围为[0..100],然后100.000.000x值高于100000.那么你的阅读会非常偏斜,因此会慢一些。
在这种情况下,我建议将dbtable
参数设置为select mod(s.someFunnyID, partitionCount) as partition_key, s.* from table s
,然后将lowerBound
设置为0
,将"upperBound"
设置为partitionCount
< / p>
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,我只有一个简单的启发式:执行者数量*执行者核心
请注意,每次您必须对配置进行基准测试,以确定您的情况是否正确
答案 1 :(得分:-1)
@Chandra,您可以尝试在.load()之后添加.repartition(partitionCount)。此更改无助于反映倾斜数据的初始负载,但是它可以使针对数据帧的许多后续活动效率更高,因为数据不应该再倾斜了。