Persista logs de jobs do Spark e visualize detalhes de jobs concluídos, como estágios, tarefas e uso de recursos, pelo Spark History Server.
Pré-requisitos
O add-on ack-spark-operator deve estar implantado.
Um cliente kubectl conectado ao cluster ACK. Para mais informações, consulte Conectar-se a um cluster ACK usando kubectl.
Etapa 1: Implantar 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 do ack-spark-history-server, clique em Deploy.
No painel Create, selecione um cluster e namespace e clique em Next.
-
Na página Parameters, defina os parâmetros e clique em OK.
Os parâmetros abaixo configuram o armazenamento de logs, variáveis de ambiente e o Service. Para todas as opções, consulte a aba ConfigMaps na página do ack-spark-history-server.
NotaAo implantar o ack-spark-history-server, especifique um backend de armazenamento para logs, como Object Storage Service (OSS), persistent volume claim (PVC) ou HDFS.
-
(Obrigatório) Configure o backend de armazenamento para logs
Escolha OSS, PVC ou HDFS como backend de armazenamento.
OSS
Defina os seguintes parâmetros.
ImportanteOs logs de jobs do Spark são enviados somente após a conclusão do job. Não é possível visualizar logs de jobs em execução em tempo real.
Parâmetro
Descrição
Exemplo
spark.history.fs.logDirectoryURL do diretório de logs. Crie o diretório, como
spark/spark-events, antes de implantar o add-on. Consulte Gerenciando diretórios.oss://<Bucket name>/spark/spark-eventsstorage.oss.enableAtiva o OSS ou OSS-HDFS como backend de armazenamento para logs.
truestorage.oss.endpointEndpoint do OSS.
oss-cn-beijing-internal.aliyuncs.comstorage.oss.existingSecret(Recomendado) Nome de um Secret existente com credenciais de acesso ao OSS. Consulte Exemplo de arquivo YAML de AccessKey Secret.
spark-oss-secretstorage.oss.createSecretSe nenhum Secret existente for especificado, o sistema cria automaticamente um novo Secret para armazenar as credenciais de acesso ao OSS.
Não aplicável
storage.oss.createSecret.accessKeyIdAccessKey ID da sua conta Alibaba Cloud.
yourAccessKeyID
storage.oss.createSecret.accessKeySecretAccessKey Secret da sua conta Alibaba Cloud.
yourAccessKeySecret
PVC
Defina os seguintes parâmetros.
Parâmetro
Descrição
Exemplo
spark.history.fs.logDirectoryURL do diretório de logs.
file:///mnt/spark/spark-eventsstorage.pvc.enableAtiva um PVC como backend de armazenamento para logs.
truestorage.pvc.nameNome de um PVC existente. Certifique-se de que o PV e o PVC estejam criados e vinculados no namespace
ack-spark-history-server. Consulte Storage-CSI."<PVC name>"storage.pvc.mountPathCaminho de montagem do PVC no contêiner.
"/mnt"HDFS
Defina o seguinte parâmetro.
Parâmetro
Descrição
Exemplo
spark.history.fs.logDirectoryURL 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.Parâmetro
Descrição
Padrão
service.typeTipo do Service. Valores válidos:
-
ClusterIP -
NodePort -
LoadBalancer
ClusterIPservice.portPorta para acessar a interface web.
18080 -
-
(Opcional) Variáveis de ambiente
Adicione variáveis de ambiente em
envpara configurar o History Server.Variável de ambiente
Descrição
Padrão
SPARK_DAEMON_MEMORYMemória alocada para o Spark History Server.
1gSPARK_DAEMON_JAVA_OPTSOpções da JVM para o Spark History Server.
""SPARK_DAEMON_CLASSPATHClasspath para o Spark History Server.
""SPARK_PUBLIC_DNSEndereço público do Spark History Server. Se não definido, o histórico de aplicações usa o endereço interno, o que pode causar links quebrados.
""SPARK_HISTORY_OPTSConjunto de propriedades de configuração
spark.history.*.""Adicione configurações em
sparkConfpara personalizar o History Server. Configurações comuns:Propriedade
Descrição
Padrão
spark.history.fs.update.intervalIntervalo para verificar atualizações de logs.
10sspark.history.fs.retainedApplicationsNúmero máximo de interfaces de aplicação mantidas em cache.
50spark.history.ui.portPorta do Spark History Server.
18080spark.history.fs.cleaner.enabledDefine se os logs de eventos devem ser limpos periodicamente.
falsespark.history.fs.cleaner.intervalIntervalo de limpeza dos logs de eventos quando
spark.history.fs.cleaner.enabled=true.1dspark.history.fs.cleaner.maxAgeIdade máxima dos logs de eventos antes da exclusão quando
spark.history.fs.cleaner.enabled=true.7dspark.history.fs.cleaner.maxNumNúmero máximo de arquivos de log retidos quando
spark.history.fs.cleaner.enabled=true. Arquivos excedentes são excluídos durante a limpeza.Int.MaxValuespark.history.fs.driverlog.cleaner.enabledDefine se os logs de eventos do driver devem ser limpos periodicamente.
spark.history.fs.cleaner.enabledspark.history.fs.driverlog.cleaner.intervalIntervalo 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.maxAgeIdade 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.numReplayThreadsNúmero de threads para processamento de arquivos de log.
25% dos núcleos de CPU disponíveis.
spark.history.store.maxDiskUsageEspaço máximo em disco para o cache de histórico de aplicações.
10g
-
Etapa 2: Acessar a interface web
Por padrão, o tipo do Service é ClusterIP. Encaminhe uma porta local para acessar a interface web. Para usar uma instância SLB existente, consulte Expor uma aplicação usando um Service associado a uma instância SLB existente.
O comando kubectl port-forward destina-se apenas a testes e verificações, não sendo 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: Ativar registro de eventos
Ative o registro de eventos nos seus jobs do Spark configurando os seguintes parâmetros.
|
Parâmetro |
Descrição |
Exemplo |
|
|
Ativa o registro de eventos. Valores válidos:
|
|
|
|
Caminho de armazenamento para logs de eventos. Exemplos:
|
|
Exemplo: Configure o OSS para registro de eventos
O exemplo a seguir configura o OSS como backend de armazenamento para registro de eventos.
-
Crie uma imagem de contêiner Spark
As imagens Spark da comunidade não incluem os pacotes JAR do OSS. Crie uma imagem personalizada com os JARs do Hadoop OSS SDK mostrados abaixo e envie-a para seu repositório. Consulte Criar uma imagem usando uma instância Enterprise Edition. 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 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 Spark
Modifique os seguintes parâmetros no manifesto SparkApplication conforme seu ambiente:
Parâmetro
Descrição
Exemplo
imageEndereço da imagem personalizada do contêiner Spark.
registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2-ossfs.oss.endpointEndpoint do OSS.
oss-cn-beijing-internal.aliyuncs.comspark.eventLog.dirCaminho de armazenamento dos logs. O caminho deve existir; caso contrário, o job falhará 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 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
-