Apache Spark是否从目标数据库加载整个数据?

时间:2017-02-16 07:22:35

标签: apache-spark jdbc vertica pyspark-sql

我想使用Apache Spark并通过JDBC连接到Vertica。

在Vertica数据库中,我有1亿条记录,并且火花代码在另一台服务器上运行。

当我在Spark中运行查询并监控网络使用情况时,两台服务器之间的流量非常高。

似乎Spark从目标服务器加载所有数据。

这是我的代码:

test_df = spark.read.format("jdbc")
    .option("url" , url).option("dbtable", "my_table")
    .option("user", "user").option("password" , "pass").load()

test_df.createOrReplaceTempView('tb')

data = spark.sql("select * from tb")

data.show()

当我运行它时,在2分钟和非常高的网络使用率后,结果返回。

Spark是否从目标数据库加载了整个数据?

2 个答案:

答案 0 :(得分:0)

JDBC基于DBs允许下推查询,以便您只从磁盘中读取相关项:ex:df.filter("user_id == 2").count将首先仅选择已过滤的记录,然后将计数发送到spark。所以使用JDBC:1。计划过滤器,2。根据您的查询模式对数据库进行分区,并进一步优化表单spark side,如下所示:

val prop = new java.util.Properties
prop.setProperty("driver","org.postgresql.Driver")
prop.setProperty("partitionColumn", "user_id")
prop.setProperty("lowerBound", "1")
prop.setProperty("upperBound", "272")
prop.setProperty("numPartitions", "30")

但是,大多数relational DB都被树状结构中的特定字段分区,这对于复杂的大数据查询并不理想:我强烈建议将表格从JDBC复制到no-sql例如cassandramongoelastic serach或文件系统(例如alluxiohdfs)以启用可伸缩 - 并行 - 复杂 - 快速查询。最后,您可以将JDBC替换为aws redshift,这对于后端/前端来说应该不是那么难实现,但是从火花方面来说,处理依赖冲突是一件痛苦的事情 - 但它会启用您可以更快速地执行复杂查询,因为它可以使用多个工作程序对列自身进行下推聚合

答案 1 :(得分:0)

使用与使用spark作业相同的凭据完成登录到Vertica数据库的火花作业后,运行:

SELECT * FROM v_monitor.query_requests ORDER BY start_timetamp DESC LIMIT 10000;

这将显示spark作业发送到数据库的查询,允许您查看它是否将计数(*)下推到数据库,或者它是否确实尝试通过网络检索整个表。