Este tópico descreve problemas comuns em jobs de MaxCompute data shipping (new version) e suas soluções.
Erro "User does not exist"
Se o registro de execução de um job de MaxCompute data shipping (new version) exibir o erro ODPS-0420095: Access Denied - Authorization Failed [4002], You don't exist in project ****. Context ID:11111-1111-111-1111-11111111. --->Tips: Pricipal:INVALID$v4_11111111111; You don't exist in project ****, isso indica que o usuário de destino não foi adicionado ao workspace do MaxCompute ou foi adicionado incorretamente. Para resolver esse problema, adicione o usuário novamente e conclua a autorização. Para mais informações, consulte Authorize the default role to write data to MaxCompute (for data shipping within the same account) ou Authorize a custom role to write data to MaxCompute (for data shipping within the same account).
Erro "RAM role has no permission"
Se o registro de execução de um job de MaxCompute data shipping (new version) apresentar o erro ODPS-0420095: Access Denied - Authorization Failed [4019], You have NO privilege 'odps:Describe' on {acs:odps:*:projects/****/tables/****}. Context ID:111111-1111-11111-1111-1111111. --->Tips: Pricipal:INVALID$v4_111111111, isso indica que a RAM role não tinha as permissões necessárias quando foi adicionada como membro do workspace do MaxCompute. Para corrigir, conceda novamente as permissões necessárias à RAM role. Para mais informações, consulte Authorize the default role to write data to MaxCompute (for data shipping within the same account) ou Authorize a custom role to write data to MaxCompute (for data shipping within the same account).
Erro FAILED: mismatched input
Se você for um usuário RAM e encontrar o erro FAILED: mismatched input ao adicionar uma RAM role como membro de um workspace do MaxCompute, isso indica que sua conta não tem permissão para executar instruções como ADD USER. Para resolver, use uma conta Alibaba Cloud ou um usuário RAM com a política a seguir para executar instruções como ADD USER. Após essa operação única, você pode usar o usuário RAM para executar instruções como ADD USER sem encontrar esse erro.
{
"Version": "1",
"Statement": [
{
"Action": "ram:CreateServiceLinkedRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"ram:ServiceName": "usermgmt.odps.aliyuncs.com"
}
}
}
]
}
Permissões insuficientes do usuário
Se o usuário atual encontrar o erro FAILED: ODPS-0130013:Authorization exception - Authorization Failed [4003], You have NO privilege to do the PROJECT SECURITY OPERATION for {acs:odps:*:projects/****/authorization/users}. Context ID:1111-11111-1111-1111-11111. ao adicionar uma RAM role como membro de um workspace do MaxCompute, isso indica que o usuário não tem as permissões necessárias para operações de segurança de projeto no MaxCompute. Para resolver, atribua a admin role ao usuário. Para mais informações, consulte Relationship between MaxCompute and DataWorks permissions.
Siga estas etapas para atribuir a admin role a um usuário.
Faça logon no MaxCompute console.
No canto superior esquerdo da página, selecione uma região.
Na página Project Management, localize o projeto de destino e clique em Manage na coluna Actions.
Clique na aba Role Permissions.
Localize a admin role e clique em Manage Members na coluna Actions.
No painel Manage Members, insira o nome da conta no campo Account name to add.
Na caixa de diálogo Manage Members, clique em OK. Selecione a conta de destino, clique na seta à direita (>) para movê-la para a lista Added Accounts e, em seguida, clique em OK.
Erros "SlotExceeded" e "io: read/write on closed pipe"
Se os registros de execução de um job de MaxCompute data shipping (new version) exibirem um dos erros a seguir, a simultaneidade atual do data shipping pode estar excedendo a cota de slots do MaxCompute:
SlotExceeded: Your slot quota is exceeded. Region: cn-shanghai Project: xxx Slot Quota Exceeded. Total: xxx, Acquired: xxx
maxcompute error ClientError: io: read/write on closed pipe
Para reduzir a probabilidade desse problema, use __receive_time__ como campo de particionamento. Esse campo baseia-se no tempo de recebimento no lado do servidor. Logs dentro da mesma janela de tempo de recebimento vão para a mesma partição, o que evita gravações concorrentes em várias partições e pode reduzir o consumo de slots. Você pode alterar o campo de particionamento ao create a MaxCompute data shipping job (new version).
Particionamento por tempo do log
Ao criar um job de MaxCompute data shipping (new version), defina a MaxCompute Partition Key Column como __partition_time__ para particionar os dados pelo tempo do log. Na configuração MaxCompute partition key column, __partition_time__ e __receive_time__ são campos de partição definidos pelo sistema, calculados a partir do tempo do log e do tempo de recebimento, respectivamente. Você também pode clicar no ícone de adição (+) para adicionar colunas de chave de partição personalizadas e mapeá-las para campos existentes no Simple Log Service, como http_method ou operation.
O campo __partition_time__ é calculado com base no valor do campo __time__ no Simple Log Service. Uma string de tempo é gerada de acordo com o fuso horário e o formato de tempo de partição especificados. Para evitar que o limite de partições por tabela no MaxCompute seja excedido, o MaxCompute alinha os valores das colunas de chave de partição baseadas em data em intervalos de 1.800 segundos (30 minutos). Para mais informações, consulte __partition_time__ field.
Colunas de partição do MaxCompute: __partition_time__ e __receive_time__
__partition_time__ baseia-se no tempo do log. O valor de __partition_time__ é calculado a partir do campo __time__ de um log. Como __time__ vem do próprio log, a partição de destino pode sofrer o impacto de latência de coleta e desvio de relógio do cliente.
|
Cenário |
Tempo de recebimento |
Partição de destino |
Causa |
|
Log normal A |
10:00 |
|
O tempo do log é igual ao tempo de recebimento. |
|
Log atrasado B |
10:00 |
|
O tempo do log é anterior ao tempo de recebimento. |
|
Log C de um cliente com desvio de relógio |
10:00 |
|
O tempo do log é posterior ao tempo de recebimento. |
Quando logs da mesma janela de tempo de recebimento são distribuídos em várias partições, podem ocorrer os seguintes problemas:
Partições históricas continuam recebendo dados atrasados, o que dificulta determinar se uma partição está completa.
Partições futuras podem surgir antes do esperado, pois logs com timestamps anormais no cliente vão para faixas de partições futuras.
O agendamento de tarefas downstream fica mais difícil, pois os limites das partições ficam pouco definidos e o gerenciamento do ciclo de vida dos dados se torna mais complexo.
__receive_time__ baseia-se no tempo de recebimento no lado do servidor. O Simple Log Service grava esse campo quando recebe os logs, portanto o valor não sofre impacto de latência de coleta, desvio de relógio do cliente ou exceções ao interpretar o tempo do log. Nos exemplos anteriores, os três logs são recebidos às 10:00 e gravados em p=10:00.
O uso de __receive_time__ oferece as seguintes vantagens:
Logs da mesma janela de tempo de recebimento vão para a mesma partição, e os limites das partições permanecem claros.
O progresso das partições é consistente com o progresso real do data shipping, o que facilita avaliar a completude das partições.
O agendamento de tarefas downstream fica mais previsível, pois partições históricas têm menor probabilidade de serem preenchidas repetidamente.
Recomenda-se usar __receive_time__ como campo de particionamento. Em cenários de dados em tempo real, __partition_time__ e __receive_time__ normalmente não apresentam diferença significativa. Em ambientes de produção com dados atrasados ou desvio de relógio no cliente, __receive_time__ proporciona um comportamento de particionamento mais estável.
Visualizar partições de tabelas do MaxCompute
Execute o comando show partitions <table-name>; para visualizar as partições de uma tabela. Nesse comando, substitua <table-name> pelo nome da sua tabela.
Enviar dados de tempo do log
Ao criar um job de MaxCompute data shipping (new version), adicione o campo __time__ na seção MaxCompute Common Column. O campo __time__ representa o tempo do log em formato UNIX timestamp, com precisão de segundos.
Por exemplo, você pode mapear o campo __time__ para uma coluna de destino na sua tabela do MaxCompute, como c14.
Valores de campo nulos
Esse problema geralmente é causado por incompatibilidade de tipo de dado, falha de conversão de tipo ou por um campo ausente no log de origem.
Para lidar com incompatibilidades de tipo de dado ou falhas de conversão, consulte Handle dirty data.
Para informações sobre os requisitos de formato de tipos de dados, consulte Stability and limits.
Falha do job após ativar uma lista de permissões de IP
Se você ativar uma lista de permissões de endereços IP em um projeto MaxCompute (por exemplo, uma lista de permissões de IP de classic network), um job de data shipping pode falhar com uma mensagem de erro semelhante à seguinte:
error:RequestId=202211181752058538dc0b0018****, ErrorCode=NoPermission, ErrorMessage=Access denied by project ip white list: sourceIP:'192.168.x.x' is not in white list. project: slstest-1 from:
errorType:odps.OdpsError
jobId:****-****
Para resolver falhas causadas pela lista de permissões de IP, execute os seguintes comandos no MaxCompute:
Faça logon no MaxCompute console .
No canto superior esquerdo da página, selecione a região em que seu projeto está localizado.
No painel de navegação à esquerda do MaxCompute, escolha .
-
No DataWorks, execute as etapas a seguir. Para mais informações sobre como usar o DataWorks, consulte Advanced: Analyze best-selling product categories.
-
Consulte a configuração atual da lista de permissões de IP.
setproject; select 1; -
Adicione
AliyunLogSLRService,AliyunLogDefaultServiceà lista de permissões de service existente por meio do seguinte comando:setproject odps.security.ip.whitelist.services=AliyunLogSLRService,AliyunLogDefaultService; -
Depois de concluir a configuração, execute os comandos a seguir para verificar as novas definições da lista de permissões.
setproject; select 1;Depois de executar o comando
setproject, o sistema retorna as propriedades de configuração do projeto. Verifique os valores das propriedadesodps.security.ip.whitelist.serviceseodps.security.outbound.destination:odps.output.field.formatter= odps.project.longtimetmpfile.max.remain.days=30 odps.project.longtimetmpfile.min.remain.days=3 odps.project.maintenance.alarm={"storage.warning.ratio":"85","storage.warning.receiver":"","storage.critical.receiver":"","storage.critical.ratio":"95"} odps.project.maintenance.window= odps.schema.evolution.enable=false odps.schema.model.enabled=false odps.security.enabledownloadprivilege=false odps.security.ip.whitelist= odps.security.ip.whitelist.services=AliyunLogSLRService,AliyunLogDefaultService odps.security.outbound.destination= odps.security.vpc.whitelist= odps.session.flag.authority=false odps.spark.kube.mode=false odps.sql.acid.table.enable=true odps.sql.allow.cartesian=false odps.sql.allow.fullscan=false odps.sql.auto.mv.quota.gb=-1 odps.sql.cfile2.field.maxsize=8192
-