Foro Formación Hadoop
Sqoop (2) - Cuestiones
Hola,
Tengo un par de preguntas sobre Sqoop (2) que me surgen tras visualizar el primer vídeo del módulo 4:
1) Sqoop nos permite añadir nueva información de un SGBD a Hadoop a través de APPEND. ¿Cómo se pueden gestionar deltas que sean, en lugar de nuevos registros, actualizaciones de estos o, incluso, borrados de registros? Por ejemplo, si nuestra tabla ha sufrido un borrado de un registro y ha actualizado otro, y no necesariamente valores que sean superiores al valor númerico utilizado para importar mediante --check-column.
2) Mi segunda pregunta es sobre las claves primarias para realizar la importación. Se ha mencionado la utilidad de tener una PK numérica (a ser posible, auto-incremental), e incluso el uso de fechas. En cambio, ¿cómo se gestionaría el caso en el que la PK de la tabla es un código alfanumérico? Típico ejemplo es el de un código de producto, cuentas bancarias tipo IBAN (XXNNNNNN...), maestro de direcciones, etc.
No he tenido la oportunidad de haber revisado la documentación oficial de Sqoop (todavía), pero quería proponer estas cuestiones por adelantado.
Muchas gracias
Alex
Hola Alexander,
Te contesto a continuación:
1). Primero de todo aclarar que Sqoop lo que hace es generar nuevos ficheros en el HDFS sin "controlar" ninguna ejecución previa (por mucho que nos permita añadir el comando append para ir guardando los datos en el mismo directorio de salida del HDFS).
- Si los registros son eliminados de la tabla no se puede controlar.
- Si se actualizan y se tiene un campo fecha si. Igual que existe la opción --incremental, existe la opción lastmodified:
"An alternate table update strategy supported by Sqoop is called lastmodified
mode. You should use this when rows of the source table may be updated, and each such update will set the value of a last-modified column to the current timestamp. Rows where the check column holds a timestamp more recent than the timestamp specified with --last-value
are imported."
https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html
2) Sqoop utiliza la clave primaria para las importaciones para realizar la division de los datos en las diferentes tareas map de la importación (por defecto 4).
En el caso incremental no es necesario que sea PK, con que sea una columna auto incremental bastaría.
Un saludo,
Hola Fernando,
Muchas gracias por las respuesta. Un par de cosas que me gustaría clarificar, si es posible.
1) Entonces, si Sqoop genera nuevos ficheros por cada vez que se ejecuta, es posible que, si realizamos un mismo import más de una vez sobre todos los contenidos de una tabla, se generen dos ficheros con la misma información. ¿Es esto correcto? Es lo que deduzco a partir de lo que comentas. Si esto es así, se duplicarían los datos, no?
2) Entiendo que, si los registros se han eliminado, no se pueden controlar mediante Sqoop. Para estos casos, ¿se recomienda hacer un volcado total de los datos para asegurarse de que tenemos la última información (eliminando los anteriores)? Si no se hace, se puede dar lugar a errores de sincronización de datos.
3) Me queda claro que para hacer incrementales, lo mejor es usar un campo autoincremental (tipo clave subrogada), que no tiene por qué ser una PK. Por tanto, en el caso de que no se disponga una columna autoincremental, ni tampoco un campo fecha, lo único que podemos hacer es recargar todos los datos desde cero para asegurarse que tenemos los datos correctos (lo mismo que 2) arriba).¿Es correcto?
Como ves, los puntos 2) y 3) se relacionan con mecanismos de CDC desde el punto de vista Data Warehouse, que estoy intentando, de alguna manera, trasladar a Sqoop de alguna manera.
Muchas gracias de nuevo
Alex
Hola Alex,
1) Si, duplicarías la información. Tienes que ver a "Sqoop" como una herramienta "suelta" que únicamente nos ayuda a sacar la información de una bd a través de MapReduce almacenando el resultado en HDFS. Sqoop no se va a preocupar de la integridad de los datos, por lo que esta parte, deberíamos ser nosotros los que la hiciéramos manualmente con algún otro proceso una vez tengamos los datos en el HDFS.
2,3) Depende... si te puedes permitir sacar toda la información en cada ejecución... pero no sería lo ideal, ya que supuestamente las tablas suelen ser "grandes" y descargar continuamente todo... es algo ineficiente. Pero si... si la única vía es Sqoop, no hay otra forma. Otra opción sería atacar directamente al log de la bd para interceptar el registro que indica la operación (esto ya es algo más avanzando y nada que ver con Sqoop).
Un saludo,
Social networks