Consultando Impala y Hive desde Oracle usando un gateway heterogeneo ODBC

Introducción
En estos días la propagación de tecnologías big data a través de las organizaciones se ha convertido en un hecho irrefutable. El problema de integración con sistemas heredados debe ser abordado de alguna manera. Existen varias formas de conectar por ejemplo Oracle u otros sabores de RDBMS con los ecosistemas de big data, métodos como conectores dedicados, ETL, y algunos otros personalizados. El siguiente articulo vamos a demostrar un método simple para conectar y consultar desde una base de datos Oracle directamente hacia Apache Hive y Cloudera Impala utilizando un gateway heterogéneo ODBC. Los gateway heterogéneos fueron desarrollados por Oracle para dirigir y traducir la conectividad directa desde bases de datos non-Oracle hacia bases de datos Oracle. Existen gateways especializados sujetos a licencias y el ODBC genérico que es gratis. El gateway heterogéneo ODBC es un gateway genérico que puede ser utilizado prácticamente con cualquier fuente de datos que provea una funcionalidad de driver ODBC.

Apache Hive es un framework de data warehouse construido sobre Hadoop utilizado principalmente para análisis de datos. Utiliza un lenguaje de consultas llamado HiveQL. Todas las consultas son transformadas en jobs Mapreduce y ejecutados después en Hadoop. Carece de soporte de transacciones y posee varias limitaciones. Para más información sobre Hive puedes visitar https://hive.apache.org.

Cloudera Impala es un framework más elaborado, que ha comenzado a obtener un mayor apoyo y aceptación por mas y más proveedores como Amazon, Oracle, MapR y otros. Es implementado como un Motor de consulta de procesamiento paralelo masivo con compatibilidad con SQL ANSI, ofreciendo baja latencia eliminando las operaciones de Mapreduce. También tiene soporte para diferentes formatos de archivo. Para conocer más sobre Impala puedes visitar
http://www.cloudera.com/documentation/enterprise/latest/topics/impala.html.
Preparación del ambiente
Oracle server 
Sistema Operativo: Oracle Virtual Box corriendo OEL 6.5
Database server: Oracle Enterprise Edition Ver. 12.1.0.2.0
Hostname: Node1
IP address: 192.168.1.20
Cloudera QuickStart
Sistema Operativo: Oracle Virtual Box corriendo CentOS 6.7
Cloudera version: 5.7
Hostname: Cloudera
IP address: 192.168.1.88
Para la instalación del ambiente de Cloudera utilizaremos una imagen de Cloudera Quickstart que puede ser descargada desde http://www.cloudera.com/downloads/quickstart_vms/5-7.html. Las tablas Hive utilizadas en este articulo son creadas de acuerdo al tutorial de Cloudera que podemos encontrar aquí http://www.cloudera.com/developers/get-started-with-hadoop-tutorial/exercise-1.html.
Instalando driver ODBC de Cloudera Hive e Impala
Como prerrequisito para instalar el driver ODBC de Cloudera Hive e Impala necesitamos instalar unixODBC o iODBC. Hemos optado por unixODBC como se muestra:

[root@node1  etc]# yum install unixODBC
  Loaded plugins: refresh-packagekit, security
  ..........................................................................................................
  Setting up Install Process
  Resolving Dependencies
  --> Running transaction check
  --> Package unixODBC.x86_64 0:2.2.14-14.el6 will  be installed
  --> Finished Dependency Resolution
Dependencies Resolved ==================================================================
Package     Arch       Version      Repository     Size ================================================================== Installing: unixODBC    x86_64     2.2.14-14.el6    ol6_latest   377 k
Transaction Summary ================================================================== Install       1 Package(s)
Total download size: 377 k Installed size: 1.1 M Is this ok [y/N]: y Downloading Packages: unixODBC-2.2.14-14.el6.x86_64.rpm  …....................................................................................... A continuación, descarga el driver ODBC de Cloudera Hive desde la siguiente dirección: http://www.cloudera.com/downloads/connectors/hive/odbc/2-5-12.html

Como usuario root ejecuta el siguiente comando para instalar el driver ODBC de Cloudera Hive descargado en el paso anterior:

[root@node1 kit]# rpm -Uhv  ClouderaHiveODBC-2.5.19.1004-1.el6.x86_64.rpm 
  Preparing...                            ###########################################  [100%]
      1:ClouderaHiveODBC        ########################################### [100%]
[root@node1 kit]# 

Descarga el driver ODBC de Cloudera Impala desde la siguiente dirección:
http://www.cloudera.com/downloads/connectors/impala/odbc/2-5-22.html
Como usuario root ejecuta el siguiente comando para instalar el driver ODBC de Cloudera Impala descargado en el paso anterior:

[root@node1 kit]# rpm -Uhv  ClouderaImpalaODBC-2.5.33.1004-1.el6.x86_64.rpm 
  Preparing...                                                             ###################### [100%]
     1:ClouderaImpalaODBC                                   ###################### [100%]
  [root@node1 kit]# 

Configurando el driver ODBC de Clouder Hive
El directorio de instalación del driver estará ubicado en /opt/cloudera/hiveodbc. En el directorio /opt/cloudera/hiveodbc/Setup encontraremos una configuración de ejemplo que podemos utilizar con algunas modificaciones para realizar nuestra instalación. Crea el directorio /usr/local/odbc como usuario root, este directorio será utilizado como ubicación del archivo odbcinst.ini:
 [root@node1 ~]# mkdir -p /usr/local/odbc
Copia el archive odbc.ini en el directorio /home/oracle como se muestra:
[root@node1 Setup]# cp odbc.ini /home/oracle

A continuación, copia el archive cloudera.hiveodbc.ini desde el directorio /opt/cloudera/hiveodbc/lib/64 hacia el directorio /etc como se muestra:
[root@node1 64]# cp cloudera.hiveodbc.ini /etc

A continuación, configuraremos las variables de ambiente para el driver ODBC de Cloudera Hive. Abre el archivo /home/oracle/.bash_profile con algún editor de texto (nosotros utilizaremos vi) y añade las líneas siguientes (marcadas con negrita) como se muestra:
 [oracle@node1 ~]$ vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=ORCL 
export ODBCINI=~/odbc.ini
export ODBCSYSINI=/usr/local/odbc
export CLOUDERAHIVEINI=/etc/cloudera.hiveodbc.ini
PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$LIBRARY_PATH:$ORACLE_HOME/lib
Guarda los cambios en el archivo y ejecuta el comando source para establecer las variables definidas:
 [oracle@node1 ~]$ source .bash_profile
El archivo odbc.ini copiado en /home/oracle contiene dos ejemplos para configuraciones de nombres de fuentes de datos (Data Source Names DSN) para versiones de driver de 32 y 64 bits. Todos los parámetros son explicados con comentarios en los archivos de ejemplo, los comentarios han sido omitidos en la siguiente lista. Para más información sobre estos parámetros puedes ver la guía completa en la siguiente dirección http://www.cloudera.com/documentation/other/connectors/hive-odbc/latest.html.
Cambiaremos solo el valor de host, port y el valor de UID para el driver de 64 bits [Cloudera ODBC Driver for Apache Hive (64-bit) DSN] y renombraremos el data source a HIVEDSN como se muestra:
[HiveDSN]
Description = Cloudera ODBC Driver for Apache Hive (64-bit) DSN
Driver = /opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so
HOST = 192.168.1.88
PORT = 10000
Schema = default
ServiceDiscoveryMode = 0
ZKNamespace =
HiveServerType = 2
AuthMech = 2
ThriftTransport = 1
UseNativeQuery = 0
KrbHostFQDN = [Hive Server 2 Host FQDN]
KrbServiceName = [Hive Server 2 Kerberos service name]
KrbRealm = [Hive Server 2 Kerberos realm]
SSL = 0
TwoWaySSL = 0
ClientCert =
ClientPrivateKey =
ClientPrivateKeyPassword =
UID=cloudera
A continuación, probamos que la conexión sea exitosa:
[oracle@node1  ~]$ isql -v hivedsn 
  +---------------------------------------+
  | Connected!                            |
  |                                       |
  | sql-statement                         |
  | help [tablename]                      |
  | quit                                  |
  |                                       |
  +---------------------------------------+
  SQL>  
Lista las tablas y ejecuta una consulta para contar los valores sobre la tabla orders para asegúrate de que todo esté funcionando correctamente:

SQL>  show tables;
+-----------------------------------+
|tab_name                           |
+-----------------------------------+
| categories                        |
| customers                         |
| departments                       |
| order_items                       |
| orders                            |
| products                          |
+-----------------------------------+
  SQLRowCount returns -1
  6 rows fetched 


  SQL>  select count(*) from orders;
  +---------------------+
  | EXPR_1              |
  +---------------------+
  | 68883               |
  +---------------------+
  SQLRowCount returns -1
  1 rows fetched

Si obtenemos los mismos resultados quiere decir que todo funciona bien.
Configuración de gateway transparente ODBC para el driver ODBC de Cloudera Hive
Dentro del directorio $ORACLE_HOME/hs/admin hemos creado un archive de parámetros llamado initHIVEDSN.ora (hemos utilizado el archive dg4odbc.ini como plantilla) con el siguiente contenido:
[oracle@node1 admin]$ vi initHIVEDSN.ora 
# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
HS_FDS_CONNECT_INFO = "HIVEDSN"
HS_FDS_TRACE_LEVEL = 0
HS_FDS_SHAREABLE_NAME = /opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so
#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/odbc.ini
Nota: el nombre del archive init debe ser init<valor de HS_FDS_CONNECT_INFO>.ora de otra manera la conexión fallara.
Configuracion del Listener
Edita el archivo listener.ora como se muestra a continuación:
[oracle@node1 admin]$ vi /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora 
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
   (SID_LIST =
    (SID_DESC =
     (PROGRAM = dg4odbc)
     (ARGS =  ENVS=LD_LIBRARY_PATH=/opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so)
     (SID_NAME = HIVEDSN)
     (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
    )
   ) 
 LISTENER =
    (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL =  TCP)(HOST = node1)(PORT = 1521))
     )
     (DESCRIPTION =
      (ADDRESS = (PROTOCOL =  IPC)(KEY = EXTPROC1521))
     )
    )
ADR_BASE_LISTENER = /u01/app/oracle
Agrega un servicio de red llamado HIVEDSN en el archivo tnsnames.ora como se muestra:
HIVEDSN  =
   (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521))
     (CONNECT_DATA=(SID=HIVEDSN))
     (HS=OK)
    )
Refresca la configuración del listener con el comando reload:
[oracle@node1 admin]$ lsnrctl reload
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 20-JUN-2016 08:05:57
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node1)(PORT=1521)))
The command completed successfully
[oracle@node1 admin]$
Verifica la disponibilidad de los servicios creados:
[oracle@node1 admin]$ lsnrctl status
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 20-JUN-2016 08:06:32
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node1)(PORT=1521)))
STATUS of the LISTENER
-----------------------------------------------------------------------------------------------------------------------
Alias                           LISTENER
Version                        TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                   19-JUN-2016 08:04:43
Uptime                        1 days 0 hr. 1 min. 49 sec
Trace Level                 off
Security                       ON: Local OS Authentication
SNMP                         OFF
Listener Parameter File   /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/node1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=node1)(PORT=5500))
(Security=(my_wallet_directory=/u01/app/oracle/product/12.1.0/dbhome_1/admin/ORCL/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "HIVEDSN" has 1 instance(s).
  Instance "HIVEDSN", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
Service "ORCLXDB" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully

Mediante el comando tnsping verifica la disponibilidad del servicio HIVEDSN como se muestra:
[oracle@node1 admin]$ tnsping HIVEDSN
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 20-JUN-2016 08:07:56
Copyright (c) 1997, 2014, Oracle.  All rights reserved.
Used parameter files:
/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521)) (CONNECT_DATA=(SID=HIVEDSN)) (HS=OK))
OK (10 msec)

Dentro de la base de datos, crea un Database Link público con las siguientes características:
[oracle@node1 admin]$ sqlplus / as sysdba 
SQL*Plus: Release 12.1.0.2.0 Production on Mon Jun 20 08:09:35 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> create public database link hivedsn connect to cloudera identified by cloudera using 'HIVEDSN';
Database link created.
A continuación, realiza una prueba mediante una consulta para verificar el estado del Database Link:
SQL> select * from customers@hivedsn;
select * from customers@hivedsn
                        *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[Cloudera][ODBC] (11560) Unable to locate SQLGetPrivateProfileString function.
{HY000,NativeErr = 11560}
ORA-02063: preceding 2 lines from HIVEDSN
La función SQLGetPrivateProfileString está contenida y debe exportada desde la librería compartida libodbcinst.so. Por lo que, para resolver este inconveniente necesitamos agregar el path completo (marcado con negrita) dentro del archivo de configuración del driver /etc/cloudera.hiveodbc.ini como se muestra a continuación:
[Driver]
ODBCInstLib=/usr/lib64/libodbcinst.so 
ErrorMessagesPath=/opt/cloudera/hiveodbc/ErrorMessages/
LogLevel=0
LogPath=
SwapFilePath=/tmp
Además, si el driver de Hive ODBC no está enlazado con libodbcinst.so podemos agregar la variable de ambiente LD_PRELOAD al archivo .bash_profile o simplemente crear la variable mediante un comando export:
[oracle@node1 ~]$ export LD_PRELOAD=/usr/lib64/libodbcinst.so
Verifiquemos ahora si libodbcinst.so está cargado:
[oracle@node1 ~]$ ldd /opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so
         linux-vdso.so.1 =>  (0x00007fffad5ff000)
            libdl.so.2 => /lib64/libdl.so.2 (0x00007fd1af2b2000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd1af094000)
            libsasl2.so.2 => /usr/lib64/libsasl2.so.2 (0x00007fd1aee7a000)
            librt.so.1 => /lib64/librt.so.1 (0x00007fd1aec72000)
            libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fd1aea57000)
            libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fd1ae854000)
            libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fd1ae54e000)
            libm.so.6 => /lib64/libm.so.6 (0x00007fd1ae2c9000)
            libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd1ae0b3000)
            libc.so.6 => /lib64/libc.so.6 (0x00007fd1add20000)
            /lib64/ld-linux-x86-64.so.2 (0x00000033a1a00000)
            libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fd1adae8000)
            libfreebl3.so => /lib64/libfreebl3.so (0x00007fd1ad886000)
Vuelve a refrescar el listener, conéctate nuevamente a la base de datos y vuelve a ejecutar la prueba del select:
[oracle@node1 admin]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Mon Jun 20 08:23:36 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> select * from customers@hivedsn;
select * from customers@hivedsn
                        *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[Cloudera][ODBC] (11470) Transactions are not supported. {HYC00,NativeErr =
11470}
ORA-02063: preceding 2 lines from HIVEDSN
Este error se debe a que Hive es un almacén de datos no transaccional, por lo que nuestras operaciones deben ejecutarse en modo de lectura y non-logging. Podemos modificar el comportamiento utilizando el parámetro HS_TRANSACTION_MODEL con el valor READ_ONLY_AUTOCOMMIT. Para más información sobre parámetros: https://docs.oracle.com/database/121/ODBCU/feature.htm#ODBCU763.
Modifica el archivo de parámetros initHIVEDSN.ora y agrega el parámetro HS_TRANSACTION_MODEL como se muestra:
# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
HS_FDS_CONNECT_INFO = "HIVEDSN"
HS_FDS_TRACE_LEVEL = 0
HS_FDS_SHAREABLE_NAME = /opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so
HS_TRANSACTION_MODEL=READ_ONLY_AUTOCOMMIT 
#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/odbc.ini
Guarda los cambios, conéctate de nuevo y reintenta ejecutar la sentencia:
SQL> select * from customers@hivedsn
-------------------------------------------------------------------------------------------
1530 David        Smith          XXXXXXXXX        XXXXXXXXX                   
La conexión y petición de datos ahora debe funcionar correctamente.

Configurando el driver ODBC de Cloudera Impala

El directorio de instalación del driver estará ubicado en /opt/cloudera/impalaodbc. En el directorio /opt/cloudera/impalaodbc/Setup podremos encontrar un ejemplo de archivo de configuración que puede ser usado con algunas modificaciones para realizar nuestra instalación.
Crea el directorio como usuario root /usr/local/odbc como se muestra:
 [root@node1 ~]# mkdir -p /usr/local/odbc
Este directorio será usado como ubicación del archivo odbcinst.ini.
Copia el archive odbc.ini en el directorio /home/oracle como se muestra:
[root@node1 Setup]# cp odbc.ini /home/oracle
A continuación, copia el archive cloudera.impalaodbc.ini desde /opt/cloudera/hiveodbc/lib/64
[root@node1 64]# cp cloudera.impalaodbc.ini /etc
Después, configuraremos las variables de ambiente para el driver ODBC de Clooudera. Modifica el archive .bash_profile para agregar las siguientes variables como se muestra: 
 [oracle@node1 ~]$ vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=ORCL
export ODBCINI=~/odbc.ini
export ODBCSYSINI=/usr/local/odbc
export SIMBAINI=/etc/cloudera.impalaodbc.ini
PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$LIBRARY_PATH:$ORACLE_HOME/lib
Utiliza el comando source para cargar los cambios realizados:
[oracle@node1 ~]$ source .bash_profile
Similar al driver de Hive, el archivo odbc.ini en el directorio /home/oracle contiene dos ejemplos para configuración de DSN para 32 y 64 bits. En nuestro caso vamos a utilizar la versión de 64 bits. Todos los parámetros son explicados con comentarios en el archivo de ejemplo. Para más información sobre los parámetros puedes consultar el manual de configuración e instalación del driver ubicado en http://www.cloudera.com/documentation/other/connectors/impala-odbc/2-5-22.html. Vamos a cambiar solamente los valores de host, port, y renombraremos el data source a IMPLDSN como se muestra:
[ImplDSN]
# Description: DSN Description.
# This key is not necessary and is only to give a description of the data source.
Description=Cloudera ODBC Driver for Impala (64-bit) DSN
# Driver: The location where the ODBC driver is installed to.
Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so
HOST=192.168.1.88
PORT=21050
Database=default
AuthMech=0

Verifica la conexion con el siguiente comando:

[oracle@node1  ~]$ isql -v ImplDSN
  +---------------------------------------+
  | Connected!                            |
  |                                       |
  | sql-statement                         |
  | help [tablename]                      |
  | quit                                  |
  |                                       |
  +---------------------------------------+<
  SQL> 

Lista las tablas y ejecuta una consulta para contar los valores sobre la tabla orders para asegúrate de que todo esté funcionando correctamente:

SQL>  show tables;
+-----------------------------------+
|tab_name                           |
+-----------------------------------+
| categories                        |
| customers                         |
| departments                       |
| order_items                       |
| orders                            |
| products                          |
+-----------------------------------+
  SQLRowCount returns -1
  6  rows fetched

  SQL>  select count(*) from orders;
  +---------------------+
  | EXPR_1               |
  +---------------------+
  | 68883                |
  +---------------------+
  SQLRowCount returns -1
1 rows fetched

Configuración de gateway transparente ODBC para el driver ODBC de Cloudera Impala
Dentro del directorio $ORACLE_HOME/hs/admin vamos a crear un archivo de parámetros llamado initIMPLDSN.ora (utilizamos el archivo dg4odbc.ini como plantilla) con el siguiente contenido:
[oracle@node1 admin]$ vi initHIVEDSN.ora
# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
HS_FDS_CONNECT_INFO = "IMPLDSN"
HS_FDS_TRACE_LEVEL = 0
HS_FDS_SHAREABLE_NAME = /opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so
HS_TRANSACTION_MODEL=READ_ONLY_AUTOCOMMIT
#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/odbc.ini
Nota: el nombre del archivo init debe ser init<valor de HS_FDS_CONNECT_INFO>.ora, de otra manera la conexión fallara.
Agrega la ruta delibodbcinst.so en el archivo de configuración /etc/cloudera.impalaodbc.ini como se muestra:
[Driver]
ODBCInstLib=/usr/lib64/libodbcinst.so
ErrorMessagesPath=/opt/cloudera/impalaodbc/ErrorMessages/
LogLevel=0
LogPath=
SwapFilePath=/tmp
Configuración del Listener
Modifica el archivo listener.ora y agrega el siguiente contenido:
[oracle@node1 admin]$ vi /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora 
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
   (SID_LIST =
    (SID_DESC =
     (PROGRAM = dg4odbc)
     (ARGS =  ENVS=LD_LIBRARY_PATH=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so)
     (SID_NAME = IMPLDSN)
     (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
    )
   ) 
LISTENER =
   (DESCRIPTION_LIST =
    (DESCRIPTION =
     (ADDRESS = (PROTOCOL =  TCP)(HOST = node1)(PORT = 1521))
    )
    (DESCRIPTION =
     (ADDRESS = (PROTOCOL =  IPC)(KEY = EXTPROC1521))
     )
    )
 ADR_BASE_LISTENER = /u01/app/oracle
Agregar un servicio de red en el archivo tnsnames.ora como se muestra:
IMPLDSN  =
   (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521))
    (CONNECT_DATA=(SID=IMPLDSN))
    (HS=OK)
   )
Refresca la configuración del listener:
 [oracle@node1 admin]$ lsnrctl reload
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 20-JUN-2016 08:05:57
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node1)(PORT=1521)))
The command completed successfully
[oracle@node1 admin]$
Verifica la disponibilidad de los servicios:
[oracle@node1 admin]$ lsnrctl status
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 20-JUN-2016 08:06:32
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=node1)(PORT=1521)))
STATUS of the LISTENER
------------------------------------------------------------------------------------------------------------------------
Alias                           LISTENER
Version                        TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                   19-JUN-2016 08:04:43
Uptime                        1 days 0 hr. 1 min. 49 sec
Trace Level                 off
Security                       ON: Local OS Authentication
SNMP                         OFF
Listener Parameter File   /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File             /u01/app/oracle/diag/tnslsnr/node1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=node1)(PORT=5500))
(Security=(my_wallet_directory=/u01/app/oracle/product/12.1.0/dbhome_1/admin/ORCL/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "IMPLDSN" has 1 instance(s).
  Instance "IMPLDSN", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
Service "ORCLXDB" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully

Mediante el comando tnsping verifica la disponibilidad como se muestra:
[oracle@node1 admin]$ tnsping IMPLDSN 
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 20-JUN-2016 08:07:56
Copyright (c) 1997, 2014, Oracle.  All rights reserved.
Used parameter files:
/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=node1)(PORT=1521)) (CONNECT_DATA=(SID=IMPLDSN)) (HS=OK))
OK (10 msec)

Crea un Database Link publicó para establecer una conexión desde Oracle:
 [oracle@node1 admin]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Mon Jun 20 08:09:35 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> create public database link impldsn connect to cloudera identified by cloudera using 'IMPLDSN';
Database link created.
Prueba el Database Link como la siguiente consulta:
SQL> select * from customers@impldsn
-----------------------------------------------------------------------------------
1530 David     Smith              XXXXXXXXX        XXXXXXXXX       
La conexión y petición de datos desde Cloudera Impala funciona correctamente.

Observaciones

Siempre que sea posible utiliza Impala antes que Hive debido a las varias limitaciones en velocidad y sintaxis de esta última. Es posible tener severas diferencias de sintaxis en la forma de consultar datos desde Hive o Impala directamente desde Oracle. Si se deben ejecutar consultas complejas es mejor crear una vista local en Hive o Impala y acceder a esta directamente. Otro beneficio es que esto aprovechara las optimizaciones en consultas en el lado de Impala o Hive.
Un ejemplo, si tratas de ejecutar la siguiente consulta, obtendrás una alerta indicando que la sentencia count dentro de la consulta no es una característica soportada:
SQL> l
1  select c."category_name", count("order_item_quantity") as count
2  from order_items@impaladsn oi
3  inner join products@impaladsn p on oi."order_item_product_id" = p."product_id"
4  inner join categories@impaladsn c on c."category_id" = p."product_category_id"
5  group by c."category_name"
6* order by count("order_item_quantity") desc
SQL> /
select c."category_name", count("order_item_quantity") as count
*
ERROR at line 1:
ORA-02070: database IMPALADSN does not support       in this context
Para resolver este problema, crea una vista dentro de Impala:
[cloudera@quickstart  Desktop]$ impala-shell 
   Starting  Impala Shell without Kerberos authentication
   Connected  to quickstart.cloudera:21000
   Server  version: impalad version 2.5.0-cdh5.7.0 RELEASE (build  ad3f5adabedf56fe6bd9eea39147c067cc552703)
   ***********************************************************************************
   Welcome  to the Impala shell. Copyright (c) 2015 Cloudera, Inc. All rights reserved.
   (Impala  Shell v2.5.0-cdh5.7.0 (ad3f5ad) built on Wed Mar 23 11:33:33 PDT 2016)
   After  running a query, type SUMMARY to see a summary of where time was spent.
   ***********************************************************************************
   [quickstart.cloudera:21000]  >
   create  view summaryvw as -- Most popular product categories
     > select  c.category_name, count(order_item_quantity) as count
      > from order_items  oi
     > inner join  products p on oi.order_item_product_id = p.product_id
     > inner join  categories c on c.category_id = p.product_category_id
     > group by c.category_name
     > order by count  desc
     > limit 10;
   Query: create view summaryvw as -- Most popular  product categories
   select  c.category_name, count(order_item_quantity) as count
   from  order_items oi
   inner  join products p on oi.order_item_product_id = p.product_id
   inner  join categories c on c.category_id = p.product_category_id
   group  by c.category_name
   order  by count desc
   limit  10
Vuelve a ejecutar la consulta, esta vez a través de la vista sumaryvw creada:
  1* select * from summaryvw@impaladsn
SQL> /
category_name                                                                        count
   --------------------------------------------------------------------------------  ----------
   Cleats                                                                            24551
   Men's  Footwear                                                                   22246
   Women's  Apparel                                                                  21035
   Indoor/Outdoor  Games                                                             19298
   Fishing                                                                           17325
   Water  Sports                                                                     15540
   Camping  & Hiking                                                                 13729
   Cardio  Equipment                                                                 12487
   Shop By  Sport                                                                    10984
   Electronics                                                                       3156
10 rows  selected.
Conclusión
En este artículo hemos demostrado como utilizar los drivers ODBC de Cloudera Hive e Impala para conectarnos desde una base de datos Oracle utilizando un gateway heterogéneo ODBC. Este enfoque puede ser de mucha ayuda cuando queremos recuperar pequeñas cantidades de datos utilizando consultas relativamente simples y necesitamos establecer la conexión de manera rápida. También, el método puede ser utilizado para archivar o realizar backups de datos sensibles desde Hive o Impala.

Y V Ravi Kumar, es un Oracle ACE y Oracle Certified Master (OCM) con 17 años de experiencia en BFSI vertical. También es OCP en Oracle 8i, 9i, 10g, 11g y 12c, posee certificaciones en GoldenGate, RAC, Performance Tuning y Oracle Exadata. Constantemente motiva a muchos DBA’s y ayuda a la comunidad Oracle publicando sus consejos/ideas/sugerencias/soluciones en su blog personal. Ha escrito más de 40 artículos sobre Oracle Exadata, Oracle RAC y Oracle GoldenGate para OTN en español, portugués e inglés y 17 artículos para TOAD World, 2 artículos para OKOUG, 3 artículos para OTech Magazine y 2 artículos para Redgate. Es un conferencista Oracle frecuente en @OTN, AIOUG, Sangam y IOUG.
Adrian Neagu, tiene más de 15 años de experiencia como administrador de base de datos, formando una experiencia en varios sistemas RDBMS.  Tiene experiencia en muchas áreas como industria financiera, industria farmacéutica, telecomunicaciones y aviación. Es un Oracle Certified Master 10g and 11g, Oracle Certified Professional 9i, 10g, and 11g, Cloudera Certified Administrator de Apache Hadoop, IBM DB2 Certified Administrator versión 8.1.2 y 9, IBM DB2 9 Advanced Certified Administrator 9, y Sun Certified System Administrator Solaris 10. Es un experto en varias áreas de administración de base de datos, BigData y sistemas operativos incluyendo tuneo de alto desempeño, alta disponibilidad, replicación, backup y recuperación.
Julio Ayapan, Ingeniero en Ciencias y Sistemas, Administrador de base de datos Oracle con más de 4 años de experiencia en proyectos de infraestructura, Bases de Datos Oracle 10g, 11g y 12c sobre Linux y Solaris. Posee la certificación “Oracle Certified Professional 11g y 12c”. Ha sido Conferencista en OTN Tour Latinoamericano 2016 en Guatemala. Es parte de la junta directiva del Grupo de Usuarios Oracle de Guatemala (GOUG). Actualmente es Consultor de Bases de datos Oracle en Nuvola Consulting Group (www.nuvolacg.com). Publica artículos frecuentemente en su blog http://oraclehomegt.blogspot.com. Twitter @jayapangt.
Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.

Comentarios