У меня есть кластер RMI. Каждый сервер RMI имеет контекст Spark. Есть ли способ поделиться RDD между разными контекстами Spark?
Как разделить Spark RDD между двумя контекстами Spark?
Ответы (3)
Как уже заявил Даниэль Дарабос, это невозможно. Каждый распределенный объект в Spark привязан к определенному контексту, который использовался для его создания (SparkContext
в случае RDD, SQLContext
в случае DataFrame
набора данных). Если вы хотите совместно использовать объекты между приложениями, вы должны использовать общие контексты (см., например, spark-jobserver
, Ливи или Apache Zeppelin). Так как RDD
или DataFrame
— это всего лишь небольшой локальный объект, делиться им особо нечем.
Совместное использование данных — это совсем другая проблема. Вы можете использовать специализированный кэш в памяти (Apache Ignite) или распределенный в файловых системах памяти (например, Alluxio — бывший Tachyon), чтобы минимизировать задержку при переключении между приложениями, но вы не можете этого избежать.
Нет, RDD привязан к одному SparkContext
. Общая идея заключается в том, что у вас есть кластер Spark и одна программа-драйвер, которая сообщает кластеру, что делать. Этот драйвер будет иметь SparkContext
и запускать операции с RDD.
Если вы хотите просто переместить RDD из одной программы драйвера в другую, решение состоит в том, чтобы записать его на диск (S3/HDFS/...) в первом драйвере и загрузить его с диска в другом драйвере.
Вы не можете изначально, в моем понимании, RDD - это не данные, а способ создания данных с помощью преобразований/фильтров из исходных данных.
Другая идея - вместо этого поделиться окончательными данными. Итак, вы будете хранить RDD в хранилище данных, например: - HDFS (файл паркета и т. д.) - Elasticsearch - Apache Ignite (в памяти)
Я думаю, вам понравится Apache Ignite: https://ignite.apache.org/features/igniterdd.html
Apache Ignite предоставляет реализацию абстракции Spark RDD, которая позволяет легко обмениваться состоянием в памяти между несколькими заданиями Spark либо в одном приложении, либо между разными приложениями Spark.
IgniteRDD реализован как представление распределенного кэша Ignite, который может быть развернут либо в рамках процесса выполнения задания Spark, либо на рабочем процессе Spark, либо в собственном кластере.
(Я позволяю вам копаться в их документации, чтобы найти то, что вы ищете.)