Problemas comuns de produção do Sqoop e resumo de otimização

índice

0 Prefácio

1 Problemas comuns na produção

(1) Problema de valor nulo do Sqoop

(2) Problema de consistência de dados do Sqoop

(3) O problema de sincronização de dados da camada ADS para Mysql e armazenamento de dados como orc ou parquet

(4) Problema de distorção de dados

(5) O problema de configuração de paralelismo de tarefa de mapa maior que 1

2 resumos


0 Prefácio

Como uma importante ferramenta de sincronização de dados, sqoop tem uma posição importante em big data. Este artigo resume os problemas comuns encontrados na produção do Sqoop e fornece soluções específicas.

1 Problemas comuns na produção

(1) Problema de valor nulo do Sqoop

   Hive em Null na parte inferior é " \ N " para armazenar, e MySQL em Null na parte inferior é Null , o que leva a inconsistências ao armazenar dados sincronizados em ambos os lados. O Sqoop deve garantir estritamente que o formato e o tipo de dados em ambas as extremidades sejam os mesmos durante a sincronização, caso contrário, causará exceções.

   Opção 1: depende de seus próprios parâmetros

   1) Dois parâmetros --input-null-string e --input-null-non-string são usados ​​ao exportar dados .

   2) Use --null-string e --null-non-string ao importar dados .

 Opção 2: modificar o armazenamento subjacente do hive ao criar a tabela e modificá-lo para '' (string vazia)

    Ao exportar hive, crie uma tabela temporária para a tabela que precisa ser exportada. Esta tabela é estritamente consistente com a tabela, campos e tipos sincronizados por Mysql. Insira os dados que precisam ser exportados na tabela. Ao criar o temporário tabela, O armazenamento subjacente nulo "/ N" na seção é alterado para "(string vazia). Especificamente, você pode adicionar a seguinte frase

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' with serdeproperties('serialization.null.format' = '') 

  Os exemplos são os seguintes:

drop table $output_table;

CREATE TABLE IF NOT EXISTS $output_table(
gw_id STRING,
sensor_id STRING,
alarm_level STRING,
alarm_state STRING,
alarm_type STRING,
alarm_scene STRING,
dyear string,
dmonth string,
count BIGINT,
compute_month BIGINT) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' with serdeproperties('serialization.null.format' = '') 
location '/apps/hive/warehouse/phmdwdb.db/$log_dir';
  •   Em seguida, insira os dados que precisam ser exportados na tabela temporária
  • Finalmente, use o comando sqoop export para exportar os dados para o Mysql

  O mesmo se aplica à importação de dados e não será descrito novamente.

  •   A segunda solução é recomendada na produção. Embora seja mais problemática, pode reduzir alguns problemas desnecessários causados ​​pelo sqoop e é mais fácil de localizar o problema. A lógica é clara. Quando o sqoop é exportado, você só precisa escrever a exportação básica Desta forma, o sqoop pode ser facilmente transformado em um script geral para programação.

(2) Problema de consistência de dados do Sqoop

      1 ) Cena 1 : Como Sqoop exportação para Mysql ao usar 4. ª Mapa tarefas, o processo tem 2 tarefa falhou, que desta vez MySQL armazenado em dois adicionais Mapa tarefa de dados introduzidos, só para ver neste caso os chefes de dados de relatório. Quando o engenheiro de desenvolvimento descobrir que a tarefa falhou, ele depurará o problema e finalmente importará todos os dados corretamente para o MySQL . Em seguida, o chefe examinará os dados do relatório novamente e descobrirá que os dados vistos desta vez são inconsistentes com os anteriores, o que não é permitido no ambiente de produção.

     Site oficial: http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

Como o Sqoop divide o processo de exportação em várias transações, é possível que um trabalho de exportação com falha resulte em dados parciais sendo confirmados no banco de dados. Isso pode levar à falha de trabalhos subsequentes devido a colisões de inserção em alguns casos, ou levar a dados duplicados em outros. Você pode superar esse problema especificando uma tabela de teste por meio da opção --staging-table que atua como uma tabela auxiliar usada para preparar os dados exportados. Os dados preparados são finalmente movidos para a tabela de destino em uma única transação.

  • Como o Sqoop decompõe o processo de exportação em várias transações, um trabalho de exportação com falha pode fazer com que parte dos dados sejam enviados ao banco de dados. Isso pode fazer com que os trabalhos subsequentes falhem devido a conflitos de inserção em alguns casos, ou causar dados duplicados em outros trabalhos. Você pode resolver esse problema especificando a tabela de teste com a opção --staging-table, que atua como uma tabela auxiliar para preparar os dados exportados. Os dados em fases são eventualmente movidos para a tabela de destino em uma única transação .

- maneira da mesa de palco

  • (Crie uma tabela temporária, importe-a para a tabela temporária por meio de sqoop e, em seguida, importe os dados da tabela temporária para a tabela de dados de negócios de mysql por meio de transação após o sucesso. Sqoop pode resolver muitos problemas criando tabelas temporárias ao importar e exportar dados , então aprenda a ser inteligente. Mesa temporária)
  • Use a opção --staging-table para importar primeiro os dados em hdfs para a tabela temporária . Quando os dados em hdfs são exportados com sucesso , os dados na tabela temporária são exportados para a tabela de destino em uma transação (ou seja, este processo requer Não foi totalmente bem-sucedido ou falhou completamente).
  • Para poder usar a opção de teste, a tabela de teste está vazia ou vazia antes de executar a tarefa, ou a configuração --clear-staging-table é usada, se houver dados na tabela de teste, e o --clear A opção -staging-table é usada, sqoop Todos os dados na tabela de teste serão excluídos antes que a tarefa de exportação seja executada.

Nota : O modo de teste não está disponível quando a importação -direct é usada e o modo de teste não pode ser usado quando a opção -update-key é usada.

sqoop export --connect jdbc:mysql://192.168.137.10:3306/user_behavior 
--username root  \
--password 123456  \
--table app_cource_study_report  \
--columns watch_video_cnt,complete_video_cnt,dt \
--fields-terminated-by "\t"  \
--export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysis_${day}"  \
--staging-table app_cource_study_report_tmp  \
--clear-staging-table  \
--input-null-string '\N' \

    2 ) Cenário 2 : Defina o número de mapas para 1 (não recomendado)

    Quando várias tarefas Map são usadas, o método –staging-table ainda pode resolver o problema de consistência de dados.

(3) O problema de sincronização de dados da camada ADS para Mysql e armazenamento de dados como orc ou parquet

        Durante a exportação do Sqoop, se a tabela exportada for armazenada como orc ou parquet, um erro será relatado. O erro específico é o seguinte:

Na verdade, o erro não é óbvio, verifique o log específico no yarn:

2020-04-22 11:24:47,814 FATAL [IPC Server handler 5 on 43129]
 
org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: 
 
attempt_1586702868362_6282_m_000003_0 - exited : java.io.IOException: Can't export data, 
 
please check failed map task logs at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:122) at 
 
org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39) at 
 
org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146) at 
 
org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) at 
 
org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at 
 
org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at 
 
org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:170) at 
 
java.security.AccessController.doPrivileged(Native Method) at 
 
javax.security.auth.Subject.doAs(Subject.java:422) at 
 
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866) at
 
 org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:164) Caused by: 
 
java.lang.RuntimeException: Can't parse input data: '�aҩ;����%�G8��}�_yd@rd�yd�$�����瑑
 
g�7V!o���+��O��s�4���R�v�p)�ћȜB��X�'���F!� 
 
�!_@�^�,��ȃ�|�|�YX�~?����>�a�i��6�=���g��?��r��-
 
�љ�ɪ���șk���ȅȥJȕߑk� �+ wS �. �Cw' at appv_phm_switch_master_min_orc.__loadFromFields(appv_phm_switch_master_min_orc.java:1345)
 
 at appv_phm_switch_master_min_orc.parse(appv_phm_switch_master_min_orc.java:1178) at 
 
org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:89) ... 10 more 
 
Caused by: java.util.NoSuchElementException at 
 
java.util.ArrayList$Itr.next(ArrayList.java:854) at 
 
appv_phm_switch_master_min_orc.__loadFromFields(appv_phm_switch_master_min_orc.java:1230) 
 
... 12 more

Pode-se ver que o sqoop não pode analisar arquivos no formato ORC.

Solução:

(1) Resolva o problema de que o Sqoop não suporta ORC por meio da integração Sqoop-HCatalog (mais problemático).

(2) Abordagem conservadora: (método recomendado)

        Recomenda-se mudar a tabela tmp para mysql para a forma padrão de texfile

        A tabela tmp é modificada para o formato de arquivo de texto original e executada com sucesso.

Para a camada dws ou a camada ADS, a tabela temporária tmp é construída a partir das tabelas importadas do sqoop para o Mysql. Esta tabela é estritamente consistente com a tabela do Mysql. É usada principalmente para fazer interface com o Mysql. A tabela mantém a estratégia padrão. (Formato de arquivo de texto)

(4) Problema de distorção de dados

    A estratégia de segmentação de dados do Sqoop não é boa o suficiente para causar distorção de dados

   A paralelização de bombeamento de sqoop está relacionada principalmente ao número de dois parâmetros: NUM-by mappers : Iniciar N um mapa para importar dados em paralelo, por padrão 4 meses; Split-by: unidade de segmentação de trabalho de acordo com uma coluna da tabela.

  • Para evitar distorção de dados, o requisito para campos especificados divididos é o tipo int e os dados são distribuídos uniformemente. Apenas um número muito pequeno de tabelas com chaves primárias de incremento automático pode atender a esse requisito. A ideia central é gerar um ID de autoincremento ordenado e uniforme por si só e, em seguida, usá-lo como o eixo de divisão do mapa, de modo que cada mapa possa ser dividido em dados uniformes e a taxa de transferência possa ser melhorada definindo o número de mapas.

Sugestão:
Use 4 mapas se o volume de dados for inferior a 500w.
O volume de dados é superior a 500 W e basta 8. Muito irá pressurizar o banco de dados e causar degradação de desempenho em outros cenários.
Se for para orientação especial de dados, o grau de paralelismo com cálculos posteriores pode ser aumentado apropriadamente.

Cenário
principal : normalmente você pode especificar a coluna zizengID correspondente à divisão por e, em seguida, usar -num-mappers ou -m para especificar o número de mapas, ou seja, o número de processos de extração simultâneos. No entanto, às vezes há muitas tabelas que não adicionam IDs de incremento automático ou chaves primárias inteiras, ou as chaves primárias são distribuídas de maneira desigual, o que tornará mais lento o processo de todo o trabalho.

  • De acordo com o design do código-fonte sqoop, podemos usar a instrução –query para adicionar um ID de incremento automático como um parâmetro de divisão por e, ao mesmo tempo, podemos definir o limite definindo o intervalo de ID de incremento automático .

A sintaxe principal é a seguinte:


```bash
--query 方式:涉及参数  --query、--split-by、--boundary-query

--query: select col1、 col2、 coln3、 columnN from (select ROWNUM() OVER() AS INC_ID, T.* from table T where xxx )  where $CONDITIONS
--split-by: INC_ID
--boundary-query: select 1 as MIN , sum(1) as MAX from table where xxx

O exemplo completo de sintaxe:
password-file é obtido por echo -n "password content"> passsword-file, de forma que não contenha caracteres anormais.

sqoop import --connect $yourJdbConnectURL  \
--username $yourUserName
--password-file  file;///localpasswordFile  or hdfs relative Path
--query "" \
--split-by "" \
-m 8 \
-boundary-query “select 1 as min , sum(1) as max from table where  xx” \
--other parames

Link de referência: https://blog.csdn.net/qq_27882063/article/details/108352356?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source.png -blog -BlogCommendFromMachineLearnPai2-1.channel_param

(5) O problema de configuração de paralelismo de tarefa de mapa maior que 1

Ao importar dados em paralelismo, você precisa especificar qual campo deve ser segmentado. Este campo geralmente é uma chave primária ou um campo numérico não repetitivo e auto-crescente, caso contrário, o seguinte erro será relatado.

Import failed: No primary key could be found for table. Please specify one with --split-by or perform a sequential import with ‘-m 1’.

Ou seja, quando o paralelismo da tarefa do mapa é maior que 1, os dois parâmetros a seguir devem ser usados ​​ao mesmo tempo

--Split-by id especifica a divisão de acordo com o campo de id

-Mn especifica n paralelismo de mapa

2 resumos

Este artigo resume os problemas comuns encontrados na produção do Sqoop e fornece soluções específicas.

 

Acho que você gosta

Origin blog.csdn.net/godlovedaniel/article/details/109200453
Recomendado
Clasificación