我想使用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是否从目标数据库加载了整个数据?
答案 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
例如cassandra
,mongo
,elastic serach
或文件系统(例如alluxio
或hdfs
)以启用可伸缩 - 并行 - 复杂 - 快速查询。最后,您可以将JDBC
替换为aws redshift
,这对于后端/前端来说应该不是那么难实现,但是从火花方面来说,处理依赖冲突是一件痛苦的事情 - 但它会启用您可以更快速地执行复杂查询,因为它可以使用多个工作程序对列自身进行下推聚合
答案 1 :(得分:0)
使用与使用spark作业相同的凭据完成登录到Vertica数据库的火花作业后,运行:
SELECT * FROM v_monitor.query_requests ORDER BY start_timetamp DESC LIMIT 10000;
这将显示spark作业发送到数据库的查询,允许您查看它是否将计数(*)下推到数据库,或者它是否确实尝试通过网络检索整个表。