Tutorial de Apache Sqoop: Archiarquitectura, comandos y ejemplo

โšก Resumen inteligente

Apache Sqoop transfiere grandes cantidades de datos entre bases de datos relacionales y HDFS mediante una arquitectura de conectores, generando trabajos MapReduce que importan tablas a Hive o HBase y exportan los resultados procesados โ€‹โ€‹de vuelta al sistema de origen.

  • ๐Ÿ”˜ Definiciรณn: Sqoop transfiere grandes cantidades de datos entre almacenes estructurados y HDFS a travรฉs de una capa de conectores basada en complementos.
  • โ˜‘๏ธ Architectura: Cada trabajo se compila en un programa MapReduce que solo utiliza mapas, cuyas tareas extraen porciones separadas de la tabla en paralelo.
  • โœ… Conectores: Cobertura de controladores incluida MySQL, PostgreSQL, Oracle, SQL Server y DB2, ademรกs de una alternativa JDBC genรฉrica.
  • ๐Ÿงช comandos: La herramienta de importaciรณn extrae una tabla a HDFS, Hive o HBase; la herramienta de exportaciรณn vuelve a insertar los archivos procesados โ€‹โ€‹en una tabla.
  • ๐Ÿ› ๏ธ Modos de carga: Las cargas completas copian una tabla entera, mientras que los modos incrementales de adiciรณn y รบltima modificaciรณn solo obtienen las filas nuevas.
  • โš ๏ธ Estado del proyecto: Sqoop se retirรณ al Apache Attic en julio de 2021, asรญ que Spark JDBC y NiFi ahora cuentan con nuevas canalizaciones.

Tutorial de Apache Sqoop que abarca la arquitectura, los conectores y los comandos de importaciรณn y exportaciรณn.

ยฟQuรฉ es SQOOP en Hadoop?

apache sqoop (SQL-to-Hadoop) es una herramienta diseรฑada para admitir la exportaciรณn e importaciรณn masiva de datos en HDFS Desde almacenes de datos estructurados como bases de datos relacionales, almacenes de datos empresariales y sistemas NoSQL. Es una herramienta de migraciรณn de datos basada en una arquitectura de conectores que admite complementos para proporcionar conectividad a nuevos sistemas externos.

Un caso de uso de ejemplo de Hadoop Sqoop es una empresa que ejecuta una importaciรณn Sqoop todas las noches para cargar los datos del dรญa desde un RDBMS transaccional de producciรณn en un Colmena almacรฉn de datos para su posterior anรกlisis.

A continuaciรณn en este tutorial de Apache Sqoop, aprenderemos sobre la arquitectura de Apache Sqoop.

sqoop Architectura

Todo lo existente Sistemas de gestiรณn de bases de datos estรกn diseรฑados con SQL estรกndar en mente. Sin embargo, cada DBMS difiere hasta cierto punto con respecto al dialecto. Por lo tanto, esta diferencia plantea desafรญos cuando se trata de transferencias de datos entre sistemas. Los conectores Sqoop son componentes que ayudan a superar estos desafรญos.

La transferencia de datos entre Sqoop Hadoop y el sistema de almacenamiento externo es posible con la ayuda de los conectores de Sqoop.

Sqoop tiene conectores para trabajar con una variedad de bases de datos relacionales populares, incluidas MySQL, PostgreSQL, Oracle, SQL Server y DB2. Cada uno de estos conectores sabe cรณmo interactuar con su DBMS asociado. Tambiรฉn hay un conector JDBC genรฉrico para conectarse a cualquier base de datos que admita Javaprotocolo JDBC de Sqoop. Ademรกs, Sqoop tambiรฉn proporciona optimizaciรณn MySQL y PostgreSQL Conectores que utilizan API especรญficas de bases de datos para realizar transferencias masivas de manera eficiente.

El diagrama que aparece a continuaciรณn sitรบa al cliente Sqoop entre el almacรฉn de datos externo y el clรบster Hadoop, con la capa de conexiรณn en un lado y HDFS, Hive y HBase en el otro.

Diagrama de arquitectura de Sqoop que muestra la capa de conectores que enlaza un sistema de gestiรณn de bases de datos relacionales (RDBMS) con un clรบster de Hadoop.

Debajo de la capa de conectores, Sqoop genera un Java clase que refleja una fila de la tabla y luego envรญa un mapa solamente MapReduce trabajo. Cada tarea de mapeo lee su propia porciรณn del rango de columnas divididas, por lo que el rendimiento aumenta con el nรบmero de mapeadores en lugar de con un solo cursor JDBC.

Ademรกs de esto, Sqoop tiene varios conectores de terceros para almacenes de datos, que van desde soluciones empresariales. almacenes de datos (incluidos Netezza, Teradata y Oracle) a tiendas NoSQL (como Couchbase). Sin embargo, estos conectores no vienen con el paquete Sqoop; estos deben descargarse por separado y pueden agregarse fรกcilmente a una instalaciรณn de Sqoop existente.

ยฟPor quรฉ necesitamos Sqoop?

El procesamiento analรญtico mediante Hadoop requiere la carga de enormes cantidades de datos de diversas fuentes en clรบsteres de Hadoop. Este proceso de carga masiva de datos en Hadoop, desde fuentes heterogรฉneas y su posterior procesamiento, conlleva una serie de desafรญos. Mantener y garantizar la coherencia de los datos y garantizar el uso eficiente de los recursos son algunos de los factores que se deben tener en cuenta antes de seleccionar el enfoque adecuado para la carga de datos.

Problemas mayores:

  1. Carga de datos mediante scripts โ€” El mรฉtodo tradicional de usar scripts para cargar datos no es adecuado para la carga masiva de datos en Hadoop; este mรฉtodo es ineficiente y consume mucho tiempo.
  2. Acceso directo a datos externos a travรฉs de una aplicaciรณn Map-Reduce. Proporcionar acceso directo a los datos almacenados en sistemas externos (sin cargarlos en Hadoop) para aplicaciones MapReduce complica dichas aplicaciones. Por lo tanto, este enfoque no es viable.

Ademรกs de tener la capacidad de trabajar con enormes cantidades de datos, Hadoop puede procesar datos en diferentes formatos. Por ello, se han desarrollado diversas herramientas para cargar datos tan heterogรฉneos en Hadoop. sqoop y Canal de flujo son dos de esas herramientas de carga de datos.

A continuaciรณn, en este tutorial de Sqoop con ejemplos, aprenderemos sobre la diferencia entre Sqoop, Flume y HDFS.

Sqoop vs Flume vs HDFS en Hadoop

sqoop Canal de flujo HDFS
Sqoop se utiliza para importar datos de fuentes de datos estructurados como RDBMS. Flume se utiliza para mover datos de transmisiรณn masiva a HDFS. HDFS es un sistema de archivos distribuido utilizado por el ecosistema Hadoop para almacenar datos.
Sqoop tiene una arquitectura basada en conectores. Los conectores saben cรณmo conectarse a la fuente de datos correspondiente y obtener los datos. Flume tiene una arquitectura basada en agentes. En ella se escribe un cรณdigo (que se denomina "agente") que se encarga de obtener los datos. HDFS tiene una arquitectura distribuida donde los datos se distribuyen entre mรบltiples nodos de datos.
HDFS es un destino para la importaciรณn de datos mediante Sqoop. Los datos fluyen a HDFS a travรฉs de cero o mรกs canales. HDFS es el destino final para el almacenamiento de datos.
La carga de datos de Sqoop no estรก controlada por eventos. La carga de datos de Flume puede ser impulsada por un evento. HDFS simplemente almacena los datos que se le proporcionan por cualquier medio.
Para importar datos de fuentes de datos estructurados, solo hay que usar comandos de Sqoop, porque sus conectores saben cรณmo interactuar con fuentes de datos estructurados y recuperar datos de ellas. Para cargar datos de transmisiรณn, como tweets generados en Twitter o archivos de registro de un servidor web, se debe utilizar Flume. Los agentes Flume estรกn diseรฑados para recuperar datos de transmisiรณn. HDFS tiene sus propios comandos de shell integrados para almacenar datos. HDFS no puede importar datos en tiempo real.

Caracterรญsticas principales de Sqoop

La comparaciรณn anterior explica dรณnde encaja Sqoop. El conjunto de caracterรญsticas que se detalla a continuaciรณn determina si se ajusta a una tarea de ingesta especรญfica.

  • Carga completa: Un solo comando copia una tabla completa y import-all-tables Copia todas las tablas de un esquema en una sola pasada.
  • Carga incremental: append modo tracks una columna monรณtonamente creciente como una clave subrogada, mientras que lastmodified modo tracks es una columna de marca de tiempo, por lo que solo se transfieren las filas nuevas o modificadas.
  • Transferencia paralela: La columna de divisiรณn distribuye el rango de claves entre las tareas de mapeo, y el recuento de mapeadores determina cuรกntos se ejecutan simultรกneamente.
  • Importaciรณn de consultas de formato libre: En lugar de importar una tabla completa, se puede importar el resultado de una sentencia SQL arbitraria, lo que mantiene las uniones y los filtros en la base de datos.
  • Carga directa en el almacรฉn: Una importaciรณn puede crear y rellenar un Colmena tabla o escribir directamente en una tabla HBase en lugar de detenerseping en archivos HDFS sin procesar.
  • Compresiรณn y formatos de archivo: La salida se puede escribir como texto delimitado, SequenceFile, Avro o Parquet, con compresiรณn opcional a nivel de cรณdec.
  • Seguridad: Sqoop se integra con Kerberos, y las credenciales se pueden leer desde un archivo de contraseรฑas o se pueden solicitar en lugar de escribirlas en la lรญnea de comandos.

Comandos de importaciรณn y exportaciรณn de Sqoop

Ambas direcciones de la transferencia se realizan mediante una utilidad de lรญnea de comandos. La herramienta de importaciรณn mueve filas de la base de datos a Hadoop, y la herramienta de exportaciรณn mueve archivos de Hadoop de vuelta a una tabla de la base de datos.

Una importaciรณn tรญpica especifica la conexiรณn JDBC, la tabla de origen, el directorio de destino, la columna de divisiรณn y el nรบmero de asignadores:

sqoop import \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employees \
  --target-dir /user/hadoop/warehouse/employees \
  --split-by emp_no \
  --num-mappers 4

Una exportaciรณn invierte el flujo. Lee los archivos delimitados que ya se encuentran en un directorio HDFS y los inserta en una tabla existente, por lo que primero hay que crear la tabla de destino:

sqoop export \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employee_summary \
  --export-dir /user/hadoop/warehouse/employee_summary \
  --input-fields-terminated-by ','

Un proceso nocturno rara vez necesita la tabla completa dos veces. Una importaciรณn incremental registra el valor mรกs alto que ya ha visto y comienza desde ahรญ en la siguiente ejecuciรณn:

sqoop import \
  --connect jdbc:mysql://localhost:3306/sales \
  --table orders \
  --incremental append \
  --check-column order_id \
  --last-value 15000 \
  --target-dir /user/hadoop/warehouse/orders

Estos son los argumentos que aparecen en casi todos los trabajos:

Argumento Lo que controla
--connect JDBC URL de la base de datos de origen o de destino.
--table Tabla que se lee durante una importaciรณn o en la que se escribe durante una exportaciรณn.
--target-dir Directorio HDFS que recibe una importaciรณn. No debe existir previamente.
--export-dir Directorio HDFS cuyos archivos son leรญdos por una exportaciรณn.
--split-by Columna cuyo rango se divide entre las tareas del mapa.
--num-mappers (-m) Nรบmero de tareas de mapeo paralelas. El valor predeterminado es cuatro.
--incremental Selecciona append or lastmodified el cambio tracRey.
--hive-import Crea la tabla de Hive correspondiente y carga en ella los datos importados.

โš ๏ธ Atenciรณn: Una exportaciรณn no es una transacciรณn รบnica. Cada tarea de mapeo confirma su propio lote, por lo que un fallo a mitad del proceso puede dejar parte de los datos en la tabla de destino. Dirija la escritura a travรฉs de una tabla intermedia cuando la carga deba ser total o nula.

Estado del proyecto Sqoop y alternativas modernas

Un detalle de la versiรณn es importante antes de que cualquiera de los comandos anteriores se incluya en el planificador.

Los desarrolladores de Sqoop votaron a favor de retirar el proyecto en junio de 2021 y el traslado a la รtico Apache Completado en julio de 2021. El sitio web, las listas de correo, el repositorio git, el problema tracEl kernel y las descargas siguen disponibles, pero solo en modo de lectura, y no se prevรฉn mรกs lanzamientos. La รบltima versiรณn de producciรณn es Sqoop 1.4.7 de 2017; la lรญnea independiente Sqoop 2 (1.99.x) nunca alcanzรณ la paridad de funciones y nunca se declarรณ lista para producciรณn.

Los trabajos de Sqoop existentes siguen ejecutรกndose, y las distribuciones comerciales de Hadoop continรบan incluyendo y dando soporte a la herramienta dentro de sus propias plataformas. Sin embargo, el nuevo trabajo de ingesta generalmente se basa en una de estas alternativas:

Alternative Mejores ajuste
Spark con la fuente de datos JDBC Tabla de lotes extracts que ya se encuentran dentro de un Spark pipeline, con lecturas particionadas en lugar de mapeadores.
apache nifi Enrutamiento basado en flujos y configurado visualmente entre mรบltiples sistemas heterogรฉneos.
Kafka Connect con un conector CDC Captura continua de cambios en los datos en lugar de un procesamiento por lotes nocturno.
Plataformas ETL gestionadas como Talend Conectores preconfigurados, programaciรณn y seguimiento de tareas sin necesidad de escribir trabajos manualmente.

Preguntas Frecuentes

Sqoop 1 es el รบnico cliente de lรญnea de comandos que se utiliza en todos los tutoriales. Sqoop 2 aรฑadiรณ un servidor, una API REST y una interfaz web, pero nunca alcanzรณ la paridad de funciones ni se considerรณ listo para producciรณn, por lo que la lรญnea 1.4.x se mantuvo como estรกndar.

Los modelos analizan las tablas de origen para inferir tipos, claves y columnas de divisiรณn, sugieren lรญmites de particiรณn a partir de la distribuciรณn de filas e indican desviaciones del esquema antes de que se produzca una interrupciรณn en la carga. Tambiรฉn proponen columnas de verificaciรณn incrementales al detectar comportamientos monรณtonos o de marca de tiempo en los datos de muestra.

Copilot genera rรกpidamente la estructura de argumentos, pero mezcla la sintaxis de Sqoop 1 y Sqoop 2 e introduce parรกmetros que ninguna versiรณn admite. Antes de programar la tarea, compruebe cada argumento con la Guรญa del usuario de Sqoop para la versiรณn instalada.

Sqoop no puede seleccionar automรกticamente una columna de divisiรณn y la importaciรณn falla. Debe especificar explรญcitamente una columna numรฉrica o de fecha adecuada como columna de divisiรณn, o bien forzar una รบnica tarea de mapeo que serialice la transferencia.

Una contraseรฑa escrita en la lรญnea de comandos es visible para cualquiera que estรฉ listando los procesos. Guรกrdela en un archivo HDFS legible solo por el propietario del trabajo e indique dicho archivo al argumento password-file, o bien utilice la solicitud interactiva.

El texto delimitado es el formato predeterminado. Tambiรฉn se admiten SequenceFile, Avro y Parquet, cada uno seleccionado mediante su propio argumento. El formato Parquet columnar es adecuado para consultas analรญticas posteriores, mientras que el texto delimitado sigue siendo el mรกs sencillo de inspeccionar e incorporar a una exportaciรณn.

Cuatro es el valor predeterminado y un buen punto de partida. Un mayor nรบmero de mapeadores implica mรกs conexiones simultรกneas a la base de datos, por lo que el lรญmite prรกctico viene determinado por la capacidad del servidor de origen, en lugar de por la programaciรณn del clรบster de Hadoop.

A Java tiempo de ejecuciรณn, un configurado Hadoop Se requiere un cliente que pueda acceder al clรบster y el archivo JAR del controlador JDBC para la base de datos de destino, ubicado en el directorio de la biblioteca de Sqoop. La falta de archivos JAR de controladores es la causa mรกs comรบn de fallos en la primera ejecuciรณn.

Resumir este post con: