2015-06-06 16 views
7

Ho un sistema di Akka scritto in scala che ha bisogno di chiamare a un certo codice Python, basandosi su Pandas e Numpy, quindi non può semplicemente utilizzare Jython. Ho notato che Spark usa CPython sui suoi nodi worker, quindi sono curioso di sapere come si esegue il codice Python e se quel codice esiste in qualche forma riutilizzabile.Come fa Spark interoperare con CPython

risposta

9

L'architettura di PySpark è descritta qui https://cwiki.apache.org/confluence/display/SPARK/PySpark+Internals.

PySpark internals

Come @Holden detto Spark utilizza py4j per accedere agli oggetti Java nella JVM dal pitone. Ma questo è solo un caso - quando il programma del driver è scritto in python (parte sinistra del diagramma)

L'altro caso (la parte destra del diagramma) - quando Spark Worker avvia il processo Python e invia oggetti serializzati Java a python programma da elaborare e riceve output. Gli oggetti Java sono serializzati in formato pickle, quindi python potrebbe leggerli.

Sembra che quello che stai cercando è il secondo caso. Ecco alcuni link per nucleo scala della scintilla che potrebbero essere utili per voi per iniziare:

  • Pyrolite libreria che fornisce l'interfaccia Java per i protocolli di salamoia di Python - usato da Spark per serializzare oggetti Java in formato salamoia. Ad esempio tale conversione è necessaria per accedere alla parte Chiave della chiave, coppie di valori per il PairRDD.

  • codice Scala che avvia processo pitone e scorre con esso: api/python/PythonRDD.scala

  • utils SerDeser che la raccolta del codice: api/python/SerDeUtil.scala

  • pitone collaterali: python/pyspark/worker.py

3

Quindi Spark utilizza py4j per comunicare tra JVM e Python. Ciò consente a Spark di funzionare con diverse versioni di Python ma richiede la serializzazione dei dati dalla JVM e viceversa per comunicare. Ci sono più informazioni su py4j a http://py4j.sourceforge.net/, speriamo che sia di aiuto :)

Problemi correlati