Spark:将InputFormat作为singleton运行

时间:2014-10-30 13:47:12

标签: database hadoop apache-spark

我正在尝试将一个键值数据库集成到Spark并提出一些问题。 我是Spark初学者,已经阅读了很多并运行了一些样本,但也没有 复杂。

方案

我正在使用小型hdfs群集将传入的消息存储在数据库中。 群集有5个节点,数据分为5个分区。每 分区存储在单独的数据库文件中。因此每个节点都可以处理 它自己的数据分区。

问题

数据库软件的接口基于JNI,数据库本身就是 在C中实现。由于技术原因,数据库软件可以维护 一次只能有一个活动连接。只能有一个JVM进程 已连接到数据库。

由于此限制,必须读取和写入数据库 通过相同的JVM进程。

(背景信息:数据库已嵌入到流程中。它是基于文件的, 并且只有一个进程可以一次打开它。我可以让它单独运行 进程,但由于IPC开销会慢一些。我的应用程序 将执行许多全表扫描。额外的写入将被批处理 不是时间关键的。)

解决方案

我在脑海中有一些想法如何解决这个问题,但我不知道它们是否有效 与Spark合作。

  • 也许可以神奇地将Spark配置为只有一个我的实例 每个节点的专有InputFormat。

  • 如果我的InputFormat第一次使用,它会启动一个单独的线程 这将创建数据库连接。然后该线程将继续 作为守护进程,只要JVM存在,它就会存在。这只会起作用 如果每个节点只有一个JVM。如果Spark启动了多个JVM 然后每个都会启动自己的数据库线程,而不是 工作

  • 将我的数据库连接移动到每个节点的单独JVM进程,我的 然后,InputFormat使用IPC连接到此进程。正如我所说,我想避免这种情况。

  • 或许你有另一个更好的主意?

我最喜欢的解决方案是#1,紧接着是#2。

感谢您的任何评论和回答!

3 个答案:

答案 0 :(得分:0)

您是否考虑过排队(缓冲)然后使用spark streaming出列并使用输出格式进行编写。

答案 1 :(得分:0)

如果您的数据库中的数据适合您的火花驱动程序的RAM内存,您可以将其作为集合加载,然后将其并行化为RDD https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#parallelized-collections

答案 2 :(得分:0)

我相信这里最好的选择是从驱动程序而不是执行程序连接到数据库。无论如何,系统的这一部分将成为瓶颈。