执行的许多查询的SPARK JDBC连接重用

时间:2018-05-09 05:55:35

标签: apache-spark

借用SO 26634853,然后提出以下问题:

像这样使用 IMPALA 连接是一次性设置:

val JDBCDriver = "com.cloudera.impala.jdbc41.Driver"
val ConnectionURL = "jdbc:impala://url.server.net:21050/default;auth=noSasl"

Class.forName(JDBCDriver).newInstance
val con = DriverManager.getConnection(ConnectionURL)
val stmt = con.createStatement()
val rs = stmt.executeQuery(query)

val resultSetList = Iterator.continually((rs.next(), rs)).takeWhile(_._1).map(r => {
getRowFromResultSet(r._2) // (ResultSet) => (spark.sql.Row)
}).toList

sc.parallelize(resultSetList)

如果我需要在loop周围放置一个con.createStatement()及其相关代码,并使用某些逻辑并执行一些5000次?

  1. 参考使用map与mapPartitions的数据库连接开销讨论,在这种情况下,我会产生5000 x连接的成本,还是可以像在这里完成的那样重复使用?从SCALA JDBC的文档看起来它可以重用。
  2. 我的想法是,因为它不是像df_mysql = sqlContext.read.format("jdbc").options ...这样的高级SPARK API ,所以我认为它应该保持开放状态,但我想检查一下。可能是SPARK env自动关闭它,但我想不是。在处理结束时可以发出收盘?

    1. 使用HIVE上下文意味着我们不需要每次都打开连接 - 或者不是这样?然后使用镶木地板或ORC表,然后我推测会允许这样的方法,因为性能非常快。

1 个答案:

答案 0 :(得分:0)

我试过这个模拟并且连接仍然是开放的,所以不是在foreach中提供,这不是性能方面的问题。

var counter = 0
do
  {
    counter = counter + 1
    val dataframe_mysql = spark.read.jdbc(jdbcUrl, "(select author from family) f ", connectionProperties)  
    dataframe_mysql.show

  } while (counter < 3)