【发布时间】:2019-01-22 09:14:20
【问题描述】:
我正在尝试将键值数据库集成到 Spark 并有一些问题。 我是 Spark 初学者,阅读了很多内容并运行了一些示例,但也没有 复杂。
场景:
我正在使用一个小型 hdfs 集群将传入的消息存储在数据库中。 集群有 5 个节点,数据被分成 5 个分区。每个 分区存储在单独的数据库文件中。因此每个节点都可以处理 它自己的数据分区。
问题:
数据库软件的接口是基于JNI的,数据库本身是 用C实现。出于技术原因,数据库软件可以维护 一次只有一个活动连接。只能有一个JVM进程 已连接到数据库。
由于这个限制,读取和写入数据库必须走 通过同一个JVM进程。
(背景信息:数据库嵌入到进程中。它是基于文件的, 一次只能打开一个进程。我可以让它单独运行 过程,但由于 IPC 开销,这会更慢。我的应用程序 将执行许多全表扫描。额外的写入将被批处理并且是 时间紧迫。)
解决方案:
我有一些想法如何解决这个问题,但我不知道它们是否有效 非常适合 Spark。
也许可以神奇地将 Spark 配置为只有一个我的实例 每个节点的专有 InputFormat。
如果我的 InputFormat 是第一次使用,它会启动一个单独的线程 这将创建数据库连接。该线程将继续 作为守护进程,只要 JVM 存在,它就会存在。这只会工作 如果每个节点只有一个 JVM。如果 Spark 在 同一个节点,然后每个节点都会启动自己的数据库线程,这不会 工作。
将我的数据库连接移动到每个节点的单独 JVM 进程,然后我的 InputFormat 然后使用 IPC 连接到这个进程。正如我所说,我想避免这种情况。
或者您还有其他更好的主意?
我最喜欢的解决方案是#1,紧随其后的是#2。
感谢您的任何评论和回答!
【问题讨论】:
-
我选择了#3,因为#1 和#2 似乎不可能。
标签: database hadoop apache-spark