Este pode não ser exatamente o seu problema - carregar 100 milhões de feições em um serviço de feição hospedado no ArcGIS Online - mas o assunto aqui é carregar big data em um serviço de feição hospedado no Online, 100 milhões é a escala que estou falando.<\/P>
Aqui está como 100.000.000 de feições parecem na densidade com a qual estou lidando.<\/P>
Uma extensão aproximadamente do tamanho de um quarteirão da cidade:<\/P>
Layer not visible<\/span><\/span><\/P>Então ligando a visibilidade da camada:<\/P>
Layer visible<\/span><\/span><\/P>Os dados<\/A> são tão grandes que o Pro 2.9 não tentará exibi-los em escalas menores que 1:500.<\/P>Aqui está a história por trás. Uma das equipes da Esri com quem trabalho ocasionalmente lida com big data destinado a um serviço de feição hospedado no Online. A web sendo o que é, transações muito grandes de compartilhamento podem falhar devido a problemas de rede ou outros, momento em que você precisa recuperar a situação onde ela quebrou<\/EM> ou reexecutar todo o processo de compartilhamento<\/EM>. Eles queriam um processo que funcionasse de forma confiável e com um mecanismo de recuperação para qualquer falha. Eles estavam seguindo o caminho do Python, o que é ótimo para os Pythonistas, mas eu sou o cara do no-code no escritório (digamos um programador em recuperação que ocasionalmente escorrega). ArcGIS Data Interoperability ao resgate!<\/STRONG><\/P>Meus dados de teste são um arquivo CSV com 143.751.910<\/STRONG> linhas.<\/P>
Obter Contagem<\/span><\/span><\/P> <\/P>Eu tirei 100 milhões de linhas do topo apenas como um número redondo agradável. Os dados têm valores latitudinais/longitudinais, então o aspecto ETL é uma simples habilitação espacial para criar feições pontuais. Agora, como enviar esses para uma camada de feição pontual?<\/P>Um passo preliminar foi pegar uma amostra dos dados para geodatabase de arquivo e criar um serviço de feição a partir dele, isso apenas instancia a camada alvo. Então o problema a jusante é duplo:<\/P>Carregar os dados da forma mais performática possível<\/LI>Usar uma metodologia que suporte recuperação de falhas<\/LI><\/UL>A equipe do Online sugeriu um 'ponto ideal' para carregar dados nessa escala seria usar o endpoint
Append<\/A> para o serviço de feição com lotes de 500 mil registros em dois processos concorrentes, e executá-lo 'fora do horário comercial' no horário dos EUA. Sem problema, aqui estão meus workspaces:<\/P>
LoadTaxis<\/span><\/span><\/P>LoadTaxis<\/STRONG> cria geodatabases de arquivo compactados com conjuntos de 500 mil registros<\/STRONG>, depois passa o caminho dos dados para LoadTaxisWorker<\/STRONG> em no máximo dois processos que rodam assincronamente. Descobri que o tempo que leva para preparar os dados se encaixa bem com o tempo que o Online leva para processá-los, pouco menos de 2 minutos por lote durante horas de baixa carga. Observando o arquivo de log passar, houve algumas instâncias do LoadTaxis<\/STRONG> pausando para que uma vaga em processo ficasse disponível, mas geralmente o Online estava pronto para o próximo lote, então as coisas estavam funcionando tão rápido quanto meu ETL podia rodar.<\/P> <\/P>
LoadTaxisWorker<\/span><\/span><\/P>LoadTaxisWorker<\/STRONG> envia cada geodatabase compactado para o Online e então chama o endpoint
Append<\/A>, disparando uma carga a partir do novo item geodatabase de arquivo. Isso inicia um trabalho no Online. Um transformador customizado em loop verifica a conclusão do trabalho a cada 5 segundos (com contagem máxima de verificações de 42<\/A>). Note que o HTTPCaller no transformador customizado precisa ter configuração de concorrência igual a 1 para funcionar em loop. Na conclusão bem-sucedida, o item geodatabase é deletado e então um segundo workspace filho - LoadTaxisCleanerUpper<\/STRONG> - é chamado para deletar o arquivo zipado geodatabase original em um processo separado (manipuladores de arquivos bloqueiam exclusão caso contrário).<\/P>
LoadTaxisCleanerUpper<\/><\span>
You will see in LoadTaxisWorker I have a couple of Emailer transformers (disabled in the download) and the WorkspaceRunner that calls the cleanup process allows for a bump in the number of child processes so things don't hang.
Now this being the web you can get failures even following best practices, but if you do, there is a paper trail built into the methodology. The file geodatabases made for upload are not deleted from disk or as Online items like they are for successful jobs - you can see any failed data:

File geodatabases not deleted
E aqui estão itens geodatabase relacionados a trabalhos Append falhos - também não deletados.

File geodatabase items not deleted
No entanto, se você inspecionar o HTTPCaller que chama Append verá que configurei rollback on failure como true, então tudo que temos que fazer é:
- Excluir manualmente os itens geodatabase falhos do conteúdo Online
- Executar manualmente LoadTaxisWorker usando os arquivos zipados e IDs dos lotes falhos como parâmetros de entrada
Então após minha execução automática dos 100 milhões de feições, a ferramenta executa sem erro...

Na verdade, eu prefiro executar a ferramenta LoadTaxisWorker no modo de edição (ou seja, no Workbench) para que eu possa fazer coisas como ativar os Emailers para capturar a ação em detalhes. Também há essa questão para ficar atento que vou colocar em uma tag de spoiler:
SpoilerAviso: Append chamado pelo LoadTaxisWorker pode levar muito mais tempo do que o previsto (horas, não minutos) se executado em um horário movimentado para Online - Append é um recurso compartilhado e pode ser enfileirado. Nesse caso, o Emailer informará que 210 segundos (ou seu tempo limite preferido) se passaram sem que o Append terminasse; ele ainda será concluído eventualmente, mas as operações de limpeza não serão acionadas. Eu experimentei isso e ativei o Emailer que envia a URL do trabalho para que eu pudesse monitorá-lo manualmente.
De qualquer forma, depois de executar manualmente seus trabalhos com falha, você terá 100 milhões de features no seu serviço!
Yay minhas 100 milhões de features estão carregadas!
Quão difícil foi isso?
As ferramentas ETL estão no pós-download. Eu usei ArcGIS Pro 2.9 & Data Interoperability extension.