3.2.3 Herramienta de migración de datos Sqoop, importación de datos, MySQL a HDFS / Hive, exportación de datos, importación de datos incrementales, trabajo Sqoop, comandos y parámetros comunes

Tabla de contenido

Herramienta de migración de datos - Sqoop

La primera parte de la descripción general de Sqoop

La segunda parte de la instalación y configuración

Caso de solicitud de la tercera parte

Sección 1 Importación importación de datos

MySQL a HDFS

MySQL a Hive

Sección 2 exportación exportación de datos

Sección 3 Importación de datos incrementales

Captura de datos modificados (CDC)

Agregar forma

Sección 4 ejecutar trabajo

Parte IV Comandos y parámetros comunes

Sección 1 Comandos comunes

Sección 2 Parámetros comunes

Conexión de base de datos de parámetros comunes

Parámetros comunes: importación

Parámetros comunes: exportación

Parámetros comunes: colmena

parámetro de importación

exportar parámetros


 

Herramienta de migración de datos - Sqoop

La primera parte de la descripción general de Sqoop

Sqoop es una herramienta de código abierto que se utiliza principalmente para transferir datos entre Hadoop (Hive) y bases de datos tradicionales (mysql, postgresql, etc.). Puede importar datos de bases de datos relacionales (MySQL, Oracle, Postgres, etc.) a HDFS y también puede importar datos de HDFS a bases de datos relacionales.

El proyecto Sqoop comenzó en 2009. Primero existió como un módulo de terceros de Hadoop. Más tarde, para permitir a los usuarios implementar rápidamente y permitir a los desarrolladores desarrollar iterativamente más rápido, Sqoop se convirtió de forma independiente en un proyecto Apache.

 

La segunda parte de la instalación y configuración

Sitio web oficial de Sqoop: http://sqoop.apache.org/
Dirección de descarga de Sqoop: http://www.apache.org/dyn/closer.lua/sqoop/

 

1. Descarga, carga y descomprime

Cargue el paquete de instalación descargado sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz a la máquina virtual; descomprima el paquete;

tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0 / ../servers/sqoop-1.4.7/

2. Incrementar las variables del entorno y hacerlas efectivas

vi / etc / profile

# Agregue el siguiente contenido
export SQOOP_HOME = / opt / lagou / servers / sqoop-1.4.7
export PATH = $ PATH: $ SQOOP_HOME / bin

fuente / etc / profile

3. Cree y modifique archivos de configuración

# Ubicación del archivo de configuración $ SQOOP_HOME / conf; el archivo de configuración que se va a modificar es sqoop-env.sh
cp sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh

# Agregue el siguiente contenido al final del archivo
export HADOOP_COMMON_HOME = / opt / lagou / servers / hadoop-2.9.2
export HADOOP_MAPRED_HOME = / opt / lagou / servers / hadoop-2.9.2
export HIVE_HOME = / opt / lagou / servers / colmena-2.3 .7

4. Copie el controlador JDBC

# Copie el controlador jdbc en el directorio lib de sqoop (nota: también se puede establecer un enlace suave)
ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar / opt /lagou/servers/sqoop-1.4.7/lib/

5. Copie jar. Copie
hive-common-2.3.7.jar en $ HIVE_HOME / lib en el directorio $ SQOOP_HOME / lib. Si no copia los datos de MySQL a Hive, se producirá un error: ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

# Se pueden establecer tanto una copia impresa como un enlace virtual, solo elija uno para ejecutar. La siguiente es una copia impresa
cp $ HIVE_HOME / lib / hive-common-2.3.7.jar $ SQOOP_HOME / lib /

# Establecer un enlace suave
ln -s /opt/lagou/servers/hive-2.3.7/lib/hive-common-2.3.7.jar /opt/lagou/servers/sqoop-1.4.7/lib/hive-common - 2.3.7.jar

Copie $ HADOOP_HOME / share / hadoop / tools / lib / json-20170516.jar en el directorio $ SQOOP_HOME / lib /; de lo contrario, al crear un trabajo sqoop, informará: java.lang.NoClassDefFoundError: org / json / JSONObject

cp $ HADOOP_HOME / share / hadoop / tools / lib / json-20170516.jar $ SQOOP_HOME / lib /

6. Verificación de la instalación

[root @ linux123 ~] # versión sqoop

...

Omitir advertencia

...
20/06/19 10:37:24 INFO sqoop.Sqoop: Ejecutando Sqoop versión: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compilado por maugli el jueves 21 de diciembre 15:59:58 STD 2017

 

# Pruebe si Sqoop puede conectarse con éxito a la base de datos
[root @ linux123 ~] # sqoop list -bases --connect jdbc: mysql: // linux123: 3306 /? UseSSL = false --username hive --password 12345678

 

Advertencia: ...

Omitir advertencia

...
information_schema
hivemetadata
mysql
performance_schema
sys


Caso de solicitud de la tercera parte

En Sqoop

  • Importar se refiere a: transferir datos de bases de datos relacionales a grandes grupos de datos (HDFS, HIVE, HBASE), utilizar la palabra clave de importación;
  • Exportar se refiere a: transferir datos de un clúster de big data a una base de datos relacional, utilizar la palabra clave export;

Script de datos de prueba

-- 用于在 Mysql 中生成测试数据
CREATE DATABASE sqoop;

use sqoop;

CREATE TABLE sqoop.goodtbl(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);


DROP FUNCTION IF EXISTS `rand_string`;
DROP PROCEDURE IF EXISTS `batchInsertTestData`;


-- 替换语句默认的执行符号,将;替换成 //
DELIMITER //

CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255)
CHARSET 'utf8'
BEGIN
   DECLARE char_str VARCHAR(200) DEFAULT '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   DECLARE return_str VARCHAR(255) DEFAULT '';
   DECLARE i INT DEFAULT 0;
   WHILE i < n DO
        SET return_str = CONCAT(return_str, SUBSTRING(char_str, FLOOR(1 + RAND()*36), 1));
        SET i = i+1;
   END WHILE;
   RETURN return_str;
END
//


-- 第一个参数表示:序号从几开始;第二个参数表示:插入多少条记录
CREATE PROCEDURE `batchInsertTestData` (m INT, n INT)
BEGIN
   DECLARE i INT DEFAULT 0;
   WHILE i < n DO
      INSERT INTO goodtbl (gname, serialNumber, price, stock_number, create_time)
      VALUES (rand_string(6), i+m, ROUND(RAND()*100), FLOOR(RAND()*100), NOW());
      SET i = i+1;
   END WHILE;
END
//

DELIMITER ;

call batchInsertTestData(1, 100);

 

Sección 1 Importación importación de datos

MySQL a HDFS

1. Importar todos los datos

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

Observaciones:

  • target-dir: la ruta para importar datos a HDFS;
  • delete-target-dir: si la carpeta de destino ya existe en HDFS, se informará un error cuando la ejecute nuevamente. Puede usar --delete-target-dir para eliminar el directorio primero. También puede utilizar el parámetro append para indicar datos adicionales;
  • num-mappers: cuántas tareas de mapa se inician; 4 tareas de mapa se inician de forma predeterminada; también se puede escribir como -m 1
  • campos terminados por: separador de datos en un archivo HDFS;

 

2. Importar datos de consulta

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--append \
-m 1 \
--fields-terminated-by "\t" \
--query 'select gname, serialNumber, price, stock_number,
create_time from goodtbl where price>88 and $CONDITIONS order by price;'

Observaciones:

  • La cláusula where de la instrucción de consulta debe contener '$ CONDICIONES'
  • Si se usan comillas dobles después de la consulta, se debe agregar un carácter de transferencia antes de $ CONDICIONES para evitar que el shell identifique sus propias variables

3. Importa la columna especificada

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns gname,serialNumber,price \
--table goodtbl

Observaciones: si hay varias columnas involucradas en las columnas, sepárelas con comas y no agregue espacios

4. Importar datos de consulta (utilizar palabras clave)

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
-m 1 \
--fields-terminated-by "\t" \
--table goodtbl \
--where "price>=68"

5. Inicie varias
Tareas de mapas para importar datos Agregue datos a goodtbl: llame a batchInsertTestData (1000000);

# 给 goodtbl 表增加主键
alter table goodtbl add primary key(serialNumber);

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou/sqoop/5 \
--append \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by serialNumber
sqoop import \
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou/sqoop/5 \
--delete-target-dir \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by gname

Nota:
cuando se utilizan varias tareas de mapas para la importación de datos, sqoop debe dividir los datos de cada tarea

  • Si la tabla en MySQL tiene una clave principal, simplemente especifique el número de tareas de mapa
  • Si la tabla en MySQL tiene una clave principal, use split-by para especificar el campo de partición
  • Si el campo de partición es un tipo de carácter, agréguelo cuando utilice el comando sqoop: -Dorg.apache.sqoop.splitter.allow_text_splitter = true. cual es
sqoop import -
Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://liunx:3306/sqoop \
... ...
  • Las '$ CONDICIONES' en la cláusula where de la instrucción de consulta también se utilizan para la partición de datos, incluso si solo hay una Tarea de mapa

 

MySQL a Hive

Crea una tabla en Hive:

CREATE TABLE mydb.goodtbl(
gname string,
serialNumber int,
price int,
stock_number int,
create_time date);
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table mydb.goodtbl \
-m 1

Descripción de parámetros:

  • hive-import. Parámetro obligatorio, especificar colmena de importación
  • base de datos de colmena. Nombre de la biblioteca de Hive (valor predeterminado predeterminado)
  • tabla-colmena。 Colmena 表 名
  • campos-terminados-por. Separador de campo de colmena
  • sobrescritura de colmena. Sobrescribir datos existentes
  • crear-tabla-colmena. Se crea la tabla de colmena, pero puede haber errores en la tabla. No se recomienda utilizar este parámetro, se recomienda construir la tabla con anticipación

 

Sección 2 exportación exportación de datos

Ingrese a la plataforma de big data para importar: importar

Deje la plataforma de big data export: export
Nota: las tablas MySQL deben crearse con anticipación

-- 提前创建表
CREATE TABLE sqoop.goodtbl2(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);

colmena mydb.goodtbl → MySQL sqoop.goodtbl2

sqoop export \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl2 \
-m 4 \
--export-dir /user/hive/warehouse/mydb.db/goodtbl \
--input-fields-terminated-by "\t" 

 

Sección 3 Importación de datos incrementales

Captura de datos modificados (CDC)

Se realizaron todas las importaciones de datos anteriores. Si la cantidad de datos es pequeña, se adopta la extracción completa de datos de origen; si la cantidad de datos de origen es grande, los datos modificados deben extraerse. Este modo de extracción de datos se denomina captura de datos modificados o CDC (captura de datos modificados) para corto.

 

Los CDC se dividen aproximadamente en dos tipos: invasivos y no invasivos. Intrusivo se refiere al impacto en el rendimiento de las operaciones de CDC en el sistema fuente. Siempre que las operaciones CDC realicen operaciones SQL en la base de datos fuente de alguna manera, se considera intrusivo.

Los cuatro métodos de los CDC más utilizados son (los tres primeros son invasivos):

CDC basado en la marca de tiempo. El proceso de extracción puede determinar qué datos son incrementales en función de determinadas columnas de atributos. Las columnas de atributos más comunes son las siguientes:

  • Marca de tiempo: es mejor tener dos columnas, una marca de tiempo de inserción, que indica cuándo se creó, y una marca de tiempo de actualización, que indica la hora de la última actualización;
  • Secuencia: la mayoría de las bases de datos proporcionan una función de autoincremento, la columna de la tabla se define como autoincremento, es fácil identificar los datos recién insertados según la columna;

Este método es el más simple y el más utilizado, pero tiene las siguientes desventajas:

  • No se puede grabar la operación de eliminación de registro
  • Múltiples actualizaciones no reconocidas
  • Sin capacidad en tiempo real

 

CDC basado en disparadores. Cuando se ejecutan sentencias SQL como INSERT, UPDATE y DELETE, se activan los desencadenantes en la base de datos, que se pueden utilizar para capturar los datos modificados y guardar los datos en la tabla temporal intermedia. Luego, estos datos modificados se recuperan de la tabla temporal. En la mayoría de los casos, no está permitido agregar disparadores a una base de datos operativa, y este método reducirá el rendimiento del sistema y no será adoptado;

CDC basado en instantáneas. Los cambios de datos se pueden obtener comparando la tabla de origen y la tabla de instantáneas. El CDC basado en instantáneas puede detectar datos insertados, actualizados y eliminados, lo cual es una ventaja sobre el esquema CDC basado en sellos de tiempo. La desventaja es que requiere mucho espacio de almacenamiento para guardar la instantánea.

CDC basado en registros. El método CDC más complejo y no invasivo es el método basado en registros. La base de datos registrará cada operación de inserción, actualización y eliminación en el registro. Al analizar el archivo de registro, puede obtener información relevante. El formato de registro de cada base de datos relacional es inconsistente y no existe un producto universal. El canal de Alibaba puede completar el análisis del archivo de registro de MySQL.

Hay dos formas de importar datos de forma incremental:

  • Importación de datos incrementales basada en columnas incrementales (método Append)
  • Importación de datos incrementales basada en la columna de tiempo (método LastModified)

Agregar forma

1. Prepare los datos iniciales

-- 删除 MySQL 表中的全部数据
truncate table sqoop.goodtbl;

-- 删除 Hive 表中的全部数据
truncate table mydb.goodtbl;

-- 向MySQL的表中插入100条数据
call batchInsertTestData(1, 100);

2. Importar datos a Hive

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1

Descripción de parámetros:

  • check-column se utiliza para especificar algunas columnas (es decir, puede especificar varias columnas). Estas columnas se utilizan para comprobar si los datos se importan como datos incrementales durante la importación incremental, que es similar a los campos de incremento automático y las marcas de tiempo en relacional bases de datos. El tipo de estas columnas especificadas no puede ser ningún tipo de carácter, como char, varchar, etc.
  • último valor especifica el valor máximo del campo especificado en la columna de verificación durante la última importación

3. Compruebe si hay datos en la tabla de colmena y cuántos datos hay.

4. Agregue 1000 datos más a MySQL, el número comienza desde 200

call batchInsertTestData(200, 1000);

5. Realice la importación incremental nuevamente para importar los datos de MySQL a Hive; en este momento, cambie el último valor a 100

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 100 \
-m 1

6. Verifique si hay datos en la tabla de colmena y cuántos datos hay.

 

Sección 4 ejecutar trabajo

Hay dos formas de implementar la importación de datos incrementales:

  1. Configure manualmente el último valor cada vez, programación manual
  2. Uso de trabajo, dado el último valor inicial, las tareas cronometradas se programan regularmente todos los días

Obviamente, el método 2 es más fácil.

1. Cree un archivo de contraseña

echo -n "12345678" > sqoopPWD.pwd
hdfs dfs -mkdir -p /sqoop/pwd
hdfs dfs -put sqoopPWD.pwd /sqoop/pwd
hdfs dfs -chmod 400 /sqoop/pwd/sqoopPWD.pwd

# 可以在 sqoop 的 job 中增加:
--password-file /sqoop/pwd/sqoopPWD.pwd

2. Crear trabajo de sqoop

# 创建 sqoop job
sqoop job --create myjob1 -- import \
--connect jdbc:mysql://linux123:3306/sqoop?useSSL=false \
--username hive \
--password-file /sqoop/pwd/sqoopPWD.pwd \
--table goodtbl \
--incremental append \
--hive-import \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1

# 查看已创建的job
sqoop job --list

# 查看job详细运行时参数
sqoop job --show myjob1

# 执行job
sqoop job --exec myjob1

# 删除job
sqoop job --delete myjob1

3. Ejecutar trabajo

sqoop job -exec myjob1

4. Ver datos

Principio de implementación:
después de que se ejecute el trabajo, el valor máximo de la columna de verificación actual se registrará en el meta, y este valor se asignará al último valor cuando se llame al trabajo la próxima vez.

Por defecto, los metadatos se guardan en ~ / .sqoop /

Entre ellos, el archivo metastore.db.script registra la operación de actualización al último valor:

cat metastore.db.script |grep incremental.last.value

 

Parte IV Comandos y parámetros comunes

Sección 1 Comandos comunes

 

Sección 2 Parámetros comunes

Los denominados parámetros públicos son los parámetros admitidos por la mayoría de los comandos.

Conexión de base de datos de parámetros comunes

 

Parámetros comunes: importación


 

Parámetros comunes: exportación

 

Parámetros comunes: colmena


 

parámetro de importación

 

exportar parámetros

 

Supongo que te gusta

Origin blog.csdn.net/chengh1993/article/details/112060391
Recomendado
Clasificación