Ho un cluster RMI. Ogni server RMI ha un contesto Spark. C'è un modo per condividere un RDD tra diversi contesti Spark?Come condividere Spark RDD tra 2 contesti Spark?
risposta
No, un RDD è collegato a un singolo SparkContext
. L'idea generale è che hai un cluster Spark e un programma driver che dice al cluster cosa fare. Questo driver avrebbe il SparkContext
e avviare le operazioni sugli RDD.
Se si desidera spostare semplicemente un RDD da un programma di driver a un altro, la soluzione è di scriverlo su disco (S3/HDFS/...) nel primo driver e caricarlo da disco nell'altro driver.
Come già affermato da Daniel Darabos non è possibile. Ogni oggetto distribuito in Spark è limitato a un contesto specifico che è stato utilizzato per crearlo (SparkContext
in caso di RDD, SQLContext
in caso di set di dati DataFrame
). Se si desidera condividere oggetti tra applicazioni, è necessario utilizzare i contesti condivisi (vedere ad esempio spark-jobserver
, Livy o Apache Zeppelin). Dal RDD
o DataFrame
è solo un piccolo oggetto locale non c'è davvero molto da condividere.
La condivisione dei dati è un problema completamente diverso. È possibile utilizzare la cache di memoria specializzata (Apache Ignite) o distribuita in file system di memoria (come Alluxio - ex Tachyon) per ridurre al minimo la latenza quando si passa da un'applicazione all'altra, ma non è possibile evitarla.
Non è nativamente, a mio avviso, RDD non è dati, ma un modo per creare dati tramite trasformazioni/filtri dai dati originali.
Un'altra idea è quella di condividere i dati finali. Quindi, si memorizzare il RDD in un data-store, come ad esempio: - HDFS (un file in parquet, ecc ..) - elasticsearch - Apache Ignite (in memoria)
penso che vi piacerà Apache Ignite : https://ignite.apache.org/features/igniterdd.html
Apache Ignite fornisce un'implementazione di Spark RDD astrazione che consenta di condividere facilmente stato in memoria su più Spark lavori, sia all'interno della stessa applicazione o tra diversi Spark applicazioni.
IgniteRDD è implementato come è una vista su una cache Ignite distribuita, che può essere implementato sia nel processo di lavoro Spark esecuzione, o su un lavoratore Spark, o nel proprio cluster.
(ho lasciato si scava la loro documentazione per trovare quello che stai cercando.)