使用Spark 1.6.2 JDBC读取Oracle数据的并行性

时间:2018-02-01 17:24:06

标签: oracle scala apache-spark cassandra

我们有大约4000万张桌子记录。

如何使用Spark 1.6.2从Oracle读取数据时选择lowerBoundupperBoundnumPartitions的值。

我有分区键。 我们有数据集群--3个节点                           - 每个18个核心                           - 每个27 GB

提前致谢。

2 个答案:

答案 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)。此更改无助于反映倾斜数据的初始负载,但是它可以使针对数据帧的许多后续活动效率更高,因为数据不应该再倾斜了。