Persista logs de jobs do Spark e visualize detalhes de jobs concluídos, como estágios, tarefas e uso de recursos, por meio do Spark History Server.
Pré-requisitos
O add-on ack-spark-operator está implantado.
Um cliente kubectl está conectado ao cluster ACK. Para mais informações, consulte Connect to an ACK cluster using kubectl.
Etapa 1: Implante o add-on ack-spark-history-server
Faça login no ACK console. No painel de navegação à esquerda, clique em .
Na página Marketplace, clique na aba App Catalog, pesquise e selecione ack-spark-history-server.
Na página ack-spark-history-server, clique em Deploy.
No painel Create, selecione um cluster e um namespace e clique em Next.
-
Na página Parameters, defina os parâmetros e clique em OK.
Os parâmetros a seguir configuram o armazenamento de logs, as variáveis de ambiente e o service. Para ver todas as opções, consulte a aba ConfigMaps na página ack-spark-history-server.
NotaAo implantar o ack-spark-history-server, especifique um armazenamento de backend para os logs, como Object Storage Service (OSS), um persistent volume claim (PVC) ou HDFS.
-
(Obrigatório) Configure o armazenamento de backend para logs
Escolha OSS, PVC ou HDFS como armazenamento de backend.
OSS
Defina os parâmetros a seguir.
ImportanteOs logs de jobs do Spark são enviados apenas após a conclusão do job. Não é possível visualizar logs de jobs em execução em tempo real.
Parameter
Description
Example
spark.history.fs.logDirectoryA URL do diretório de logs. Crie o diretório, como
spark/spark-events, antes de implantar o add-on. Consulte Managing Directories.oss://<Bucket name>/spark/spark-eventsstorage.oss.enableAtiva o OSS ou OSS-HDFS como armazenamento de backend para logs.
truestorage.oss.endpointO endpoint do OSS.
oss-cn-beijing-internal.aliyuncs.comstorage.oss.existingSecret(Recomendado) O nome de um Secret existente com as credenciais de acesso ao OSS. Consulte Example of an AccessKey Secret YAML file.
spark-oss-secretstorage.oss.createSecretSe nenhum Secret existente for especificado, um novo Secret é criado automaticamente para armazenar as credenciais de acesso ao OSS.
Não aplicável
storage.oss.createSecret.accessKeyIdO AccessKey ID da sua conta Alibaba Cloud.
yourAccessKeyID
storage.oss.createSecret.accessKeySecretO AccessKey Secret da sua conta Alibaba Cloud.
yourAccessKeySecret
PVC
Defina os parâmetros a seguir.
Parameter
Description
Example
spark.history.fs.logDirectoryA URL do diretório de logs.
file:///mnt/spark/spark-eventsstorage.pvc.enableAtiva um PVC como armazenamento de backend para logs.
truestorage.pvc.nameO nome de um PVC existente. Verifique se o PV e o PVC foram criados e vinculados no namespace
ack-spark-history-server. Consulte Storage-CSI."<PVC name>"storage.pvc.mountPathO caminho de montagem do PVC no container.
"/mnt"HDFS
Defina o parâmetro a seguir.
Parameter
Description
Example
spark.history.fs.logDirectoryA URL do diretório de logs.
hdfs://namenode:port/spark/spark-events -
(Opcional) Tipo e porta do service
Por padrão, um service expõe a interface web do History Server. Configure o tipo e a porta com
service.typeeservice.port.Parameter
Description
Default
service.typeO tipo do service. Valores válidos:
-
ClusterIP -
NodePort -
LoadBalancer
ClusterIPservice.portA porta para acessar a interface web.
18080 -
-
(Opcional) Variáveis de ambiente
Adicione variáveis de ambiente em
envpara configurar o History Server.Environment variable
Description
Default
SPARK_DAEMON_MEMORYA memória alocada ao Spark History Server.
1gSPARK_DAEMON_JAVA_OPTSAs opções JVM para o Spark History Server.
""SPARK_DAEMON_CLASSPATHO classpath do Spark History Server.
""SPARK_PUBLIC_DNSO endereço público do Spark History Server. Se não definido, o histórico da aplicação usa o endereço interno, o que pode causar links quebrados.
""SPARK_HISTORY_OPTSUm conjunto de propriedades de configuração
spark.history.*.""Adicione configurações em
sparkConfpara personalizar o History Server. Configurações comuns:Property
Description
Default
spark.history.fs.update.intervalO intervalo de verificação de atualizações nos logs.
10sspark.history.fs.retainedApplicationsO número máximo de UIs de aplicação em cache.
50spark.history.ui.portA porta do Spark History Server.
18080spark.history.fs.cleaner.enabledIndica se os logs de eventos são limpos periodicamente.
falsespark.history.fs.cleaner.intervalO intervalo de limpeza dos logs de eventos quando
spark.history.fs.cleaner.enabled=true.1dspark.history.fs.cleaner.maxAgeA idade máxima dos logs de eventos antes da exclusão quando
spark.history.fs.cleaner.enabled=true.7dspark.history.fs.cleaner.maxNumO número máximo de arquivos de log retidos quando
spark.history.fs.cleaner.enabled=true. Os arquivos excedentes são excluídos durante a limpeza.Int.MaxValuespark.history.fs.driverlog.cleaner.enabledIndica se os logs de eventos do driver são limpos periodicamente.
spark.history.fs.cleaner.enabledspark.history.fs.driverlog.cleaner.intervalO intervalo de limpeza dos logs de eventos do driver quando
spark.history.fs.driverlog.cleaner.enabled=true.spark.history.fs.cleaner.intervalspark.history.fs.driverlog.cleaner.maxAgeA idade máxima dos logs de eventos do driver antes da exclusão quando
spark.history.fs.driverlog.cleaner.enabled=true.spark.history.fs.cleaner.maxAgespark.history.fs.numReplayThreadsO número de threads para processar arquivos de log.
25% dos núcleos de CPU disponíveis.
spark.history.store.maxDiskUsageO espaço máximo em disco para o cache do histórico da aplicação.
10g
-
Etapa 2: Acesse a interface web
Por padrão, o tipo de service é ClusterIP. Encaminhe uma porta local para acessar a interface web. Para usar uma instância SLB existente, consulte Expose an application by using a Service that is associated with an existing SLB instance.
O kubectl port-forward destina-se apenas a verificações de teste e não é adequado para produção devido a riscos de segurança.
-
Configure o encaminhamento de porta local:
RELEASE_NAME=spark-history-server RELEASE_NAMESPACE=spark-operator SERVICE_NAME=${RELEASE_NAME}-service SERVICE_PORT=$(kubectl get service ${SERVICE_NAME} --namespace ${RELEASE_NAMESPACE} -o jsonpath="{.spec.ports[0].port}") echo "Now you can go to http://127.0.0.1:18080 to visit spark history server." kubectl port-forward --namespace ${RELEASE_NAMESPACE} services/${SERVICE_NAME} 18080:${SERVICE_PORT}Saída esperada:
Now you can go to http://127.0.0.1:18080 to visit spark history server. Forwarding from 127.0.0.1:18080 -> 18080 Forwarding from [::1]:18080 -> 18080 -
Acesse http://127.0.0.1:18080 para visualizar a interface web do Spark History Server.

Etapa 3: Ative o registro de eventos
Ative o registro de eventos nos seus jobs do Spark configurando os parâmetros a seguir.
|
Parameter |
Description |
Example |
|
|
Ativa o registro de eventos. Valores válidos:
|
|
|
|
O caminho de armazenamento dos logs de eventos. Exemplos:
|
|
Exemplo: Configure o OSS para registro de eventos
O exemplo a seguir configura o OSS como armazenamento de backend para o registro de eventos.
-
Compile uma imagem de container do Spark
As imagens oficiais do Spark não incluem os pacotes JAR do OSS. Compile uma imagem personalizada com os JARs do Hadoop OSS SDK indicados abaixo e envie-a para o seu repositório. Consulte Build an image by using an Enterprise Edition instance. Utilize JARs de dependência compatíveis com a versão do Hadoop correspondente à sua versão do Spark.
ARG SPARK_IMAGE=registry-cn-hangzhou.ack.aliyuncs.com/dev/spark:3.5.2 FROM ${SPARK_IMAGE} # Add dependency for Hadoop Aliyun OSS support ADD --chmod=644 https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aliyun/3.3.4/hadoop-aliyun-3.3.4.jar ${SPARK_HOME}/jars ADD --chmod=644 https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.17.4/aliyun-sdk-oss-3.17.4.jar ${SPARK_HOME}/jars ADD --chmod=644 https://repo1.maven.org/maven2/org/jdom/jdom2/2.0.6.1/jdom2-2.0.6.1.jar ${SPARK_HOME}/jars -
Crie um Secret
Crie um Secret no namespace do seu job do Spark para armazenar as credenciais de acesso ao OSS.
-
Crie o seguinte arquivo de manifesto
spark-oss-secret.yaml:apiVersion: v1 kind: Secret metadata: name: spark-oss-secret namespace: default stringData: # The AccessKey ID of your Alibaba Cloud account. OSS_ACCESS_KEY_ID: "" # The AccessKey Secret of your Alibaba Cloud account. OSS_ACCESS_KEY_SECRET: "" -
Crie o Secret:
kubectl apply -f spark-oss-secret.yamlSaída esperada:
secret/spark-oss-secret created
-
-
Envie o job do Spark
Modifique os parâmetros a seguir no manifesto SparkApplication para o seu ambiente:
Parameter
Description
Example
imageO endereço da imagem de container do Spark personalizada.
registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2-ossfs.oss.endpointO endpoint do OSS.
oss-cn-beijing-internal.aliyuncs.comspark.eventLog.dirO caminho de armazenamento dos logs. O caminho deve existir; caso contrário, o job falha em tempo de execução.
oss://<Bucket name>/spark/spark-events-
Crie o seguinte manifesto SparkApplication e salve-o como
spark-pi.yaml.apiVersion: sparkoperator.k8s.io/v1beta2 kind: SparkApplication metadata: name: spark-pi-oss namespace: default spec: type: Scala mode: cluster image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2-oss mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar mainClass: org.apache.spark.examples.SparkPi sparkVersion: 3.5.2 hadoopConf: fs.AbstractFileSystem.oss.impl: org.apache.hadoop.fs.aliyun.oss.OSS fs.oss.impl: org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem # The OSS endpoint. fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com fs.oss.credentials.provider: com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider sparkConf: spark.eventLog.enabled: "true" # The path where logs are stored. spark.eventLog.dir: oss://<Bucket name>/spark/spark-events driver: cores: 1 coreLimit: 1200m memory: 512m serviceAccount: spark-operator-spark envFrom: - secretRef: name: spark-oss-secret executor: instances: 1 cores: 1 coreLimit: 1200m memory: 512m envFrom: - secretRef: name: spark-oss-secret restartPolicy: type: Never -
Envie o job do Spark. Após a conclusão, visualize o histórico em http://127.0.0.1:18080.
kubectl apply -f spark-pi.yamlSaída esperada:
sparkapplication.sparkoperator.k8s.io/spark-pi created
-