O MaxCompute não chama APIs externas diretamente. Neste tutorial, você combina um banco de dados de endereços IP offline com uma função definida pelo usuário (UDF) para analisar a geolocalização de endereços IP inteiramente dentro do MaxCompute.
Descrição do caso
O MaxCompute é um ambiente de computação fechado e não chama APIs HTTP externas, como APIs de consulta de geolocalização de IP de terceiros, para pesquisar a geolocalização de um endereço IP em tempo real. A tabela a seguir compara três abordagens para analisar a geolocalização de IP no MaxCompute.
|
Abordagem |
Implementação |
Vantagens |
Desvantagens |
Veredito |
|
Abordagem 1: Exportar dados e consultar |
Exporte os endereços IP que deseja analisar do MaxCompute para seu dispositivo local e use um script para chamar uma API em loop. |
Conceito simples. |
Ineficiente e sujeita a limites de taxa de API. Não adequada para dados em grande escala. |
Não recomendada |
|
Abordagem 2: Consultar um banco de dados local |
Baixe o banco de dados de endereços IP e os endereços IP que deseja analisar para seu dispositivo local e execute a correspondência em um programa local. |
Sem limites de taxa de API. |
Os dados saem do data warehouse, impedindo a junção com outros dados de negócios no MaxCompute, como uma tabela de pedidos. |
Não recomendada |
|
Abordagem 3: Carregar o banco de dados de IP no warehouse e consultá-lo |
Faça upload de todo o banco de dados de endereços IP para uma tabela do MaxCompute e use uma UDF em SQL para comparar os dados. |
Alto desempenho: utiliza totalmente os recursos de computação paralela do MaxCompute; Bem integrada: permite junção direta com qualquer tabela do MaxCompute; Escalável: adequada para qualquer volume de dados. |
É necessário atualizar o banco de dados de endereços IP regularmente. |
Melhor abordagem |
A Abordagem 3 é a única que oferece o desempenho e a integração necessários para análise de big data. Este tutorial implementa a Abordagem 3.
Design da solução
Esta solução utiliza um banco de dados de endereços IP offline e uma função definida pelo usuário (UDF). Ela consiste em três módulos:
Preparação de dados: baixe um arquivo de banco de dados de endereços IP público e faça upload dele para uma tabela do MaxCompute, que servirá como referência de endereços.
Desenvolvimento da UDF: crie uma UDF que converta uma string de endereço IP em um número inteiro. A conversão para inteiro é fundamental para uma correspondência de intervalo eficiente.
-
Análise SQL: escreva um SQL que chame a UDF para comparar um endereço IP com a tabela do banco de dados de endereços IP e obter a geolocalização final do endereço IP.
A figura a seguir mostra como os três módulos trabalham juntos.
Pré-requisitos
Este tutorial aplica-se a um workspace do DataWorks que não tem a opção Use Data Studio (New Version) ativada. O exemplo utiliza um workspace no modo básico.
Crie um workspace.
Vincule um serverless resource group ao workspace.
Bind a MaxCompute compute resource ao workspace e conclua o teste de conectividade.
No workspace de destino, crie um business flow.
Procedimento
Baixar o banco de dados de endereços IP
Baixe o banco de dados de endereços IP de exemplo, ipdata.csv, para o seu dispositivo local. Para analisar seus próprios endereços IP, baixe um banco de dados de endereços IP por conta própria.
Os dados de exemplo têm a seguinte estrutura:
O formato dos dados é
UTF-8.Os quatro primeiros valores representam o endereço inicial e o endereço final de um intervalo de endereços IP. Os dois primeiros são inteiros decimais e os dois últimos estão em notação decimal pontuada. O intervalo de endereços IP é fornecido em formato inteiro para permitir o cálculo de pertencimento de um IP ao segmento de rede.
Se você utilizar seu próprio banco de dados de endereços IP, certifique-se de que o arquivo esteja codificado em UTF-8 e que forneça o endereço inicial e o endereço final de cada intervalo em formato inteiro. Caso as colunas ou a ordem das colunas sejam diferentes dos dados de exemplo, ajuste o esquema da tabela e o mapeamento de campos na próxima seção adequadamente.
Fazer upload do banco de dados de endereços IP para uma tabela
-
Crie uma tabela do MaxCompute.
-
Faça login no DataWorks console. Na região de destino, clique em no painel de navegação à esquerda. Selecione um workspace na lista suspensa e clique em Go to Data Development.
Na página Data Development, clique com o botão direito do mouse no fluxo de negócios de destino e escolha Create Node > MaxCompute > ODPS SQL.
Na caixa de diálogo Create Node, defina Engine Instance como o recurso de computação vinculado na seção de pré-requisitos, insira um Name para o nó e clique em OK.
-
No editor de nós ODPS SQL, insira as seguintes instruções:
-- If a table named ipresource already exists, drop it first. DROP TABLE IF EXISTS ipresource; -- Create a table to store the IP address database information. CREATE TABLE IF NOT EXISTS ipresource ( start_ip BIGINT, -- Start address of the IP range (decimal integer) end_ip BIGINT, -- End address of the IP range (decimal integer) start_ip_arg STRING, -- Start address of the IP range (dotted-decimal string, such as "203.0.113.0") end_ip_arg STRING, -- End address of the IP range (dotted-decimal string, such as "203.0.113.255") country STRING, -- Country name area STRING, -- Area name (usually empty or the same as the country) city STRING, -- City name (may be a larger administrative division in some records) county STRING, -- District or county name isp STRING -- Internet service provider ); Clique no ícone
para executar o código. Na caixa de diálogo Parameter, selecione o grupo de recursos serverless vinculado e clique em Running. Após a conclusão da etapa Estimate MaxCompute Computing Cost, clique em Running para executar a tarefa do nó.
-
-
Faça upload dos dados para a tabela.
Clique no ícone
no canto superior esquerdo. Na página exibida, escolha All Products > Data Integration > Upload and Download.No painel de navegação à esquerda, clique no ícone
para acessar a página Upload Data.-
Clique em Upload Data para ir à página de configuração de upload de dados. Use a configuração a seguir como referência.
Parameter
Descrição
Specify Data to Be Uploaded > Select file
Faça upload do arquivo
ipdata.csvbaixado para o seu dispositivo local.Configure Destination Table > Compute Engine
Selecione MaxCompute.
Configure Destination Table > MaxCompute Project Name
Selecione o projeto MaxCompute da seção Pré-requisitos.
Configure Destination Table > Select Destination Table
Selecione a tabela ipresource como tabela de destino. Se a tabela recém-criada não estiver disponível para seleção, acesse Data Map > My Data > Refresh Table metadata e atualize manualmente os metadados de
odps.<project_name>.ipresource.Configure Destination Table > Resource Group
Selecione o grupo de recursos serverless da seção Pré-requisitos.
Configure Destination Table > Preview Data of Uploaded File
Clique em Mapping by Order para mapear os dados do arquivo aos campos da tabela ipresource.
Clique em Upload Data e aguarde a conclusão do upload dos dados.
-
Verifique se os dados foram carregados.
Retorne ao editor de nós ODPS SQL na página Data Development. Escreva os seguintes comandos SQL, selecione-os e execute-os.
--Query the number of rows in the table. SELECT COUNT(*) FROM ipresource; --Preview the first 10 rows of data. SELECT * FROM ipresource limit 10;As colunas
start_ipeend_ipcontêm inteiros decimais, enquantostart_ip_argeend_ip_argcontêm endereços em notação decimal pontuada. Se os valores estiverem desalinhados ou a tabela estiver vazia, faça upload do arquivo novamente e remapeie as colunas para os campos da tabela.
Desenvolver a UDF
Para comparar endereços IP em SQL, é necessária uma UDF que converta uma string de endereço IP em notação decimal pontuada, como 203.0.113.10, em um inteiro decimal comparável por magnitude.
-
Crie um recurso Python do MaxCompute.
Na página Data Development, clique com o botão direito do mouse no fluxo de negócios de destino e escolha Create Resource > MaxCompute > Python.
Na caixa de diálogo Create Resource, insira um Name para o recurso (por exemplo,
mc.py), selecione Upload as ODPS Resource e clique em Create.-
No recurso Python, insira o seguinte código:
from functools import reduce from odps.udf import annotate @annotate("string->bigint") class IPtoInt(object): def evaluate(self, ip): try: return reduce(lambda x, y: (x << 8) + y, map(int, ip.split('.'))) except: return 0Clique no ícone
para enviar o recurso.
-
Crie uma UDF do MaxCompute.
Na página Data Development, clique com o botão direito do mouse no fluxo de negócios de destino e escolha Create Function > MaxCompute > Function.
Na caixa de diálogo Create Function, insira um Name para a função (por exemplo,
ip2int). Se houver vários mecanismos MaxCompute vinculados no Data Development, selecione a Engine Instance do MaxCompute onde deseja criar esta função. Em seguida, clique em Create. Este é o nome usado para chamar a função e não pode ser modificado após a definição.-
Na página do editor de funções, configure os parâmetros. A tabela a seguir descreve os principais parâmetros. Para mais informações sobre os parâmetros, consulte Register a MaxCompute function.
Parâmetro
Descrição
Function Type
Mantenha o valor padrão Other Functions.
Function Name
Nome da UDF, usado para referenciar a função em SQL. O nome deve ser globalmente único.
Class Name
Nome da classe principal que implementa a UDF. Este parâmetro é obrigatório. Valor de exemplo:
mc.IPtoInt.NotaPara um recurso Python, una o nome do recurso Python e o nome da classe com um ponto, omitindo a extensão
.pydo nome do recurso.Resources
Selecione o arquivo de recurso
mc.pyda etapa anterior.
Clique no ícone
na barra de ferramentas para salvar a função.Clique no ícone
na barra de ferramentas. Na caixa de diálogo para envio de uma nova versão, insira uma Change Description e clique em OK.
Analisar geolocalização de IP usando SQL
A UDF converte o endereço IP consultado em um inteiro, e a instrução SQL retorna o intervalo de endereços IP na tabela ipresource que contém esse inteiro.
-
Retorne ao editor de nós ODPS SQL. Escreva o seguinte comando SQL, selecione-o e execute-o.
-- Replace 203.0.113.10 with the IP address that you want to query. -- The address must be in dotted-decimal notation. The UDF returns 0 for a value that it cannot parse, and the query then returns no rows. SELECT * FROM ipresource WHERE ip2int('203.0.113.10') >= start_ip AND ip2int('203.0.113.10') <= end_ip; Clique no ícone
. Na caixa de diálogo Parameter, selecione o grupo de recursos serverless vinculado, clique em Running e clique em Running novamente após a conclusão da etapa Estimate MaxCompute Computing Cost.Visualize o resultado para obter a geolocalização do endereço IP consultado.