Quando cria um cluster do Dataproc, pode especificar ações de inicialização em ficheiros executáveis ou scripts que o Dataproc vai executar em todos os nós do cluster do Dataproc imediatamente após a configuração do cluster. As ações de inicialização configuram frequentemente dependências de tarefas, como a instalação de pacotes Python, para que as tarefas possam ser enviadas para o cluster sem ter de instalar dependências quando são executadas.
Pode encontrar exemplos de scripts de ações de inicialização nas seguintes localizações: Nota: a Google não suporta estes exemplos.
- Repositório do GitHub
- Cloud Storage: nos contentores públicos
gs://goog-dataproc-initialization-actions-REGION
regionais
Considerações e diretrizes importantes
Não crie clusters de produção que façam referência a ações de inicialização localizadas nos contentores públicos.
gs://goog-dataproc-initialization-actions-REGION
Estes scripts são fornecidos como implementações de referência. Estes scripts são sincronizados com as alterações em curso no repositório do GitHub, e as atualizações a estes scripts podem interromper a criação do cluster. Em alternativa, copie a ação de inicialização do contentor público para uma pasta do contentor do Cloud Storage com controlo de versões, conforme mostrado no exemplo seguinte: Em seguida, crie o cluster referindo-se à cópia no Cloud Storage:REGION=COMPUTE_REGION
gcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \ gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh
gcloud dataproc clusters create CLUSTER_NAME \ --region=${REGION} \ --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \ ...other flags...
As ações de inicialização são executadas em cada nó em série durante a criação do cluster. Também são executados em cada nó adicionado quando os clusters são dimensionados ou dimensionados automaticamente.
Quando atualiza as ações de inicialização, por exemplo, quando sincroniza as ações de inicialização do Cloud Storage com as alterações feitas ao contentor público ou às ações de inicialização do repositório do GitHub, crie uma nova pasta (de preferência, com o nome da versão) para receber as ações de inicialização atualizadas. Se, em alternativa, atualizar a ação de inicialização no local, os novos nós, como os adicionados pelo dimensionamento automático, executam a ação de inicialização atualizada no local e não a ação de inicialização da versão anterior executada nos nós existentes. Essas diferenças na ação de inicialização podem resultar em nós de cluster inconsistentes ou danificados.
As ações de inicialização são executadas como o utilizador
root
. Não precisa de usar osudo
.Use caminhos absolutos nas ações de inicialização.
Use uma linha shebang nas ações de inicialização para indicar como o script deve ser interpretado (como
#!/bin/bash
ou#!/usr/bin/python
).Se uma ação de inicialização terminar com um código de saída diferente de zero, a operação de criação do cluster vai comunicar um estado "ERROR" (ERRO). Para depurar a ação de inicialização, use o SSH para estabelecer ligação às instâncias de VM do cluster e, em seguida, examine os registos. Depois de corrigir o problema da ação de inicialização, pode eliminar e, em seguida, recriar o cluster.
Se criar um cluster do Dataproc com apenas endereços IP internos, as tentativas de acesso ao
github.com
através da Internet numa ação de inicialização falham, a menos que tenha configurado rotas para direcionar o tráfego através do Cloud NAT ou de uma Cloud VPN. Sem acesso à Internet, pode ativar o acesso privado à Google e colocar dependências de tarefas no Cloud Storage. Os nós do cluster podem transferir as dependências do Cloud Storage a partir de IPs internos.Pode usar imagens personalizadas do Dataproc em vez de ações de inicialização para configurar dependências de tarefas.
Processamento de inicialização:
- Clusters de imagens anteriores à versão 2.0:
- Principal: para permitir que as ações de inicialização sejam executadas em principais para escrever ficheiros no HDFS, as ações de inicialização do nó principal não são iniciadas até que o HDFS seja gravável (até que o HDFS tenha saído do modo de segurança e, pelo menos, dois DataNodes do HDFS tenham aderido).
- Worker: se definir a
dataproc:dataproc.worker.custom.init.actions.mode
propriedade do cluster comoRUN_BEFORE_SERVICES
, cada worker executa as respetivas ações de inicialização antes de iniciar os daemons HDFS datanode e YARN nodemanager. Uma vez que o Dataproc não executa ações de inicialização do nó principal até que o HDFS seja gravável, o que requer a execução de 2 daemons de nó de dados do HDFS, a definição desta propriedade pode aumentar o tempo de criação do cluster.
Clusters de imagens 2.0 ou superior:
- Principal: as ações de inicialização do nó principal podem ser executadas antes de o HDFS ser gravável. Se executar ações de inicialização que preparam
ficheiros no HDFS ou dependem da disponibilidade de serviços dependentes do HDFS,
como o Ranger, defina a
dataproc.master.custom.init.actions.mode
propriedade do cluster paraRUN_AFTER_SERVICES
. Nota: uma vez que esta definição de propriedade pode aumentar o tempo de criação de clusters (consulte a explicação do atraso na criação de clusters para trabalhadores de clusters de imagens anteriores à versão 2.0), use-a apenas quando necessário (como prática geral, confie na definiçãoRUN_BEFORE_SERVICES
predefinida para esta propriedade). - Trabalhador: a
dataproc:dataproc.worker.custom.init.actions.mode
propriedade do cluster está definida comoRUN_BEFORE_SERVICES
e não pode ser transmitida ao cluster quando este é criado (não pode alterar a definição da propriedade). Cada trabalhador executa as respetivas ações de inicialização antes de iniciar os daemons do nó de dados do HDFS e do gestor de nós do YARN. Uma vez que o Dataproc não aguarda que o HDFS seja gravável antes de executar as ações de inicialização do nó principal, as ações de inicialização do nó principal e do nó de processamento são executadas em paralelo.
- Principal: as ações de inicialização do nó principal podem ser executadas antes de o HDFS ser gravável. Se executar ações de inicialização que preparam
ficheiros no HDFS ou dependem da disponibilidade de serviços dependentes do HDFS,
como o Ranger, defina a
Recomendações:
- Use metadados para determinar a função de um nó para executar condicionalmente uma ação de inicialização em nós (consulte a secção Usar metadados do cluster).
- Crie uma cópia de uma ação de inicialização num contentor do Cloud Storage para estabilidade (consulte Como são usadas as ações de inicialização).
- Adicione novas tentativas quando transferir a partir da Internet para ajudar a estabilizar a ação de inicialização.
- Clusters de imagens anteriores à versão 2.0:
Use ações de inicialização
As ações de inicialização de clusters podem ser especificadas independentemente da forma como cria um cluster:
- Através da Google Cloud consola
- Usar a CLI gcloud
- De forma programática com a API clusters.create do Dataproc (consulte NodeInitializationAction)
Comando gcloud
Quando criar um cluster com o comando
gcloud dataproc clusters create, especifique uma ou mais localizações do Cloud Storage (URIs) separadas por vírgulas
dos executáveis ou scripts de inicialização com a flag
--initialization-actions
. Nota: não são suportados vários "/"s consecutivos num URI de localização do Cloud Storage após o "gs://" inicial, como "gs://bucket/my//object//name". Execute
gcloud dataproc clusters create --help
para ver informações sobre os comandos.
gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \ --initialization-action-timeout=timeout-value (default=10m) \ ... other flags ...
- Use a flag
--initialization-action-timeout
para especificar um período de limite de tempo para a ação de inicialização. O valor de limite de tempo predefinido é de 10 minutos. Se o executável ou o script de inicialização não tiver sido concluído até ao final do período de limite de tempo, o Dataproc cancela a ação de inicialização. -
Use a
dataproc:dataproc.worker.custom.init.actions.mode
propriedade cluster para executar a ação de inicialização nos trabalhadores principais antes de os daemons do gestor de nós e do nó de dados serem iniciados.
API REST
Especifique um ou mais scripts ou executáveis num array ClusterConfig.initializationActions como parte de um pedido da API clusters.create.
Exemplo
POST /v1/projects/my-project-id/regions/us-central1/clusters/ { "projectId": "my-project-id", "clusterName": "example-cluster", "config": { "configBucket": "", "gceClusterConfig": { "subnetworkUri": "default", "zoneUri": "us-central1-b" }, "masterConfig": { "numInstances": 1, "machineTypeUri": "n1-standard-4", "diskConfig": { "bootDiskSizeGb": 500, "numLocalSsds": 0 } }, "workerConfig": { "numInstances": 2, "machineTypeUri": "n1-standard-4", "diskConfig": { "bootDiskSizeGb": 500, "numLocalSsds": 0 } }, "initializationActions": [ { "executableFile": "gs://cloud-example-bucket/my-init-action.sh" } ] } }
Consola
Transmita argumentos para ações de inicialização
O Dataproc define valores de metadados especiais para as instâncias que são executadas nos seus clusters. Pode definir os seus próprios metadados personalizados como forma de transmitir argumentos às ações de inicialização.
gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \ --metadata=name1=value1,name2=value2... \ ... other flags ...
Os valores de metadados podem ser lidos nas ações de inicialização da seguinte forma:
var1=$(/usr/share/google/get_metadata_value attributes/name1)
Seleção de nós
Se quiser limitar as ações de inicialização aos nós principais, de controlador ou de processamento, pode adicionar uma lógica de seleção de nós simples ao seu executável ou script.
ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role) if [[ "${ROLE}" == 'Master' ]]; then ... master specific actions ... else if [[ "${ROLE}" == 'Driver' ]]; then ... driver specific actions ... else ... worker specific actions ... fi
Binários de preparação
Um cenário de inicialização de cluster comum é a preparação de ficheiros binários de trabalhos num cluster para eliminar a necessidade de preparar os ficheiros binários sempre que um trabalho é enviado. Por exemplo, suponha que o seguinte script de inicialização está armazenado em
gs://my-bucket/download-job-jar.sh
, uma localização do contentor do Cloud Storage:
#!/bin/bash ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role) if [[ "${ROLE}" == 'Master' ]]; then gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username fi
A localização deste script pode ser transmitida para o comando gcloud dataproc clusters create
:
gcloud dataproc clusters create my-dataproc-cluster \ --region=${REGION} \ --initialization-actions=gs://my-bucket/download-job-jar.sh
O Dataproc executa este script em todos os nós e, como consequência da lógica de seleção de nós do script, transfere o JAR para o nó principal. Em seguida, os trabalhos enviados podem usar o JAR pré-preparado:
gcloud dataproc jobs submit hadoop \ --cluster=my-dataproc-cluster \ --region=${REGION} \ --jar=file:///home/username/sessionalize-logs-1.0.jar
Exemplos de ações de inicialização
Os scripts de ações de inicialização usados com frequência e outros exemplos estão localizados em
gs://goog-dataproc-initialization-actions-<REGION>
, um contentor público do Cloud Storage regional, e num
repositório do GitHub.
Para contribuir com um guião, reveja o documento CONTRIBUTING.md
e, em seguida, apresente um pedido de obtenção.
Registo
O resultado da execução de cada ação de inicialização é registado para cada instância em /var/log/dataproc-initialization-script-X.log
, onde X
é o índice baseado em zero de cada script de ação de inicialização sucessiva. Por exemplo, se o seu cluster tiver duas ações de inicialização, as saídas são registadas em /var/log/dataproc-initialization-script-0.log
e /var/log/dataproc-initialization-script-1.log
.
O que se segue?
Explore as ações de inicialização do GitHub.