Искра: запустите InputFormat как singleton

Я пытаюсь интегрировать базу данных ключ-значение в Spark и задавать некоторые вопросы. Я новичок в Spark, много читаю и запускаю образцы, но ничего комплекс.

Сценарий

Я использую небольшой кластер hdfs для хранения входящих сообщений в базе данных. Кластер имеет 5 узлов, а данные разделены на 5 разделов. каждый раздел хранится в отдельном файле базы данных. Поэтому каждый node может обрабатывать его собственный раздел данных.

Проблема:

Интерфейс к программному обеспечению базы данных основан на JNI, сама база данных реализован в C. По техническим причинам программное обеспечение базы данных может поддерживать только одно активное соединение за раз. Может быть только один процесс JVM, который подключен к базе данных.

Из-за этого ограничения чтение и запись в базу данных должны идти через тот же процесс JVM.

(Фоновая информация: база данных встроена в процесс. Она основана на файле, и только один процесс может открыть его за раз. Я мог бы позволить ему работать в отдельном процесса, но это будет медленнее из-за превышения IPC. Мое выражение будет выполнять много полных сканирований таблицы. Дополнительные записи будут собраны и не зависящий от времени.)

Решение:

У меня есть несколько идей в моем уме, как это решить, но я не знаю, работают ли они хорошо с Spark.

  • Возможно, возможно волшебным образом настроить Spark только для одного экземпляра моего запатентованный InputFormat за node.

  • Если мой InputFormat используется в первый раз, он запускает отдельный поток который создаст соединение с базой данных. Затем этот поток продолжит как демона и будет жить до тех пор, пока живет JVM. Это будет работать только если имеется только одна JVM за node. Если Spark запускает несколько JVM на тот же node, тогда каждый начнет свой собственный поток базы данных, что не будет работа.

  • Переместите мое соединение с базой данных на отдельный процесс JVM за node, а мой Затем InputFormat использует IPC для подключения к этому процессу. Как я уже сказал, я бы хотел этого избежать.

  • Или, может быть, у вас есть другая, лучшая идея?

Моим любимым решением было бы # 1, а рядом - №2.

Спасибо за любые комментарии и ответы!

Ответ 1

Вы думали о очереди (буфере), а затем использовали искровой поток для удаления из очереди и использовали свой формат вывода для записи.

Ответ 3

Я считаю, что лучшим вариантом здесь является подключение к вашей БД от драйвера, а не от исполнителей. Эта часть системы в любом случае была бы узким местом.