Este guia aborda como aumentar a eficiência do desenvolvimento por meio de práticas de engenharia, como reutilização de código, montagem de datasets e gerenciamento de parâmetros. Também apresenta melhores práticas e técnicas de depuração para conexão com motores de computação como MaxCompute Spark, EMR Serverless Spark e AnalyticDB for Spark.
Recomendamos a leitura prévia do tópico Desenvolvimento básico de notebooks.
Ambientes de desenvolvimento e produção
O DataWorks Notebook é uma ferramenta de desenvolvimento e análise agendável. Isso significa que ele opera em dois ambientes de execução distintos:
Ambiente de desenvolvimento: Na página de edição do nó de notebook no DataStudio, execute células para executar código diretamente em uma instância do ambiente de desenvolvimento pessoal. Este ambiente serve para validação rápida e depuração da lógica do código.
Ambiente de produção: Após salve e publicar um nó de notebook, o agendamento periódico, o backfill de dados ou ações similares acionam sua execução. O código roda em uma instância de tarefa isolada e efêmera. Este ambiente destina-se a execuções de produção estáveis e confiáveis.
Compreender as diferenças significativas de recursos entre esses dois ambientes é fundamental para um desenvolvimento eficiente.
Referência rápida: ambientes de desenvolvimento versus produção
Recurso | Ambiente de desenvolvimento (execução de célula) | Ambiente de produção (execuções agendadas) |
Referência a recursos do projeto ( |
| Aplicação automática. |
Leitura e gravação de datasets (OSS/NAS) | Monte o dataset no ambiente de desenvolvimento pessoal. | Monte o dataset na configuração de agendamento. |
Referência a parâmetros do workspace ( | Suportado. A substituição de texto ocorre automaticamente antes da execução do código. | Suportado. A substituição de texto ocorre automaticamente antes da execução da tarefa. |
Gerenciamento de sessão Spark | Por padrão, a sessão Spark é liberada automaticamente após 2 horas de inatividade. | Uma sessão de curta duração é criada para cada instância de tarefa e destruída junto com ela. |
Reutilize código e dados em produção
Referencie recursos do projeto (arquivos .py)
Para tornar seu código mais modular, reutilizável e fácil de manter, agrupe funções ou classes comuns em arquivos .py independentes. Em seguida, referencie esses arquivos como recursos do MaxCompute usando a sintaxe ##@resource_reference{"custom_name.py"}.
-
Crie e publique um recurso Python
No painel de navegação à esquerda do DataStudio do DataWorks, clique em
e acesse Resource Management.Na árvore de diretórios do Resource Management, clique em com o botão direito no diretório desejado ou clique em + no canto superior direito. Selecione New Resource > MaxCompute Python e nomeie o arquivo como
my_utils.py.-
Na seção Document Content, clique em Online Editing, cole o código da sua função utilitária no editor de código e clique em Save.
# my_utils.py def greet(name): return f"Hello, {name} from resource file!" Na barra de ferramentas, clique em Save e depois em Publish para publicar o recurso. Isso torna o recurso disponível para tarefas nos ambientes de desenvolvimento e produção.
-
Referencie o recurso em um notebook
Na primeira linha de uma célula Python no seu notebook, use a sintaxe
##@resource_referencepara referenciar o recurso publicado.##@resource_reference{"my_utils.py"} # If the resource is in a subdirectory, such as my_folder/my_utils.py, reference it by filename only, without the directory path: ##@resource_reference{"my_utils.py"} from my_utils import greet message = greet('DataWorks') print(message) -
Depure no ambiente de desenvolvimento
Execute a célula Python. A saída será:
Hello, DataWorks from resource file!ImportanteDurante a depuração no ambiente de desenvolvimento, o sistema detecta a declaração
##@resource_referencee baixe automaticamente o arquivo correspondente do Resource Management para o caminhoworkspace/_dataworks/resource_referencesno seu diretório pessoal, tornando-o acessível ao seu código.Se ocorrer um erro ModuleNotFoundError, clique em no botão Restart na barra de ferramentas do editor para recarregar o recurso e tente novamente.
-
Publique no ambiente de produção e verifique
Após clique em Save e Publish no nó de notebook, acesse Operation and Maintenance Center > Auto Triggered Task e clique em Test para executar a tarefa. Após a conclusão bem-sucedida da tarefa, a saída
Hello, DataWorks from resource file!aparecerá nos logs.ImportanteSe ocorrer um erro There is no file with id ..., verifique se você publicou o recurso Python no ambiente de produção.
Para mais informações, consulte Recursos e funções do MaxCompute .
Leia e grave datasets (OSS/NAS)
Durante a execução das tarefas do notebook, leia e grave facilmente em arquivos de grande escala armazenados no OSS ou NAS.
Depuração no ambiente de desenvolvimento
-
Monte o dataset: Na página de detalhes do seu ambiente de desenvolvimento pessoal, acesse Storage Settings > Datasets para configurá-lo.
-
Acesse o dataset no seu código: O dataset é montado em um caminho específico no seu ambiente de desenvolvimento pessoal. Leia ou grave nesse caminho diretamente no seu código.
# Assume the dataset is mounted to the /mnt/data/dataset path. import pandas as pd # Use the mount path directly. file_path = '/mnt/data/dataset/testfile.csv' df = pd.read_csv(file_path) # Use PyODPS to write data to MaxCompute. o = %odps o.write_table('mc_test_table', df, overwrite=True) print(f"Successfully wrote data to the MaxCompute table mc_test_table.")
Implantação no ambiente de produção
-
Monte o dataset: Na página de edição do nó de notebook, acesse Scheduling Settings > Scheduling Policy no painel de navegação à direita e adicione o mesmo dataset.
-
Acesse o dataset no seu código: Após salve e publicar o nó, o dataset é montado no ambiente de produção. Use o mesmo caminho de montagem no seu código para acessá-lo.
# Assume the dataset is mounted to the /mnt/data/dataset path. import pandas as pd # Use the mount path directly. file_path = '/mnt/data/dataset/testfile.csv' df = pd.read_csv(file_path) # Use PyODPS to write data to MaxCompute. o = %odps o.write_table('mc_test_table', df, overwrite=True) print(f"Successfully wrote data to the MaxCompute table mc_test_table.")
Para mais informações, consulte Uso de datasets em um ambiente de desenvolvimento pessoal .
Use parâmetros do workspace
Este recurso está disponível apenas no DataWorks Professional Edition ou superior.
O DataWorks fornece parâmetros de workspace, que estendem os parâmetros de agendamento existentes. Esses parâmetros permitem a reutilização de configurações globais e o isolamento de ambiente entre tarefas e nós. Referencie um parâmetro do workspace em uma célula SQL ou Python usando o formato ${workspace.param}, onde param é o nome do seu parâmetro de workspace.
Crie um parâmetro de workspace: Antes de começar, acesse Operation and Maintenance Center > Scheduling Settings > Workspace Parameters no DataWorks para crie os parâmetros necessários.
-
Referencie um parâmetro de workspace:
-
Referencie um parâmetro de workspace em uma célula SQL.
SELECT '${workspace.param}';Ao executar a célula, o valor resolvido do parâmetro de workspace é impresso.
-
Referencie um parâmetro de workspace em uma célula Python.
print('${workspace.param}')Ao executar a célula, o valor resolvido do parâmetro de workspace é impresso.
Para mais detalhes, consulte Uso de parâmetros de workspace .
-
Use comandos mágicos com motores de computação
Comandos mágicos são comandos especiais prefixados com % ou %% que simplificam as interações entre uma célula Python e vários recursos de computação.
Conecte-se ao MaxCompute
Antes de se conectar a um recurso de computação do MaxCompute, certifique-se de ter vinculado um recurso de computação do MaxCompute.
-
%odps: Obtenha um objeto de entrada PyODPS
Este comando retorna um objeto PyODPS autenticado e vinculado ao projeto atual do MaxCompute. Recomendamos este método para interagir com o MaxCompute porque evita a codificação fixa de AccessKeys no seu código.
-
Use um comando mágico para crie uma conexão com o MaxCompute. Insira
%odps. Um seletor de recursos de computação do MaxCompute aparece no canto inferior direito e selecione automaticamente um recurso de computação. Clique em no nome do projeto MaxCompute no canto inferior direito para alternar entre projetos.o=%odps -
Use o recurso de computação do MaxCompute recuperado para executar um script PyODPS.
Por exemplo, para obter todas as tabelas no projeto atual:
with o.execute_sql('show tables').open_reader() as reader: print(reader.raw)
-
-
%maxframe: Estabeleça uma conexão MaxFrame
Este comando cria uma sessão MaxFrame, que fornece capacidades de processamento de dados distribuído semelhantes ao pandas para o MaxCompute.
# Connect to and access a MaxCompute MaxFrame Session mf_session = %maxframe df = mf_session.read_odps_table('your_mc_table') print(df.head()) # After development and debugging, manually destroy the session to release resources mf_session.destroy()
Conecte-se a recursos de computação Spark
O DataWorks Notebook suporta conexões com múltiplos motores Spark. Esses motores diferem no método de conexão, contexto de execução e gerenciamento de recursos.
Um único nó de notebook pode usar um comando mágico para se conectar a apenas um tipo de recurso de computação por vez.
Comparação de motores
Recurso | MaxCompute Spark | EMR Serverless Spark | AnalyticDB for Spark |
Comando |
|
|
|
Nota Após executar o comando, o contexto de execução de todo o kernel do notebook muda para o ambiente PySpark remoto. Você pode então escrever código PySpark diretamente nas células subsequentes. | |||
Pré-requisitos | Vincule um recurso de computação do MaxCompute. | Vincule um recurso de computação do EMR e crie um Livy Gateway. | Vincule um recurso de computação do ADB Spark. |
Modo de desenvolvimento | Cria ou reutiliza automaticamente uma sessão Livy. | Conecta-se a um Livy Gateway existente e cria uma sessão. | Cria ou reutiliza automaticamente um Spark Connect Server. |
Modo de produção | Modo Livy: Envie jobs Spark através do serviço Livy. | Modo batch spark-submit: Processamento puramente em lote; o estado da sessão não é retido. | Modo Spark Connect Server: Interage através do serviço de conexão Spark. |
Liberação de recursos | O sistema libera automaticamente a sessão após o término da instância da tarefa. | O sistema limpa automaticamente os recursos após o término da instância da tarefa. | O sistema libera automaticamente os recursos após o término da instância da tarefa. |
Casos de uso | Tarefas de processamento em lote e ETL de uso geral, fortemente integradas ao ecossistema MaxCompute. | Tarefas de análise complexa que exigem configurações flexíveis e interação com ecossistemas de big data open source, como Hudi e Iceberg. | Consultas interativas e análises de alto desempenho em tabelas C-Store no AnalyticDB for MySQL. |
MaxCompute Spark
Antes de se conectar a um recurso de computação do MaxCompute, certifique-se de ter vinculado um recurso de computação do MaxCompute.
Conecte-se ao motor Spark integrado a um projeto MaxCompute através do Livy.
-
Estabeleça a conexão: Execute o seguinte comando em uma célula Python. O sistema cria ou reutiliza automaticamente uma sessão Spark.
# Create a Spark Session. %maxcompute_spark -
Execute código PySpark: Após estabelecer a conexão, use o comando mágico de célula
%%sparkem uma nova célula Python para executar código PySpark.# When using MaxCompute Spark, the Python cell must start with %%spark. %%spark df = spark.sql("SELECT * FROM your_mc_table LIMIT 10") df.show() -
Libere manualmente a conexão: Após concluir a depuração, pare ou exclua a sessão manualmente. Ao executar no ambiente de produção, o sistema para e exclua automaticamente a sessão Livy para a instância da tarefa atual, portanto, nenhuma ação manual é necessária.
# Clean up the Spark Session and stop Livy. %maxcompute_spark stop # Clean up the Spark Session, stop Livy, and then delete Livy. %maxcompute_spark delete
EMR Serverless Spark
Antes de estabelecer uma conexão com o recurso de computação, vincule um recurso de computação do EMR Serverless Spark ao seu workspace e crie um Livy Gateway.
Conecte-se a um Livy Gateway pré-existente para interagir com o EMR Serverless Spark.
-
Estabeleça uma conexão: Antes de executar o comando, selecione o recurso de computação do EMR e o Livy Gateway no canto inferior direito da célula.
# Basic connection %emr_serverless_spark # Or, pass custom Spark parameters when connecting. Note that two percent signs (%%) # are required when you pass custom Spark parameters. %%emr_serverless_spark { "spark_conf": { "spark.emr.serverless.environmentId": "<EMR Serverless Spark runtime environment ID>", "spark.emr.serverless.network.service.name": "<EMR Serverless Spark network connection ID>", "spark.driver.cores": "1", "spark.driver.memory": "8g", "spark.executor.cores": "1", "spark.executor.memory": "2g", "spark.driver.maxResultSize": "32g" } }NotaRelação entre parâmetros personalizados e configuração global
Comportamento padrão: Os parâmetros personalizados definidos aqui aplicam-se apenas à conexão atual (sessão) e são únicos. Se você não fornecer parâmetros personalizados, o sistema usa os parâmetros globais configurados no Admin Center.
Uso recomendado: Para configurações que precisam ser reutilizadas em várias tarefas ou por vários usuários, configure-as globalmente em Admin Center > Serverless Spark > SPARK parameters para garantir consistência e simplificar o gerenciamento.
-
Regra de prioridade: Quando o mesmo parâmetro é definido tanto nos parâmetros personalizados quanto na configuração global, a configuração que entra em vigor depende da opção Configuration Priority Global no Admin Center.
Selecionado: A configuração global substitui os parâmetros personalizados para esta sessão.
Não selecionado: Os parâmetros personalizados para esta sessão substituem a configuração global.
-
(Opcional) Reconecte: Se um administrador exclua acidentalmente o token da página do Livy Gateway, use este comando para recriá-lo.
# Reconnect and refresh the Livy token for the current personal development environment. %emr_serverless_spark refresh_token -
Execute código PySpark ou SQL: Após estabelecer a conexão, o kernel muda. Escreva código PySpark diretamente em uma célula Python ou escreva SQL em uma célula EMR Spark SQL.
-
Envie e execute código SQL via célula EMR Spark SQL
Após estabelecer uma conexão com
%emr_serverless_spark, escreva instruções SQL diretamente em uma célula EMR Spark SQL sem selecione um recurso de computação na célula.A célula EMR Spark SQL reutiliza a conexão
%emr_serverless_sparkpara envie o job ao recurso de computação alvo para execução.
-
Envie e execute código PySpark via célula Python
Após estabelecer uma conexão com
%emr_serverless_spark, envie e execute código PySpark em uma nova célula Python. Você não precisa adicionar o prefixo%%sparkà célula.
-
-
Libere manualmente a conexão
ImportanteSe vários usuários compartilharem um Livy Gateway, o comando
stopoudeleteafetará todos os usuários que estão usando esse gateway. Use esses comandos com cautela.# Clean up the Spark Session and stop Livy. %emr_serverless_spark stop # Clean up the Spark Session, stop Livy, and then delete Livy. %emr_serverless_spark delete
AnalyticDB for Spark
Antes de estabelecer uma conexão com o recurso de computação, vincule um recurso de computação do AnalyticDB for Spark ao seu workspace.
Conecte-se ao motor AnalyticDB for Spark criando um Spark Connect Server.
-
Estabeleça uma conexão: Para garantir a conectividade de rede, configure corretamente o ID do vSwitch e o ID do grupo de segurança nos parâmetros de conexão. Antes de executar o comando, selecione o recurso de computação do ADB Spark no canto inferior direito da célula.
# You must configure the vSwitch ID and security group ID to establish a network connection. %adb_spark add \ --spark-conf spark.adb.version=3.5 \ --spark-conf spark.adb.eni.enabled=true \ --spark-conf spark.adb.eni.vswitchId=<vSwitch ID of ADB> \ --spark-conf spark.adb.eni.securityGroupId=<security group ID of the personal development environment> -
Execute código PySpark: Após estabelecer a conexão, execute código PySpark em uma nova célula Python.
# You can run operations only on C-Store tables. df = spark.sql("SELECT * FROM my_adb_cstore_table LIMIT 10") df.show()Nota : O motor AnalyticDB for Spark atualmente pode processar apenas tabelas C-Store que possuem o atributo
'storagePolicy'='COLD'. -
Libere manualmente a conexão: Após concluir a depuração no ambiente de desenvolvimento, limpe manualmente a sessão de conexão para economizar recursos. Ao executar no ambiente de produção, o sistema limpa os recursos automaticamente.
%adb_spark cleanup
Conecte-se ao Lindorm Ray
O grupo de recursos RAY do motor de computação Lindorm fornece serviços de computação distribuída e suporta cargas de trabalho de IA ponta a ponta. Use um comando mágico para se conectar perfeitamente aos recursos do Lindorm Ray em um notebook para desenvolvimento e depuração interativos e, em seguida, publique o notebook como uma tarefa de produção agendada.
-
Estabeleça uma conexão: Execute o comando
%lindorm_rayem uma célula Python. Um seletor de recursos de computação aparece no canto inferior direito da célula. Selecione seu recurso de computação do Lindorm e o grupo de recursos RAY criado.# Connect to the specified Lindorm Ray resource group. %lindorm_rayImportanteApós conectar-se a um recurso de computação do Lindorm Ray, você não pode mais executar células SQL no mesmo notebook. O motor Lindorm Ray executa exclusivamente código Python e Ray.
Se você executar a mesma célula de código várias vezes, o sistema encerra automaticamente o job Ray anterior e inicia um novo. Isso ajuda a evitar desperdício de recursos e conflitos de tarefas.
-
Execute código Ray: Após estabelecer a conexão, escreva e execute código Ray diretamente em uma nova célula Python. Os logs são transmitidos para a área de saída da célula em tempo real, o que facilita a depuração interativa.
O exemplo a seguir define uma tarefa remota simples (usando o decorador
@ray.remote) que executa em um cluster Ray e retorna os logs e o resultado final para a área de saída da célula.import ray import time @ray.remote def hello_world(): print("Hello from Lindorm Ray!") time.sleep(5) return "Task finished." # Submit the remote task result_ref = hello_world.remote() print(ray.get(result_ref)) -
(Opcional) Especifique parâmetros de inicialização personalizados: Se precisar especifique configurações adicionais para o ambiente Ray, como instale pacotes Python de terceiros ou carregar arquivos de código locais, use o comando
%%lindorm_raypara estabelecer a conexão.-
Exemplo 1: Instalar dependências
Use o parâmetro
pippara instale o pacotejiebano ambiente Ray.%%lindorm_ray { "runtime_env": { "pip": ["jieba"] } }Assim que o ambiente estiver pronto, importe e use o pacote nos jobs Ray subsequentes. O exemplo a seguir mostra como chamar
jiebaem uma função remota para realizar segmentação de palavras em chinês:import ray @ray.remote def do_work(x): import jieba return "/".join(jieba.cut(x)) print(ray.get(do_work.remote("Welcome to the DataWorks+LindormRay solution"))) -
Exemplo 2: Carregar e usar recursos do DataWorks
O parâmetro
working_dirserve para carregar recursos do Resource Management do DataWorks para um cluster Ray para que possam ser importados e chamados nas tarefas.ImportanteAo usar
working_dirpara carregar recursos, os arquivos são carregados diretamente do seu ambiente de desenvolvimento para o cluster Ray e estão sujeitos a um limite de tamanho de 100 MB. Se um pacote de recursos for muito grande, o upload pode falhar ou os nós Ray podem ficar instáveis.Para arquivos grandes ou dependências (>100 MB), carregue-os no OSS e acesse-os pelo seu código, ou empacote-os em uma imagem personalizada. Essa abordagem oferece melhor estabilidade e desempenho.
# Reference a resource uploaded in DataStudio Resource Management and declare its path. %%lindorm_ray { "runtime_env": { "working_dir": "/mnt/workspace/_dataworks/resource_references" } }Suponha que você carregue um arquivo ray_resource.py no Resource Management do DataStudio. Ao escrever e executar a seguinte célula, o sistema analisa automaticamente a declaração
##@resource_referenceno código subsequente e baixe o recurso correspondente para o caminho/mnt/workspace/_dataworks/resource_references.ImportanteEm um ambiente de desenvolvimento, após executar a célula que contém ##@resource_reference, execute novamente a célula
%%lindorm_rayacima para carregar os recursos baixados no working_dir para o cluster Ray. Em um ambiente de produção, não é necessário executar novamente.import ray ##@resource_reference{"ray_resource.py"} @ray.remote def do_work(x): print('Ray says:', x) from ray_resource import fun fun() return x worker = do_work.remote("Welcome to the DataWorks+LindormRay solution") print(ray.get(worker))
-
-
Agendamento e O&M de produção: Após o desenvolvimento e a depuração, salve e publique o nó de notebook. Ele será então agendado periodicamente como um nó Lindorm Ray em um DAG.
Parametrização: Seu código pode usar parâmetros de agendamento padrão do DataWorks, como
${bizdate}.Visualização de logs: No ambiente de produção, para evitar que logs excessivos afetem o desempenho, o sistema carrega apenas o primeiro 1 MB de logs por padrão. Se os logs forem truncados, a saída inclui um link que direciona você ao console do Lindorm para visualize os logs completos da tarefa.
Liberação de recursos: Após o término de uma tarefa de produção agendada, a tarefa Lindorm Ray entra em um estado terminal e não ocupa mais recursos. Durante o desenvolvimento interativo, encerre a tarefa Lindorm Ray reiniciando o kernel ou fechando o notebook.
Apêndice: Referência rápida de comandos mágicos
Comando mágico | Descrição | Motor de computação |
| Obter um objeto de entrada PyODPS | MaxCompute |
| Estabelecer uma conexão MaxFrame | |
| Criar uma sessão Spark | MaxCompute Spark |
| Limpar a sessão Spark e parar o Livy. | |
| Limpar a sessão Spark, parar e exclua o Livy. | |
| Em uma célula Python, conectar-se a um recurso de computação Spark estabelecido. | |
| Criar uma sessão Spark | EMR Serverless Spark |
| Visualize informações detalhadas sobre o Livy Gateway. | |
| Limpar a sessão Spark e parar o Livy. | |
| Limpar a sessão Spark, parar e exclua o Livy. | |
| Atualize o token Livy para o ambiente de desenvolvimento pessoal. | |
| Criar e conectar-se a uma sessão ADB Spark reutilizável. | AnalyticDB for Spark |
| Visualize informações da sessão Spark. | |
| Parar e limpar a sessão de conexão Spark atual. | |
| Estabelecer uma conexão Lindorm Ray. | Lindorm Ray |
| Estabelecer uma conexão Lindorm Ray e configure um ambiente de execução personalizado, como instalando dependências ou carregando código. |
Perguntas frequentes
-
P: Por que recebo um erro ModuleNotFoundError ou There is no file with id ... ao referenciar um recurso do workspace?
R: Siga estas etapas para solucionar o problema:
Acesse Data Development > Resource Management para garantir que o recurso Python do MaxCompute foi salvo. Se esse erro ocorrer no ambiente de produção, verifique se o recurso foi publicado nele.
Na barra de ferramentas do editor de Notebook, clique em Restart para recarregar o recurso.
-
P: Por que os recursos antigos ainda são referenciados após eu atualize os recursos do workspace?
R: Ao republicar um recurso modificado, defina
Dataworks › Notebook › Resource Reference: Download Strategycomo autoOverwrite nas configurações do Data Studio e, em seguida, clique em Restart Kernel na barra de ferramentas do Notebook. -
P: Por que recebo um erro FileNotFoundError no ambiente de desenvolvimento ao referenciar um dataset?
R: Certifique-se de que o dataset está montado no ambiente de desenvolvimento pessoal atualmente selecionado.
-
P: Por que a referência a um dataset funciona no ambiente de desenvolvimento, mas falha no ambiente de produção com um erro
Execute mount dataset exception! Please check your dataset config?R: Certifique-se de que o dataset está montado nas Scheduling Settings do nó de Notebook e que você concedeu as permissões necessárias ao dataset do OSS.

-
P: Como verifico a versão do meu ambiente de desenvolvimento pessoal?
R: No seu ambiente de desenvolvimento pessoal, pressione
Cmd+Shift+Pe insiraABOUTpara visualize a versão atual. Se for necessária uma atualização para a versão 0.5.69 ou posterior, um prompt de upgrade aparecerá. Clique em One-click Upgrade para atualize sua instância. -
P: Por que a conexão com o motor Spark falha?
R: Siga estas etapas:
Verificações gerais: Na lista de recursos de computação da página de detalhes do workspace, confirme se o recurso de computação alvo (MaxCompute, EMR ou ADB) está corretamente vinculado ao seu workspace e se sua conta possui as permissões necessárias.
EMR Serverless Spark: Verifique se o Livy Gateway existe e está íntegro.
AnalyticDB for Spark: Concentre-se em problemas de rede. Confirme se
vswitchIdesecurityGroupIdestão configurados corretamente para garantir a conectividade de rede entre seu ambiente de desenvolvimento pessoal e a instância do ADB Spark. Verifique se as regras do seu grupo de segurança permitem tráfego nas portas necessárias.