Oracle 与 Spark 的连接 SQL
Oracle connetion with Spark SQL
我正在尝试使用以下代码从 Spark SQL 连接到 Oracle DB:
val dataTarget=sqlcontext.read.
format("jdbc").
option("driver", config.getString("oracledriver")).
option("url", config.getString("jdbcUrl")).
option("user", config.getString("usernameDH")).
option("password", config.getString("passwordDH")).
option("dbtable", targetQuery).
option("partitionColumn", "ID").
option("lowerBound", "5").
option("upperBound", "499999").
option("numPartitions", "10").
load().persist(StorageLevel.DISK_ONLY)
默认情况下,当我们通过 Spark SQL 连接 Oracle 时,它将为一个分区创建一个连接,为整个 RDD 创建一个连接。这样,当 Table 中有大量数据时,我就会失去并行性和性能问题。在我的代码中,我已经通过 option("numPartitions", "10")
这将创建 10 个连接。如果我错了请更正,据我所知,与 Oracle 的连接数将等于我们传递的分区数。
如果我使用更多连接,我会遇到以下错误,因为可能存在与 Oracle 的连接限制。
java.sql.SQLException: ORA-02391: exceeded simultaneous
SESSIONS_PER_USER limit
要为并行创建更多分区,如果我使用更多分区,则会出现错误,但如果我放得更少,则会面临性能问题。有没有其他方法可以创建单个连接并将数据加载到多个分区中(这将挽救我的生命)。
求推荐。
Is there any other way to create a single connection and load data into multiple partitions
没有。通常分区由不同的物理节点和不同的虚拟机处理。考虑到所有授权和身份验证机制,您不能只获取连接并将其从一个节点传递到另一个节点。
如果问题只是超过SESSIONS_PER_USER
,请联系 DBA 并要求增加 Spark 用户的值。
如果问题是节流,您可以尝试保持相同数量的分区,但减少 Spark 内核的数量。由于这主要是微观管理,因此最好完全放弃 JDBC,使用标准导出机制 (COPY FROM
) 并直接读取文件。
一种解决方法可能是使用单个 Oracle 连接(分区)加载数据,然后简单地 repartition:
val dataTargetPartitioned = dataTarget.repartition(100);
您还可以按字段分区(如果partitioning a dataframe):
val dataTargetPartitioned = dataTarget.repartition(100, "MY_COL");
我正在尝试使用以下代码从 Spark SQL 连接到 Oracle DB:
val dataTarget=sqlcontext.read.
format("jdbc").
option("driver", config.getString("oracledriver")).
option("url", config.getString("jdbcUrl")).
option("user", config.getString("usernameDH")).
option("password", config.getString("passwordDH")).
option("dbtable", targetQuery).
option("partitionColumn", "ID").
option("lowerBound", "5").
option("upperBound", "499999").
option("numPartitions", "10").
load().persist(StorageLevel.DISK_ONLY)
默认情况下,当我们通过 Spark SQL 连接 Oracle 时,它将为一个分区创建一个连接,为整个 RDD 创建一个连接。这样,当 Table 中有大量数据时,我就会失去并行性和性能问题。在我的代码中,我已经通过 option("numPartitions", "10")
这将创建 10 个连接。如果我错了请更正,据我所知,与 Oracle 的连接数将等于我们传递的分区数。
如果我使用更多连接,我会遇到以下错误,因为可能存在与 Oracle 的连接限制。
java.sql.SQLException: ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
要为并行创建更多分区,如果我使用更多分区,则会出现错误,但如果我放得更少,则会面临性能问题。有没有其他方法可以创建单个连接并将数据加载到多个分区中(这将挽救我的生命)。
求推荐。
Is there any other way to create a single connection and load data into multiple partitions
没有。通常分区由不同的物理节点和不同的虚拟机处理。考虑到所有授权和身份验证机制,您不能只获取连接并将其从一个节点传递到另一个节点。
如果问题只是超过SESSIONS_PER_USER
,请联系 DBA 并要求增加 Spark 用户的值。
如果问题是节流,您可以尝试保持相同数量的分区,但减少 Spark 内核的数量。由于这主要是微观管理,因此最好完全放弃 JDBC,使用标准导出机制 (COPY FROM
) 并直接读取文件。
一种解决方法可能是使用单个 Oracle 连接(分区)加载数据,然后简单地 repartition:
val dataTargetPartitioned = dataTarget.repartition(100);
您还可以按字段分区(如果partitioning a dataframe):
val dataTargetPartitioned = dataTarget.repartition(100, "MY_COL");