Estoy tratando de ejecutar un trabajo de Spark. Este es mi script de shell, que se encuentra en /home/full/path/to/file/shell/my_shell_script.sh:

confLocation=../conf/my_config_file.conf &&
executors=8 &&
memory=2G &&
entry_function=my_function_in_python &&
dos2unix $confLocation &&
spark-submit \
        --master yarn-client \
        --num-executors $executors \
        --executor-memory $memory \
        --py-files /home/full/path/to/file/python/my_python_file.py $entry_function $confLocation

Cuando ejecuto esto, aparece un error que dice:

Error: no se puede cargar la clase principal del archivo JAR: / home / full / path / to / file / shell / my_function_in_python

Mi impresión aquí es que está buscando en el lugar equivocado (el archivo python se encuentra en el directorio python, no en el directorio shell).

7
Katya Handler 10 dic. 2015 a las 21:37

3 respuestas

La mejor respuesta

Lo que funcionó para mí fue simplemente pasar los archivos de Python sin el comando --py-files. Se ve como esto:

confLocation=../conf/my_config_file.conf &&
executors=8 &&
memory=2G &&
entry_function=my_function_in_python &&
dos2unix $confLocation &&
spark-submit \
        --master yarn-client \
        --num-executors $executors \
        --executor-memory $memory \
        /home/full/path/to/file/python/my_python_file.py $entry_function $confLocation
0
Katya Handler 15 dic. 2015 a las 19:54

El indicador --py-files es para las dependencias de archivos python adicionales utilizadas desde su programa; puede ver aquí en SparkSubmit.scala usa el llamado" argumento primario ", que significa primer argumento sin bandera, para determinar si se debe hacer un modo" submit jarfile "o" submit python main ".

Es por eso que lo ve tratando de cargar su "$ entry_function" como un archivo jar que no existe, ya que solo asume que está ejecutando Python si ese argumento primario termina con ".py", y de lo contrario por defecto asume que tiene un archivo .jar

En lugar de utilizar --py-files, simplemente haga que su /home/full/path/to/file/python/my_python_file.py sea el argumento principal; entonces puede hacer python elegante para tomar la "función de entrada" como un argumento de programa, o simplemente llamar a su función de entrada en su función principal dentro del archivo python.

Alternativamente, aún puede usar --py-files y luego crear un nuevo archivo principal .py que llama a su función de entrada, y luego pasar ese archivo .py principal como argumento principal.

7
Dennis Huo 10 dic. 2015 a las 22:59

Al agregar elementos a --py-files, use una coma para separarlos sin dejar espacio. Prueba esto:

confLocation=../conf/my_config_file.conf &&
executors=8 &&
memory=2G &&
entry_function=my_function_in_python &&
dos2unix $confLocation &&
spark-submit \
        --master yarn-client \
        --num-executors $executors \
        --executor-memory $memory \
        --py-files /home/full/path/to/file/python/my_python_file.py,$entry_function,$confLocation
1
Tree DR 17 may. 2019 a las 14:41
34209299