Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

285
Views
¿Cómo corregir "NullPointerException: projectId no debe ser nulo" en la aplicación Spark en GKE?

Estoy implementando una aplicación Spark Structured Streaming en Google Kubernetes Engine y, al acceder a un depósito con el esquema gs:// URI, me encuentro con la siguiente excepción:

 Exception in thread "main" java.lang.NullPointerException: projectId must not be null at com.google.cloud.hadoop.repackaged.gcs.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:897) at com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.createBucket(GoogleCloudStorageImpl.java:437) at com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorage.createBucket(GoogleCloudStorage.java:88) at com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageFileSystem.mkdirsInternal(GoogleCloudStorageFileSystem.java:456) at com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageFileSystem.mkdirs(GoogleCloudStorageFileSystem.java:444) at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.mkdirs(GoogleHadoopFileSystemBase.java:911) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:2275) at org.apache.spark.sql.execution.streaming.StreamExecution.<init>(StreamExecution.scala:137) at org.apache.spark.sql.execution.streaming.MicroBatchExecution.<init>(MicroBatchExecution.scala:50) at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:317) at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:359) at org.apache.spark.sql.streaming.DataStreamWriter.startQuery(DataStreamWriter.scala:466) at org.apache.spark.sql.streaming.DataStreamWriter.startInternal(DataStreamWriter.scala:456) at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:301) at meetup.SparkStreamsApp$.delayedEndpoint$meetup$SparkStreamsApp$1(SparkStreamsApp.scala:25) at meetup.SparkStreamsApp$delayedInit$body.apply(SparkStreamsApp.scala:7)

Estoy bastante seguro de que está relacionado con una cuenta de servicio para acceder y crear subdirectorios en el depósito que he estado usando mientras Spark spark-submit la aplicación Spark localmente usando la variable de entorno GOOGLE_APPLICATION_CREDENTIALS y spark.hadoop.google.cloud.auth.service.account.enable=true propiedad de configuración.

Estoy implementando la aplicación Spark de la siguiente manera:

 ./bin/spark-submit \ --master k8s://$K8S_SERVER \ --deploy-mode cluster \ --name $POD_NAME \ --class meetup.SparkStreamsApp \ --conf spark.kubernetes.driver.request.cores=400m \ --conf spark.kubernetes.executor.request.cores=100m \ --conf spark.kubernetes.container.image=$SPARK_IMAGE \ --conf spark.kubernetes.driver.pod.name=$POD_NAME \ --conf spark.kubernetes.namespace=$K8S_NAMESPACE \ --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \ --conf spark.kubernetes.submission.waitAppCompletion=false \ --conf spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem \ --conf spark.hadoop.google.cloud.auth.service.account.enable=true \ --verbose \ local:///opt/spark/jars/meetup.spark-streams-demo-0.1.0.jar $BUCKET_NAME

¿Cómo solucionarlo de una manera adecuada con Kubernetes/GKE?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Según su configuración, le sugiero que agregue la siguiente propiedad fs.gs.project.id como se indica aquí . Como se muestra como Required. Google Cloud Project ID with access to configured GCS buckets .

Además, estoy de acuerdo con la declaración de @blackbishop sobre la gestión secreta.

over 4 years ago · Santiago Trujillo Report

0

La forma recomendada en la documentación de GKE es Importar credenciales como un secreto :

 kubectl create secret generic spark-streaming-sa --from-file=/path/spark-streaming-serviceaccount-key.json

Y cuando envíe el trabajo, agregue las siguientes configuraciones:

 --conf spark.kubernetes.driver.secrets.spark-streaming-sa=<mount path> --conf spark.kubernetes.executor.secrets.spark-streaming-sa=<mount path> --conf spark.kubernetes.driverEnv.GOOGLE_APPLICATION_CREDENTIALS=<mount path>/spark-streaming-sa.json --conf spark.executorEnv.GOOGLE_APPLICATION_CREDENTIALS=<mount path>/spark-streaming-sa.json --conf spark.hadoop.google.cloud.auth.service.account.json.keyfile=<mount path>/spark-streaming-sa.json

Puede consultar los ejemplos proporcionados en Github GoogleCloudPlatform/spark-on-k8s-gcp-examples .

Esto también se describe en la sección Gestión de secretos de los documentos de Spark Ejecución de Spark en Kubernetes :

Los secretos de Kubernetes se pueden usar para proporcionar credenciales para que una aplicación Spark acceda a servicios seguros. Para montar un secreto especificado por el usuario en el contenedor del controlador, los usuarios pueden usar la propiedad de configuración del formulario spark.kubernetes.driver.secrets.[SecretName]=<mount path> . De manera similar, la propiedad de configuración con el formato spark.kubernetes.executor.secrets.[SecretName]=<mount path> se puede usar para montar un secreto especificado por el usuario en los contenedores del ejecutor.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!