2016-01-21 95 views
0

首先,我在Amazon EMR上使用Spark 1.5.2,并将Amazon RDS用于我的postgres数据库。Spark在写入时是否可以使用SQL数据库?

我目前正致力于让Spark将其结果写入postgres数据库,我通过使用Spark的jdbc API来完成这项工作。虽然它正常工作,但我担心的是,如果我在Spark运行时尝试使用psql连接到数据库,然后尝试从Spark写入的表中读取数据,它会告诉我没有任何已写入的行。这一直持续到Spark完成,然后突然所有的行都出现在db中。

这让我很担心,因为最终设置应该是定期运行Spark脚本,并将更多数据写入数据库,而网站应该使用该数据库。这是否意味着在Spark运行时我无法查询数据库?

你会猜这是什么问题?我认为这可能是一个更大的实例用于数据库的问题(我最初使用最小和最便宜的 - db.t2.micro),但我得到了与db.m4.xlarge类实例相同的问题(尽管时间完成步骤减半)。

+6

学习基础的时间:[事务隔离](http://www.postgresql.org/docs/9.1/static/transaction-iso.html) –

+2

Spark可能使用一个事务来插入所有数据。问题不在于Spark在写入时无法读取任何*,而是因为当您读取时,尚未提交任何数据。 – deceze

+1

@deceze实际上,每个分区都在其自己的事务中单独保存。 – zero323

回答

1

首先,其他海报是正确的。 Spark正在使用事务写入数据库,因此在事务提交之前您不会看到任何数据。其次,如果您确实需要以较小的批次插入数据或作为单独的写入,则可以始终编写自己的JDBC代码并使用map()操作,但这可能不是一个好主意(但我不知道你的用例是什么,所以也许有一个很好的理由你会想要这个)。

+0

谢谢你的回答!正如其他海报所指出的那样,我仍然需要学习基础知识,但在一个狭窄的地方,我必须使用技术,我真的没有准备好使用,所以我不得不提出愚蠢的问题堆栈溢出。不,我不需要小批量书写,我关心的是数据库在写作发生时是否实际可用,而且是这样。所以我不会编写自己的JDBC代码,因为我很可能会把它搞砸,而且这不是必须的。 –

相关问题