Una introducción en profundidad a la arquitectura SQOOP

Apache Sqoop es una herramienta de ingestión de datos diseñada para transferir de manera eficiente datos masivos entre Apache Hadoop y almacenes de datos estructurados, como bases de datos relacionales, y viceversa.

Como parte de este blog, explicaré cómo funciona la arquitectura al ejecutar un comando Sqoop. Cubriré detalles como la generación de jar a través de Codegen, la ejecución del trabajo MapReduce y las diversas etapas involucradas en la ejecución de un comando de importación / exportación de Sqoop.

Codegen

Comprender Codegen es esencial, ya que internamente esto convierte nuestro trabajo de Sqoop en un jar que consta de varias clases de Java como POJO, ORM y una clase que implementa DBWritable, extendiendo SqoopRecord para leer y escribir los datos de bases de datos relacionales a Hadoop y viceversa. al revés.

Puede crear un Codegen explícitamente como se muestra a continuación para verificar las clases presentes como parte del jar.

sqoop codegen \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_db \ -- username retail_user \ -- password ******* \ -- table products

El jar de salida se escribirá en su sistema de archivos local. Obtendrá un archivo Jar, un archivo Java y archivos Java que se compilan en archivos .class:

Veamos un fragmento del código que se generará.

Clase ORM para tabla 'productos' // Modal relacional de objeto generado para mapeo:

Métodos Setter y Getter para obtener valores:

Internamente, utiliza declaraciones preparadas por JDBC para escribir en Hadoop y ResultSet para leer datos de Hadoop.

Importación de Sqoop

Se utiliza para importar datos de bases de datos relacionales tradicionales a Hadoop.

Veamos un fragmento de muestra del mismo.

sqoop import \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_db \ -- username retail_user \ -- password ******* \ -- table products \ -- warehouse-dir /user/jvanchir/sqoop_prac/import_table_dir \ -- delete-target-dir

Los siguientes pasos tienen lugar internamente durante la ejecución de sqoop.

Paso 1 : leer datos de MySQL en forma de transmisión. Realiza varias operaciones antes de escribir los datos en HDFS.

Como parte de este proceso, primero generará código (código típico de reducción de mapas) que no es más que código Java. Usando este código Java, intentará importar.

  • Genera el código. (Hadoop MR)
  • Compile el código y genere el archivo Jar.
  • Envíe el archivo Jar y realice las operaciones de importación

Durante la importación, debe tomar ciertas decisiones sobre cómo dividir los datos en varios subprocesos para que la importación de Sqoop se pueda escalar.

Paso 2 : comprender la estructura de los datos y realizar CodeGen

Usando la declaración SQL anterior, obtendrá un registro junto con los nombres de las columnas. Con esta información, extraerá la información de metadatos de las columnas, tipo de datos, etc.

Paso 3 : cree el archivo java, compílelo y genere un archivo jar

Como parte de la generación de código, debe comprender la estructura de los datos y debe aplicar ese objeto en los datos entrantes internamente para asegurarse de que los datos se copien correctamente en la base de datos de destino. Cada tabla única tiene un archivo Java que habla de la estructura de los datos.

Este archivo jar se inyectará en los binarios de Sqoop para aplicar la estructura a los datos entrantes.

Paso 4 : Elimina el directorio de destino si ya existe.

Paso 5 : Importa los datos

Aquí, se conecta a un administrador de recursos, obtiene el recurso e inicia la aplicación maestra.

Para realizar una distribución equitativa de datos entre las tareas del mapa, ejecuta internamente una consulta de límites basada en la clave principal de forma predeterminada

para encontrar el recuento mínimo y máximo de registros en la tabla.

Según el recuento máximo, se dividirá por el número de mapeadores y lo dividirá entre cada mapeador.

Utiliza 4 mapeadores por defecto:

Ejecuta estos trabajos en diferentes ejecutores como se muestra a continuación:

El número predeterminado de mapeadores se puede cambiar configurando el siguiente parámetro:

Entonces, en nuestro caso, usa 4 hilos. Cada hilo procesa subconjuntos mutuamente excluyentes, es decir, cada hilo procesa datos diferentes de los demás.

Para ver los diferentes valores, consulte lo siguiente:

Operaciones que se realizan en cada uno de los nodos ejecutores:

En caso de que realice una importación de Sqooop Hive, se lleva a cabo un paso adicional como parte de la ejecución.

Paso 6 : copiar datos a la tabla de colmena

Exportación de Sqoop

Se utiliza para exportar datos de Hadoop a bases de datos relacionales tradicionales.

Veamos un fragmento de muestra para el mismo:

sqoop export \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_export \ -- username retail_user \ -- password ******* \ -- table product_sqoop_exp \ -- export-dir /user/jvanchir/sqoop_prac/import_table_dir/products

On executing the above command, the execution steps (1–4) similar to Sqoop import take place, but the source data is read from the file system (which is nothing but HDFS). Here it will use boundaries upon block size to divide the data and it is internally taken care by Sqoop.

The processing splits are done as shown below:

After connecting to the respective database to which the records are to be exported, it will issue a JDBC insert command to read data from HDFS and store it into the database as shown below.

Now that we have seen how Sqoop works internally, you can determine the flow of execution from jar generation to execution of a MapReduce task on the submission of a Sqoop job.

Note: The commands that were executed related to this post are added as part of my GIT account.

Similarly, you can also read more here:

  • Hive Architecture in Depth with code.
  • HDFS Architecture in Depth with code.

If you would like too, you can connect with me on LinkedIn - Jayvardhan Reddy.

If you enjoyed reading this article, you can click the clap and let others know about it. If you would like me to add anything else, please feel free to leave a response ?