Spark:将InputFormat作为singleton运行

cru*_*ahl 17 database hadoop apache-spark

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

场景:

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

问题:

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

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

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

解决方案:

我在脑海中有一些想法如何解决这个问题,但我不知道它们是否适用于Spark.

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

  • 如果我的InputFormat第一次使用,它会启动一个单独的线程来创建数据库连接.然后,该线程将继续作为守护进程,并且只要JVM存在,它就会存在.这仅在每个节点只有一个JVM时才有效.如果Spark在同一节点上启动多个JVM,那么每个JVM都会启动自己的数据库线程,这不起作用.

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

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

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

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

Pat*_*uts 0

您是否考虑过排队(缓冲区),然后使用 Spark Streaming 出队并使用输出格式进行写入。