La lectura de los archivos enviados con chispa a presentar por el conductor

Estoy enviando una Chispa de trabajo para que se ejecute en un clúster remoto mediante la ejecución de

spark-submit ... --deploy-mode cluster --files some.properties ...

Quiero leer el contenido de la some.properties archivo de la conductor código, es decir, antes de la creación de la Chispa contexto y el lanzamiento de RDD tareas. El archivo se copia en el controlador remoto, pero no para el conductor del directorio de trabajo.

Las formas de evitar este problema, que yo sepa son:

  1. Subir el archivo a HDFS
  2. Almacenar el archivo en la aplicación jar

Ambos son un inconveniente ya que este archivo se cambia con frecuencia en la presentación de dev máquina.

Hay una manera de leer el archivo que se ha cargado mediante el --files bandera durante el controlador de código del método main?

  • Usted podría poner el archivo en un montaje de la red que sea accesible por todos los nodos en el clúster. De esta forma podemos leer desde que monte en su programa controlador. Usted podría exponer a un simple extremo que devuelve el archivo. De esta manera su programa de controlador puede hacer una llamada http.
  • Lo cierto es que, @AlexNaspo, pero redundante. El archivo se transfiere junto con el controlador de tarro, y se almacena en el mismo sistema de archivos en el servidor, sólo que no en la misma carpeta. Enviar de nuevo a través de HTTP parece un desperdicio.
  • En caso de ir con @AlexNaspo sugerencia del entonces usted no tendrá que pasar el archivo de propiedades en via --files por lo que no sería redundante?

7 Kommentare

  1. 21

    Sí, usted puede tener acceso a los archivos que se cargan a través de la --files argumento.

    Esta es la forma en que yo soy capaz de acceder a los archivos que se pasa a través --files:

    ./bin/spark-submit \
    --class com.MyClass \
    --master yarn-cluster \
    --files /path/to/some/file.ext \
    --jars lib/datanucleus-api-jdo-3.2.6.jar,lib/datanucleus-rdbms-3.2.9.jar,lib/datanucleus-core-3.2.10.jar \
    /path/to/app.jar file.ext
    

    y en mi Chispa código:

    val filename = args(0)
    val linecount = Source.fromFile(filename).getLines.size
    

    Yo creo que estos archivos se descargan sobre los trabajadores en el mismo directorio que el frasco se coloca, que es por qué simplemente pasar el nombre del archivo y no la ruta de acceso absoluta a Source.fromFile obras.

    • Esto es lo que he intentado. El archivo se copia en el de los trabajadores directorio de trabajo, pero no para el conductor del directorio. Tal vez es diferente, en el HILO de modo.
    • Oh, lo siento, se me pasa por alto que no se te ejecuta en modo de HILO. Hay una clase auxiliar llamada SparkFiles. SparkFiles.get(filename) devolverá la ruta de acceso donde filename fue descargado, pero usted no será capaz de utilizar hasta después de que la Chispa contexto se inicializa. ¿Hay alguna razón en particular que usted necesita para leer el archivo antes de que la Chispa contexto se inicializa?
    • Yo uso algunas de estas propiedades para establecer parámetros Chispa
    • El docs decir "every executor pulls the file from the driver HTTP server". ¿Significa eso que un simple /path/to/some/file que se almacenan localmente en el master (o como se llame el sistema desde donde se está ejecutando spark-submit) sería suficiente? O tengo que proporcionar un hdfs:// camino o poner manualmente el archivo en la ruta especificada en cada executor de antemano?
  2. 5

    Después de la investigación, he encontrado una solución para el problema anterior. Enviar el cualquier.propiedades de configuración durante la chispa-presentar y utilizar la chispa del controlador antes y después de SparkSession de inicialización. Espero que te ayude.

    cualquier.propiedades

    spark.key=value
    spark.app.name=MyApp
    

    SparkTest.java

    import com.typesafe.config.Config;
    import com.typesafe.config.ConfigFactory;
    
    public class SparkTest{
    
      public Static void main(String[] args){
    
        String warehouseLocation = new File("spark-warehouse").getAbsolutePath();
    
        Config conf = loadConf();
        System.out.println(conf.getString("spark.key"));
    
        //Initialize SparkContext and use configuration from properties
        SparkConf sparkConf = new SparkConf(true).setAppName(conf.getString("spark.app.name"));
    
        SparkSession sparkSession = 
        SparkSession.builder().config(sparkConf).config("spark.sql.warehouse.dir", warehouseLocation)
                    .enableHiveSupport().getOrCreate();
    
        JavaSparkContext javaSparkContext = new JavaSparkContext(sparkSession.sparkContext());
    
      }
    
    
      public static Config loadConf() {
    
          String configFileName = "any.properties";
          System.out.println(configFileName);
          Config configs = ConfigFactory.load(ConfigFactory.parseFile(new java.io.File(configFileName)));
          System.out.println(configs.getString("spark.key")); //get value from properties file
          return configs;
       }
    }
    

    Chispa Presentar:

    spark-submit --class SparkTest --master yarn --deploy-mode client --files any.properties,yy-site.xml --jars ...........
    
  3. 3

    El … de archivos y … opciones de archivos compatible con la especificación de nombres de archivo con el # similar a Hadoop. Por ejemplo, puede especificar: –archivos localtest.txt#appSees.txt y esto cargará el archivo localmente ha llamado localtest.txt en HDFS, pero esto va a ser vinculado con el nombre de appSees.txt y su aplicación debe utilizar el nombre como appSees.txt para hacer referencia a él cuando se ejecuta en el HILO.

    esto funciona para mi spark streaming aplicación en ambos hilos/cliente e hilados/modo de clúster. tal vez puede ayudar a

  4. 1

    uso spark-submit --help, encontrará que esta opción es sólo para el directorio de trabajo del ejecutor no conductor.

    --files FILES: Comma-separated list of files to be placed in the working directory of each executor.

  5. 0

    Aquí tienes una buena solución que he desarrollado en Python Chispa con el fin de integrar los datos como un archivo de fuera a su Gran plataforma de Datos.

    Divertirse.

    # Load from the Spark driver any local text file and return a RDD (really useful in YARN mode to integrate new data at the fly)
    # (See https://community.hortonworks.com/questions/38482/loading-local-file-to-apache-spark.html)
    def parallelizeTextFileToRDD(sparkContext, localTextFilePath, splitChar):
        localTextFilePath = localTextFilePath.strip(' ')
        if (localTextFilePath.startswith("file://")):
            localTextFilePath = localTextFilePath[7:]
        import subprocess
        dataBytes = subprocess.check_output("cat " + localTextFilePath, shell=True)
        textRDD = sparkContext.parallelize(dataBytes.split(splitChar))
        return textRDD
    
    # Usage example
    myRDD = parallelizeTextFileToRDD(sc, '~/myTextFile.txt', '\n') # Load my local file as a RDD
    myRDD.saveAsTextFile('/user/foo/myTextFile') # Store my data to HDFS
    
  6. 0

    Una forma de evitar el problema es que usted puede crear un temporal de SparkContext simplemente llamando SparkContext.getOrCreate() y, a continuación, leer el archivo que pasa en el --files con la ayuda de SparkFiles.get('FILE').

    Una vez que usted lea el archivo de recuperar toda la configuración necesaria que se requiere en una SparkConf() variable.

    Después de que la llamada a esta función:

    SparkContext.stop(SparkContext.getOrCreate())
    

    Esto distroy la existente SparkContext y que en la siguiente línea simplemente iniciar una nueva SparkContext con las configuraciones necesarias como este.

    sc = SparkContext(conf=conf).getOrCreate()
    

    Usted mismo tiene una SparkContext con la configuración deseada

  7. 0

    En pyspark, me parece realmente interesante para lograr esto fácilmente, primero arregla tu directorio de trabajo como:

    /path/to/your/workdir/
    |--code.py
    |--file.txt
    

    y, a continuación, en su code.py función principal, acabo de leer el archivo como de costumbre:

    if __name__ == "__main__":
        content = open("./file.txt").read()
    

    a continuación, presentar sin ningún tipo de configuraciones específicas de la siguiente manera:

    spark-submit code.py
    

    se ejecuta correctamente, que me sorprende. Supongo que el presente proceso los archivos todos los archivos y sub-directorios de los archivos por completo y se envía al controlador en pyspark, mientras que usted debe archivar sí mismo en la scala de versión. Por el camino, tanto de archivos y … de archivos opciones de trabajo en el trabajador y no el conductor, lo que significa que sólo se puede acceder a estos archivos en RDD transformaciones o acciones.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...