Oracle 12c y Hadoop para mejor almacenamiento y procesamiento de datos

Por Wissem El Khlifi
Publicado en Marzo 2014

  • Introducción:

Reciban estimados tecnólogos Oracle un cordial saludo.  El objetivo de este artículo es mostrar cómo utilizar las herramientas Hadoop eco-sistémicos para extraer datos de la base de datos Oracle 12c. Utilizaremos el “Framework” de Hadoop para procesar y transformar los datos (ETL: “Extract”, “Transform” y “Load”). Luego cargamos los datos procesados en Hadoop hacia una base de datos Oracle 12c.

  • Que es Big Data?

Big Data es la cantidad de datos que una sola máquina no puede almacenar y procesar. Los datos provienen de diferentes formatos (estructurados, no estructurados -) y de diferentes fuentes  con una gran velocidad de crecimientos.

  • Que es Apache Hadoop?

Es un “Framework” que permita el procesamiento distribuido de muchos datos a partir de diferentes (puede ser miles) de máquinas. El concepto de Hadoop fue introducido, por primera vez, por Google. El “Framework”  Hadoop consiste en HDFS y MapReduce.

  • Que es HDFS?

HDFS (“Hadoop Distributed File System”): es el sistema de archivos Hadoop permitiendo de almacenar datos distribuidos entre múltiples máquinas.

  •  Que es Map Reduce?

Es el componente de procesamiento de datos del “Framework” Hadoop. Consiste en fases: “Map” y “Reduce”.

  •  Que es Apache Sqoop?

Apache Sqoop es una herramienta para transferir datos de forma masiva entre Apache Hadoop y sistemas de gestión de bases de dato. Los datos deben ser estructurados. Es una parte o el ecosistema Hadoop.

  • Que es Apache Hive?

Hive es una herramienta para consultar y gestionar grandes volúmenes de datos almacenados en Hadoop HDFS. También es una parte o el ecosistema Hadoop.

  • Donde Cabe Hadoop en la arquitectura de empresas?

En el siguiente artículo, vamos a utilizar el Ecosistema de Apache Hadoop (Apache Sqoop) para extraer datos de una base de datos Oracle 12c y almacenarlos en el sistema de archivos distribuidos Hadoop (HDFS). Usaremos entonces el Hadoop Ecosistema Apache (Apache Hive) para transformar los datos y luego procesarlos utilizando el “Map Reduce” (También podemos usar programas Java para hacer lo mismo). Apache Sqoop será utilizado para cargar los datos ya procesados ​​dentro de Hadoop en una base final bajo Oracle 12c. En la siguiente imagen se indica dónde Hadoop encaja en el proceso. Este escenario puede ser perfectamente una solución de producción para procesar grandes volúmenes de datos procedentes de la base de datos de Oracle como fuente, con una única condición: los datos debe ser estructurados.

  • Pre-requisitos:

  • Preparar el entorno:
  • Conectar al “Pluggable Database” (PDB) en Oracle 12cR1:

Nota: El siguiente paso no es necesario cuando tiene una base de datos Oracle anterior a 12c. Si desea conectarse a una versión de la base de datos de Oracle antes de la versión 12c de Oracle, lo único que necesita es tener un servicio de base de datos en funcionamiento. Este paso funciona también para un sistema de RAC clúster y el entorno Exadata.
En Oracle 12cR1, se puede utilizar 4 formas de conectarse a “Pluggable Database”.

  • Usando el nombre de servicio por defecto que ya está creado automáticamente por el software de base de datos.
  • Crear su propio servicio mediante “srvctl”.
  • Ejecutar el comando “SET CONTAINER” al nivel de sesión por ejemplo, “ALTER SESSION SET CONTENEDOR = MYPDB;”
  • Usar “Enterprise Manager” 12c o the “Enterprise Manager 12c Express”.

En este artículo, vamos a crear un nuevo servicio para “Pluggable database” llamado "orawiss12c"

sandbox1(orawiss):/home/oracle/wissem>sqlplus    / as sysdba
SQL*Plus: Release    12.1.0.1.0 Production on Mon Nov 25 10:57:42 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

 

SQL> select con_id,dbid,NAME,OPEN_MODE from v$pdbs;
CON_ID     DBID NAME                           OPEN_MODE
---------- ---------- ------------------------------ ----------
2 4061740350 PDB$SEED                       READ ONLY
3 1574282659 ORAWISS12C                     READ WRITE

 

SQL>

 

Para crear el servicio para “PDB” usando “SRVCTL”, usamos el comando “add service” especificando la opción “–pdb”.
Luego arrancamos el servicio creado “orawissPDB”.

sandbox1(+ASM):/home/oracle>srvctl add service -db orawiss -service    orawissPDB -pdb orawiss12c
sandbox1(+ASM):/home/oracle>srvctl start service -db orawiss -service    orawissPDB
sandbox1(+ASM):/home/oracle>

Luego, añadimos una entrada en el fichero tnsnames.ora.

sandbox1(+ASM):/home/oracle>cat /opt/app/oracle/product/12.1/db_1/network/admin/tnsnames.ora
orawissPDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = sandbox1.XXX.com)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = orawissPDB)
)
) sandbox1(+ASM):/home/oracle>
sandbox1(orawiss):/home/oracle/wissem >sqlplus wissem/wissem@orawissPDB
SQL*Plus: Release 12.1.0.1.0 Production on Mon Nov 25 10:51:24 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Last Successful login time: Sun Jul 14 2013 05:20:12 -05:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
sandbox1(orawiss):/home/oracle/wissem/ORAWISS/archivelog>


  • Descargar el “driver” JDBC para Oracle:

Puede descargar el “Driver” JDBC desde el sitio web de Oracle:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Debe aceptar el acuerdo de licencia antes de poder descargar el “Driver” JDBC. Descargue el archivo ojdbc6.jar.



Copia el fichero ojdbc6.jar bajo el directorio /usr/lib/sqoop/lib/ en cliente Hadoop luego ejecuta el siguiente:

  • Testear la conexión a la base de datos Oracle:

Podemos probar la conexión con la base de datos Oracle utilizando Sqoop. Nota: Estamos utilizando sandbox1 como servidor de base de datos Oracle y local host donde está instalado Hadoop, Sqoop y Hive. Generalmente, puede encontrar Hadoop instalado en varias máquinas, Sqoop instalado en una diferente maquina. Hive puede ser instalada también en una diferente máquina. Para simplificar, todo ecosistema Hadoop y Hadoop Framework están instalados en una sola maquina.
La siguiente imagen muestra que hemos seleccionado 1 de la tabla “dual” usando sqoop. La conexión a la “Pluggable Database” funciona porque hemos tenido 1 como resultado.


  • Ejemplo: Caso de Usuarios Activos en Internet:

Para nuestro ejemplo, una empresa de marketing Online ofrece banners, páginas Web a los usuarios de Internet para descargar varios programas, juegos en línea, etc. La empresa tiene millones de usuarios activos al día en todo el mundo. El departamento de estadísticas de la empresa quiere saber cuántas veces un usuario esta activo al día: Un usuario llamado activo cuando él hace clic en un banner o hace clic en una oferta o simplemente se registra. Podemos imaginar que necesitamos una tabla Oracle con sólo dos columnas: IP del usuario y la fecha activa. La tabla puede tener varias y otras columnas como un identificador de Banner, fuente de tráfico (Google, Yahoo), El país del usuario,…. Vamos a llamar la tabla " User_Activity " que puede tener miles de millones de registros por día.
Vamos a escribir un programa para analizar los usuarios activos. Los datos se registran en la base de datos “orawissPDB” cada vez que un usuario hace una "acción". Podemos tener al final del día un gran volumen de datos registrado. Los datos están estructurados de una manera que son buenos candidatos a ser gestionados por una base de datos Oracle. También las estadísticas sobre la tabla pueden ser tratadas con el “MapReduce” de Hadoop. El objetivo es conocer cuantas veces cada usuario está activo por día.
Vamos a crear la tabla en Oracle 12c e insertar algunos datos.

sandbox1(orawiss):/home/oracle/wissem>sqlplus wissem/wissem@orawissPDB
SQL*Plus: Release 12.1.0.1.0 Production on    Wed Nov 27 04:43:09 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Last Successful login time: Tue Nov 26 2013 11:26:04 -05:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
SQL> create table user_activity(IP_ADRR Varchar2(30), ACTIVE_DATE DATE, Traffi_source
Varchar2(50), ISO_COUNTRY  Varchar2(2));

Table created.
SQL> ALTER TABLE user_activity ADD PRIMARY KEY (IP_ADRR, ACTIVE_DATE);
Table altered.
SQL> select * from user_activity;
IP_ADRR                        ACTIVE_DATE         TRAFFI_SOURCE                                      IS --------------------------- ------------------- -------------------------------------------------- -- 98.245.153.111                 11/27/2013 04:49:14 Google                                             TN
65.245.153.105                 11/27/2013 04:49:59 Yahoo                                              BE
98.245.153.111                 11/27/2013 04:50:14 MSN                                                TN
98.245.153.111                 11/27/2013 04:50:25 MSN                                                TN
98.245.153.111                 11/27/2013 04:50:28 MSN                                                TN
98.245.153.111                 11/27/2013 04:50:30 MSN                                                TN
65.245.153.105                 11/27/2013 04:50:40 Yahoo                                              BE
65.245.153.105                 11/27/2013 04:50:41 Yahoo                                              BE
65.245.153.105                 11/27/2013 04:50:42 Yahoo                                              BE
……
……
SQL>

  • Extraer los datos desde “Pluggable Database” hacia HDFS:

Utilizamos Sqoop para importar los datos de Oracle a HDFS. Sqoop tiene la opción”import” para importar datos de RDBMS. Tenemos que especificar una cadena de conexión, nombre de la tabla y el separador de campos.
Más detalles sobre Sqoop “import” se pueden encontrar en la guía del usuario Sqoop.  Sqoop puede importar datos en paralelo. Podemos especificar el número de tareas del proceso “map” (procesos paralelos) que se usarán para la importación de Oracle mediante en el argumento “–num-mappers”. Por defecto, se utilizan cuatro procesos paralelos.
En nuestro ejemplo, vamos a usar uno solo proceso “map”;

[wissem@localhost ~]$ sqoop import  --connect jdbc:oracle:thin:@// sandbox1.xxx.com:1522/orawissPDB --table    
USER_ACTIVITY --fields-terminated-by '\t' --num-mappers 1 --username WISSEM -P
Warning: /usr/lib/hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Enter password: 13/11/27 14:39:23 INFO manager.SqlManager: Using default fetchSize of 1000 13/11/27 14:39:23 INFO tool.CodeGenTool: Beginning code generation 13/11/27 14:39:26 INFO manager.OracleManager: Time zone has been set to GMT 13/11/27 14:39:27 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM USER_ACTIVITY t WHERE 1=0 13/11/27 14:39:27 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/lib/hadoop-0.20-mapreduce 13/11/27 14:39:27 INFO orm.CompilationManager: Found hadoop core jar at: /usr/lib/hadoop-0.20-mapreduce/hadoop-core.jar Note: /tmp/sqoop-wissem/compile/6a6e927fb008e151d1eeb04bff6f24ef/USER_ACTIVITY.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. 13/11/27 14:39:30 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-wissem/compile/6a6e927fb008e151d1eeb04bff6f24ef/USER_ACTIVITY.jar 13/11/27 14:39:30 INFO manager.OracleManager: Time zone has been set to GMT 13/11/27 14:39:34 WARN manager.OracleManager: The table USER_ACTIVITY contains a multi-column primary key. Sqoop will default to the column ACTIVE_DATE only for this job. 13/11/27 14:39:34 INFO manager.OracleManager: Time zone has been set to GMT 13/11/27 14:39:35 WARN manager.OracleManager: The table USER_ACTIVITY contains a multi-column primary key. Sqoop will default to the column IP_ADRR only for this job. 13/11/27 14:39:35 INFO mapreduce.ImportJobBase: Beginning import of USER_ACTIVITY 13/11/27 14:39:36 INFO manager.OracleManager: Time zone has been set to GMT 13/11/27 14:39:37 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 13/11/27 14:39:42 INFO mapred.JobClient: Running job: job_201311271428_0001 13/11/27 14:39:43 INFO mapred.JobClient: map 0% reduce 0% 13/11/27 14:40:04 INFO mapred.JobClient: map 100% reduce 0% 13/11/27 14:40:07 INFO mapred.JobClient: Job complete: job_201311271428_0001 13/11/27 14:40:07 INFO mapred.JobClient: Counters: 23 13/11/27 14:40:07 INFO mapred.JobClient: File System Counters 13/11/27 14:40:07 INFO mapred.JobClient: FILE: Number of bytes read=0 13/11/27 14:40:07 INFO mapred.JobClient: FILE: Number of bytes written=216292 13/11/27 14:40:07 INFO mapred.JobClient: FILE: Number of read operations=0 13/11/27 14:40:07 INFO mapred.JobClient: FILE: Number of large read operations=0 13/11/27 14:40:07 INFO mapred.JobClient: FILE: Number of write operations=0 13/11/27 14:40:07 INFO mapred.JobClient: HDFS: Number of bytes read=87 13/11/27 14:40:07 INFO mapred.JobClient: HDFS: Number of bytes written=407 13/11/27 14:40:07 INFO mapred.JobClient: HDFS: Number of read operations=1 13/11/27 14:40:07 INFO mapred.JobClient: HDFS: Number of large read operations=0 13/11/27 14:40:07 INFO mapred.JobClient: HDFS: Number of write operations=1 13/11/27 14:40:07 INFO mapred.JobClient: Job Counters 13/11/27 14:40:07 INFO mapred.JobClient: Launched map tasks=1 13/11/27 14:40:07 INFO mapred.JobClient: Total time spent by all maps in occupied slots (ms)=20435 13/11/27 14:40:07 INFO mapred.JobClient: Total time spent by all reduces in occupied slots (ms)=0 13/11/27 14:40:07 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 13/11/27 14:40:07 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 13/11/27 14:40:07 INFO mapred.JobClient: Map-Reduce Framework 13/11/27 14:40:07 INFO mapred.JobClient: Map input records=9 13/11/27 14:40:07 INFO mapred.JobClient: Map output records=9 13/11/27 14:40:07 INFO mapred.JobClient: Input split bytes=87 13/11/27 14:40:07 INFO mapred.JobClient: Spilled Records=0 13/11/27 14:40:07 INFO mapred.JobClient: CPU time spent (ms)=1000 13/11/27 14:40:07 INFO mapred.JobClient: Physical memory (bytes) snapshot=60805120 13/11/27 14:40:07 INFO mapred.JobClient: Virtual memory (bytes) snapshot=389214208 13/11/27 14:40:07 INFO mapred.JobClient: Total committed heap usage (bytes)=15990784 13/11/27 14:40:07 INFO mapreduce.ImportJobBase: Transferred 407 bytes in 31.171 seconds (13.057 bytes/sec) 13/11/27 14:40:07 INFO mapreduce.ImportJobBase: Retrieved 9 records. [wissem@localhost ~]$

Como podemos ver, el proceso de Sqoop ha utilizado el “Map Reduce” con un solo “mapper” y zero “reducer”. Sqoop ha creado automáticamente un fichero de archivos Java “Jar” llamado “USER_ACTIVITY.jar” para extraer los datos desde Oracle.
EL fichero bajo HDFS es llamado part-m-00000. Vamos a renombrar el fichero a user_activity.txt.

[wissem@localhost ~]$ hadoop fs -cat /user/wissem/USER_ACTIVITY/part-m-00000
98.245.153.111    2013-11-27 04:49:14.0    Google    TN
65.245.153.105    2013-11-27 04:49:59.0    Yahoo    BE
98.245.153.111    2013-11-27 04:50:14.0    MSN    TN
98.245.153.111    2013-11-27 04:50:25.0    MSN    TN
98.245.153.111    2013-11-27 04:50:28.0    MSN    TN
98.245.153.111    2013-11-27 04:50:30.0    MSN    TN
65.245.153.105    2013-11-27 04:50:40.0    Yahoo    BE
65.245.153.105    2013-11-27 04:50:41.0    Yahoo    BE
65.245.153.105    2013-11-27 04:50:42.0    Yahoo    BE
[wissem@localhost ~]$ [wissem@localhost ~]$ hadoop fs -mv USER_ACTIVITY/part-m-00000 /user/wissem/USER_ACTIVITY/user_activity.txt
[wissem@localhost ~]$ hadoop fs -cat /user/wissem/USER_ACTIVITY/user_activity.txt
98.245.153.111    2013-11-27 04:49:14.0    Google    TN
65.245.153.105    2013-11-27 04:49:59.0    Yahoo    BE
98.245.153.111    2013-11-27 04:50:14.0    MSN    TN
98.245.153.111    2013-11-27 04:50:25.0    MSN    TN
98.245.153.111    2013-11-27 04:50:28.0    MSN    TN
98.245.153.111    2013-11-27 04:50:30.0    MSN    TN
65.245.153.105    2013-11-27 04:50:40.0    Yahoo    BE
65.245.153.105    2013-11-27 04:50:41.0    Yahoo    BE
65.245.153.105    2013-11-27 04:50:42.0    Yahoo    BE
[wissem@localhost ~]$

Ahora que tenemos los datos bajo HDFS. Vamos a hacer la parte de transformación de los datos.

  • Transformación de los datos en Hadoop:

El objetivo es saber cuántas veces por día los usuarios están activos. Una sentencia SQL parece así:

SELECT /*+PARALLEL(16)*/
COUNT(*) ACTIVES,IP_ADRR AS USER_IP, TO_CHAR(ACTIVE_DATE,'YYYYMMDD') AS DAY
FROM WISSEM.USER_ACTIVITY
GROUP BY IP_ADRR , TO_CHAR(ACTIVE_DATE,  'YYYYMMDD')

Esta consulta podría tardar varios minutos en ejecutarse en una base de datos Oracle. Pero si tenemos miles de miles de millones de registros, la consulta comienza a durar horas ejecutando.  El “Framework” distribuido Hadoop almacenará el archivo de entrada en diferentes bloques (o partes) de tamaños de 64 MB (este es el valor predeterminado) en diferentes servidores del clúster Hadoop. Un Programa Hadoop “Map” se llevará a cabo en cada nodo del clúster Hadoop y un programa “Reduce” tendrá los resultados ordenados desde la fase “Map” y genera un archivo de salida en HDFS. Este proceso garantiza que cada nodo del “Framework” de Hadoop hace el procesamiento de un archivo más pequeño. Todos los nodos del clúster Hadoop trabajando en paralelo darán un archivo de salida. Ahora que hemos explicado cómo funcionará el sistema Hadoop. Vamos a ejecutar un programa de “Map Reduce” con el archivo user_activity.txt. Podemos escribir unas clases de Java para hacer Map reduce pero HiveQL (lenguaje de Hive) también pude ser usado sin la necesidad de escribir líneas de códigos Java.
Primero creamos una tabla HIVE con un separador de campos Tab '\t'

[wissem@localhost ~]$ hive
Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j.properties
Hive history file=/tmp/wissem/hive_job_log_024ccdda-b362-4ef2-9222-2c374dd2ac83_188192255.txt
hive> create table user_Activity (IP_ADRR STRING, ACTIVE_DATE STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
OK
Time taken: 13.84 seconds
hive> show tables user_Activity;
OK
Time taken: 0.235 seconds
hive>

Ahora hemos creado una tabla en HIVE, vamos a llenar la tabla con los datos del archivo user_activity.txt  creado anteriormente.

hive> LOAD DATA INPATH "/user/wissem/USER_ACTIVITY/user_activity.txt"    INTO TABLE user_Activity;
Loading data to table default.user_activity
Table default.user_activity stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 407,raw_data_size: 0]
OK
Time taken: 1.318 seconds
hive> select * from user_activity;
OK
98.245.153.111    2013-11-27 04:49:14.0
65.245.153.105    2013-11-27 04:49:59.0
98.245.153.111    2013-11-27 04:50:14.0
98.245.153.111    2013-11-27 04:50:25.0
98.245.153.111    2013-11-27 04:50:28.0
98.245.153.111    2013-11-27 04:50:30.0
65.245.153.105    2013-11-27 04:50:40.0
65.245.153.105    2013-11-27 04:50:41.0
65.245.153.105    2013-11-27 04:50:42.0
Time taken: 0.541 seconds
hive>

Ahora, vamos a procesar los datos en Hadoop. Usamos la línea de comando “insert OVERWRITE” de HiveQL.
Llamamos 'USER_ACTIVITY_OUT' el directorio de salida del proceso Map Reduce.

hive> INSERT OVERWRITE DIRECTORY 'USER_ACTIVITY_OUT' SELECT COUNT(*), IP_ADRR ,  
SUBSTR(ACTIVE_DATE, 1, 10) FROM USER_ACTIVITY group by IP_ADRR , SUBSTR(ACTIVE_DATE, 1, 10);
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapred.reduce.tasks=<number>
Starting Job = job_201311271428_0003,
Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201311271428_0003
Kill Command = /usr/lib/hadoop/bin/hadoop job  -kill job_201311271428_0003
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2013-11-27 15:32:20,392 Stage-1 map = 0%,  reduce = 0%
2013-11-27 15:32:27,475 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 3.54 sec
2013-11-27 15:32:28,488 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 3.54 sec
2013-11-27 15:32:29,497 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 3.54 sec
2013-11-27 15:32:30,526 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 3.54 sec
2013-11-27 15:32:31,543 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 4.36 sec
2013-11-27 15:32:32,582 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 4.36 sec
MapReduce Total cumulative CPU time: 4 seconds 360 msec
Ended Job = job_201311271428_0003
Moving data to: USER_ACTIVITY_OUT
2 Rows loaded to USER_ACTIVITY_OUT
MapReduce Jobs Launched:
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 4.36 sec   HDFS Read: 634 HDFS Write: 56 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 360 msec
OK
Time taken: 16.466 seconds
hive> quit;

Podemos hacer el monitoreo a partir de la siguiente URL:
http://localhost:50030/jobdetails.jsp?jobid=job_201311271428_0003 



Ahora, podemos comprobar el contenido del archivo de salida.

[wissem@localhost    ~]$ hadoop fs -cat /user/wissem/USER_ACTIVITY_OUT/000000_0
4 65.245.153.105 2013-11-27
5 98.245.153.111 2013-11-27
[wissem@localhost ~]$

  • Cargar los datos desde Hadoop hacia Oracle “Pluggable Database”

Ahora que tenemos los datos en HDFS, vamos a cargar los datos procesados en Oracle. Pero antes tenemos que crear la tabla de destinación en Oracle.

SQL> CREATE TABLE USER_STATS (ACTIVES NUMBER,IP_ADRR VARCHAR2(30),  ACTIVE_DATE VARCHAR2(10));
Table created.

Usamos Sqoop para exportar los datos.

[wissem@localhost    ~]$ sqoop export  --connect  jdbc:oracle:thin:@//sandbox1.xxx.com:1522/orawissPDB  
--export-dir '/user/wissem/USER_ACTIVITY_OUT/000000_0'
--table WISSEM.USER_STATS --fields-terminated-by '\001' --input-null-string
'\\N' --input-null-non-string '\\N'  -m 1  --username WISSEM -P
Warning: /usr/lib/hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Enter password: 13/11/27 15:36:06 INFO manager.SqlManager: Using default fetchSize of 1000 13/11/27 15:36:06 INFO tool.CodeGenTool: Beginning code generation 13/11/27 15:36:09 INFO manager.OracleManager: Time zone has been set to GMT 13/11/27 15:36:10 INFO manager.SqlManager: Executing SQL statement:
SELECT t.* FROM WISSEM.USER_STATS t WHERE 1=0 13/11/27 15:36:11 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/lib/hadoop-0.20-mapreduce 13/11/27 15:36:11 INFO orm.CompilationManager: Found hadoop core jar at:
/usr/lib/hadoop-0.20-mapreduce/hadoop-core.jar Note: /tmp/sqoop-wissem/compile/e49e98500225d2ef01254258389240fd/WISSEM_USER_STATS.java uses or overrides a
deprecated API. Note: Recompile with -Xlint:deprecation for details. 13/11/27 15:36:12 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-wissem/compile/e49e98500225d2ef01254258389240fd/WISSEM.USER_STATS.jar 13/11/27 15:36:12 INFO mapreduce.ExportJobBase: Beginning export of WISSEM.USER_STATS 13/11/27 15:36:13 INFO manager.OracleManager: Time zone has been set to GMT 13/11/27 15:36:14 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 13/11/27 15:36:15 INFO input.FileInputFormat: Total input paths to process : 1 13/11/27 15:36:15 INFO input.FileInputFormat: Total input paths to process : 1 13/11/27 15:36:15 INFO mapred.JobClient: Running job: job_201311271428_0004 13/11/27 15:36:16 INFO mapred.JobClient: map 0% reduce 0% 13/11/27 15:36:23 INFO mapred.JobClient: map 100% reduce 0% 13/11/27 15:36:24 INFO mapred.JobClient: Job complete: job_201311271428_0004 13/11/27 15:36:24 INFO mapred.JobClient: Counters: 24 13/11/27 15:36:24 INFO mapred.JobClient: File System Counters 13/11/27 15:36:24 INFO mapred.JobClient: FILE: Number of bytes read=0 13/11/27 15:36:24 INFO mapred.JobClient: FILE: Number of bytes written=214755 13/11/27 15:36:24 INFO mapred.JobClient: FILE: Number of read operations=0 13/11/27 15:36:24 INFO mapred.JobClient: FILE: Number of large read operations=0 13/11/27 15:36:24 INFO mapred.JobClient: FILE: Number of write operations=0 13/11/27 15:36:24 INFO mapred.JobClient: HDFS: Number of bytes read=202 13/11/27 15:36:24 INFO mapred.JobClient: HDFS: Number of bytes written=0 13/11/27 15:36:24 INFO mapred.JobClient: HDFS: Number of read operations=4 13/11/27 15:36:24 INFO mapred.JobClient: HDFS: Number of large read operations=0 13/11/27 15:36:24 INFO mapred.JobClient: HDFS: Number of write operations=0 13/11/27 15:36:24 INFO mapred.JobClient: Job Counters 13/11/27 15:36:24 INFO mapred.JobClient: Launched map tasks=1 13/11/27 15:36:24 INFO mapred.JobClient: Data-local map tasks=1 13/11/27 15:36:24 INFO mapred.JobClient: Total time spent by all maps in occupied slots (ms)=7608 13/11/27 15:36:24 INFO mapred.JobClient: Total time spent by all reduces in occupied slots (ms)=0 13/11/27 15:36:24 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 13/11/27 15:36:24 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 13/11/27 15:36:24 INFO mapred.JobClient: Map-Reduce Framework 13/11/27 15:36:24 INFO mapred.JobClient: Map input records=2 13/11/27 15:36:24 INFO mapred.JobClient: Map output records=2 13/11/27 15:36:24 INFO mapred.JobClient: Input split bytes=143 13/11/27 15:36:24 INFO mapred.JobClient: Spilled Records=0 13/11/27 15:36:24 INFO mapred.JobClient: CPU time spent (ms)=820 13/11/27 15:36:24 INFO mapred.JobClient: Physical memory (bytes) snapshot=58933248 13/11/27 15:36:24 INFO mapred.JobClient: Virtual memory (bytes) snapshot=388550656 13/11/27 15:36:24 INFO mapred.JobClient: Total committed heap usage (bytes)=15990784 13/11/27 15:36:24 INFO mapreduce.ExportJobBase: Transferred 202 bytes in 10.349 seconds (19.5188 bytes/sec) 13/11/27 15:36:24 INFO mapreduce.ExportJobBase: Exported 2 records. [wissem@localhost ~]$

Comprobamos los datos en la tabla Oracle USER_STATS.

SQL> select * from USER_STATS;

ACTIVES       IP_ADRR                        ACTIVE_DAT
----------    ------------------------------ ----------
4             65.245.153.105                 2013-11-27
5             98.245.153.111                 2013-11-27


Conclusión:

En este artículo hemos visto como Oracle Database y Hadoop trabajan juntos para formar una eficiente arquitectura empresarial para almacenar y procesar datos de grande volumen.

 


Wissem El Khlifi es un Senior DBA con más de 12 años de experiencia, especializado en soluciones RAC & Data Guard. Actualmente trabaja para “Schneider Electric / APC Global operations”. Wissem ha trabajado también para varias empresas internacionales líderes en sectores de Bancas, Telecomunicaciones, Internet y Energía. Wissem fue el primer Oracle ACE en España y es un OCP, OCE DBA.