Resolva o problema de distorção de dados na colmeia

  No trabalho normal, quando usamos o hive para lidar com problemas de negócios, inevitavelmente encontramos o problema de distorção de dados. A essência da distorção de dados é a distribuição desigual de chaves, o que leva a grandes ou pequenas lacunas na quantidade de dados alocados para redutores diferentes. Quando a lacuna de dados é muito grande, isso causa distorção de dados, o que torna uma certa carga de redução muito grande, resultando no atraso na conclusão da tarefa.

razão principal

1. Distribuição desigual de chaves .
2. Os dados no lado do mapa estão distorcidos, os arquivos de entrada são muitos e os tamanhos não são uniformes.
3. Os dados no lado de redução estão distorcidos e há um problema com o particionador.
4. As características dos próprios dados de negócios.

solução

1. Ajuste os parâmetros na colmeia da seguinte forma:

set hive.map.aggr=true;
set hive.groupby.skewindata=true;

O parâmetro hive.map.aggr = true é usado para definir a agregação parcial no lado do mapa , que é equivalente a Combiner
hive.groupby.skewindata = true. Quando este parâmetro é definido como true , dois MR JOBs serão gerados quando os dados distorcem ocorrer . O primeiro MR JOB primeiro distribuirá aleatoriamente as chaves e as distribuirá em diferentes reduções o mais uniformemente possível. Em cada redução , os dados são parcialmente agregados e, em seguida, os dados são processados pelo segundo MR JOB . Neste momento, os dados já estão Após a agregação parcial dos dados de resultado, os dados da mesma chave serão divididos em uma redução, neste momento, o agrupamento unificado por processamento da chave basicamente evitará a ocorrência de uma determinada pressão de redução .

2. Otimize o mapa e reduza da
seguinte forma:

set hive.merge.mapfiles=true;
set hive.mapred.map.tasks=number;

set hive.merge.mapfiles = true é usado para processar muitos arquivos pequenos, o que coloca muita pressão no mapa , use este parâmetro para mesclar arquivos pequenos ou você pode usar este comando set hive.mapred.map. tasks = número para ajustar o número de mapeadores e vários mapeadores para dividir igualmente a pressão no lado do mapa .

set hive.mapred.reduce.tasks=number;

set hive.mapred.reduce.tasks = number Através deste comando para ajustar o número de reduzir , isso geralmente é adequado apenas para determinados cenários de negócios, problema de distorção de dados, por exemplo, existem 80 tipos diferentes de mercadorias com uma grande quantidade de dados em uma redução da polimerização é realizada, desta vez aumenta reduz o número de executar a partição hash quando esses 80 tipos de produto podem ser distribuídos para diferentes tipos reduza- os, aumentando a redução do número de dados processados ​​problema de distorção é com um forte É limitado , e pode não funcionar.

3. Otimização de sql 3.1 Desvio de dados causado pelo problema de valor nulo O desvio de dados causado pelo problema de valor nulo é um problema comum nos negócios reais, como dados de log de comportamento do usuário no domínio de tráfego e, às vezes, ocorrerá perda de dados user_id . vez, user_id irá gerar muitos valores nulos. Neste momento, se estiver associado à tabela de informações do usuário, ocorrerá distorção de dados. A solução é a seguinte:

-- 1.这种情况在join的时候直接过滤空值,最后给union all上
select 
 *
from a
join
b
on
a.id is not null and a.id = b.id
union all
select
 * 
from
a 
where a.id is null;
 
-- 2.给空值字段取一个字符串常量+随机数
select 
 *
from a 
left outer join 
b 
on
case 
when a.id is null 
then concat('常量字段',rand()) 
else a.id 
end = b.id

O segundo método é melhor que o primeiro, porque há menos tempos de E / S e menos trabalhos. No primeiro método, a tabela de registro de comportamento do usuário é lida duas vezes e os trabalhos devem ser 2. Um método é 1. Essa otimização é adequada para distorção de dados causada por IDs inválidos . Ao transformar uma chave com um valor nulo em uma string mais um número aleatório, os dados que causam distorção de dados podem ser divididos em diferentes redutores para resolver o problema de distorção de dados. Todos os registros que se tornam nulos não serão agrupados na mesma tarefa de redução e serão espalhados em várias tarefas de redução devido a valores de string aleatórios alternativos . Como o valor nulo não está relacionado, o resultado final não será afetado após o processamento.

3.2 pequena mesa associada a uma grande mesa
usando hvie ao processar dados, quando se trata de uma pequena mesa e uma grande mesa associada a este problema é geralmente melhor para resolver o problema, só precisamos primeiro de uma pequena mesa na memória, semelhante ao Variáveis Spark of Broadcast, a implementação é a seguinte:

set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启
set hive.mapjoin.smalltable.filesize=25000000 //可以根据情况设定具体值

3.2 Associando uma mesa grande a uma mesa grande
1. Quando uma mesa grande é associada a uma mesa grande, definir a junção do mapa não funcionará mais, porque qualquer tabela grande não será transmitida para o lado do mapa para evitar pressão excessiva na memória causada pelo grande desperdício de memória da tabela. Neste momento, podemos filtrar as colunas e linhas inúteis nas duas tabelas grandes e, em seguida, associá-los. Se houver mais dados inúteis, isso pode reduzir significativamente a pressão sobre os nós e evitar distorção de dados. O problema.

2. Se duas tabelas grandes têm tantos dados a serem associados, podemos tentar os seguintes métodos:

set hive.optimize.skewjoin = true; 
set hive.skewjoin.key = skew_key_threshold (default = 100000

Quando o hive está em execução, não há como julgar qual chave gerará quanto skew, portanto, use este parâmetro para controlar o limite de skew. Se esse valor for excedido, o novo valor será enviado para a redução que ainda não foi atingida .

Acho que você gosta

Origin blog.csdn.net/AnameJL/article/details/113205453
Recomendado
Clasificación