【问题标题】:Spark: run InputFormat as singletonSpark:将 InputFormat 作为单例运行
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你有没有想过排队(缓冲)然后使用火花流来出列并使用你的输出格式来写。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 1970-01-01
        • 2015-01-25
        • 2020-08-15
        相关资源
        最近更新 更多