Pentaho Analysis Services: Cómo instalar Mondrian

Cómo instalar Mondrian

1. Introducción
2. Configuración de los datos de test sobre una base de datos no embebida
   1. Microsoft Access
   2. Otras bases de datos
3. Despliegue y ejecución de una aplicación web con una base de datos no embebida
4. Despliegue y ejecución de una aplicación web con una base de datos embebida
5. Cómo configurar Mondrian como un servidor XML/A
   1. Descripción de las fuentes de datos (datasources) en `datasources.xml`
   2. Configuración de `XmlaServlet` en el archivo `web.xml`
6. Miscelánea
   1. Configuración de `mondrian.properties`
   2. Configuración de la caché
7. Bases de datos compatibles
8. Aspectos de compatibilidad
   1. Weblogic 6.1 y Xerces
   2. Xalan y Tomcat
   3. Log4j y Tomcat

## 1. Introducción

El núcleo de Mondrian es un JAR que actúa como "JDBC para OLAP": proporcionando conexiones y ejecutando consultas SQL contra la base de datos relacional que sirve los datos. Los binarios de Mondrian vienen empaquetados de diferentes maneras:

1. Como un paquete WAR que contiene Jpivot, un framework para trabajo con aplicaciones web y tecnología OLAP, junto con un ejemplo de datos que pueden ser cargados en una base de datos de su elección.
2. Como un paquete WAR que además de contener a Jpivot, incluye una base de datos Derby, con lo que no se requiere ninguna configuración extra, aparte del despliegue sobre el servidor de aplicaciones.

Ambas distribuciones contienen los fuentes de Mondrian. Además, todos los JARs necesarios para la ejecución de Mondrian están incluidos en la distribución, en el directorio WAR /WEB-INF/lib.

A continuación se detallan una serie de indicaciones para realizar la instalación del binario:

1. Instalar Java SDK (1.4.2 o superior).
2. Descargar la última versión del binario de Mondrian: `mondrian-version.zip` desde SourceForge, y descomprímalo.
3. Para la distribución sin datos embebidos, configure la base de datos FoodMart, tal y como se describe en el apartado 2.
4. Configure y ejecute la aplicación web, tal y como se describe en los apartados 3 o 4.

Si su objetivo es desarrollar con Mondrian, existen instrucciones adicionales para el acceso al servidor de control de fuentes Perforce y para compilar el código fuente en the Developer's Guide.

## 2. Configuración de los datos de test sobre una base de datos no embebida

La base de datos 'FoodMart' forma parte de la distribución binaria sin base de datos embebida (non-embedded). Se proporciona en dos formatos: como base de datos Microsoft Access ( `demo/access/MondrianFoodMart.mdb`) y como un script SQL de sentencias de inserción (`demo/FoodMartCreateData.sql`).

Bajo Windows, utilizar la base de datos Access es lo mas sencillo de configurar, ya que sólo es necesario definir una fuente de datos ODBC. Si se quiere probar a utilizar una fuente de datos que no sea Access, o si no está utilizando Windows, será necesario crear una base de datos vacía y cargar sobre la misma los datos proporcionado en el script, utilizando la utilidad MondrianFoodMartLoader.

### 2.1. Microsoft Access

Si está utilizando Windows, utilizar Microsoft Access es la manera más sencilla de configurar la base de datos de prueba. Sólo será necesario configurar una fuente de datos ODBC para los datos de prueba.

La base de datos de pruebe debe ser accesibles para las prueba unitarias si está realizando pruebas con esta base de datos, o cargados en otra base de datos.

Bajo el menú 'Herramientas Administrativas', situado en el Panel de Control de su equipo, haga click sobre 'Orígenes de datos (ODBC)' para abrir el administrados de fuentes de datos ODBC. A continuación cree un DSN de sistema llamado `MondrianFoodMart` apuntando a `MONDRIAN_HOME``/demo/access/MondrianFoodMart.mdb`. (Esto permitirá que Mondrian acceda a los datos utilizando la cadena de conexión JDBC "`jdbc:odbc:MondrianFoodMart`".

### 2.2. Otras bases de datos

Si no utiliza Microsoft Access, utilice la utilidad MondrianFoodMartLoader para crear una base de datos y cargar los datos a partir del script SQL.

#### Sintaxis

> `MondrianFoodMartLoader`
> `[-verbose] [-tables] [-data] [-indexes]`
> `-jdbcDrivers=<jdbcDrivers>`
> `-outputJdbcURL=<jdbcURL>`
> `[ [ [-outputJdbcUser=user] [-outputJdbcPassword=password] [-outputJdbcBatchSize=<batch size>] ]`
> `| -outputDirectory=<directory name>`
> `]`
> `[ [-inputJdbcURL=<jdbcURL> [-inputJdbcUser=user] [-inputJdbcPassword=password] ]`
> `| [-inputFile=<file name>]`
> `]`

#### Options

> Opción | Descripción
> `-verbose` | Modo de eco de pantalla.
> `-tables` | Creación de tablas a través de JDBC, o generación de un fichero con sentencias CREATE TABLE en un directorio de salida para todas las tablas FoodMart, en función de la base de datos de salida. Si no se especifica este parámetro, se asume que las tablas existe y que se borrarán primero de cargar los datos.
> `-data` | Carga de datos desde una entrada (JDBC, fichero con sentencias insert) a uno de salida (JDBC, fichero de sentencias insert). Cualquier dato existente se borrará primero.
> `-indexes` | Crea índice en la salida JDBC, o genera un fichero con sentencias CREATE INDEX en un directorio de salida, para todas las tables de FoodMart, en funcón de la base de datos de salida
> `-jdbcDrivers=<driver list>` | Lista separarada por comas de drivers JDBC necesarios para la conexión con las fuentes de datos origen y destino. Los ficheros JAR que contienen estos drivers deben de estar en el directorio especificado en la variable classpath (argumento `-cp` del comando `java`).
> `-outputJdbcURL=<jdbcURL>` | URL JDBC para la base de datos destino
> `-outputJdbcUser=<user>` | Nombre de usuario de la base de datos destino
> `-outputJdbcPassword=<password>` | Password de la base de datos destino
> `-outputDirectory=<directory name>` | Opcional. Directorio de creación de los scripts de la bases de datos. Las sentencias están el formato adecuado a la base de datos que se indique en outputJdbcURL.
> `-outputJdbcBatchSize=<batch size>` | Tamaño en batch para la salida de las sentencias JDBC INSERT. Por defecto es 50. Si se configura como, El batches de JDBC no se utiliza.
> `-inputJdbcURL=<jdbcURL>` | URL JDBC de la base de datos fuente
> `-inputJdbcUser=<user>` | Nombre de usuario de la base de datos fuente
> `-inputJdbcPassword=<password>` | Password de la base de datos fuente
> `-inputFile=<file name>` | Opcional. Si no hay parámetros relativos a la Base de datos, se assume que los datos vienen de este fichero de sentencias INSERT.

La fuente normal para la utilidad MondrianFoodMartLoader es un script SQL (`[-inputFile=<file name>]` ). Pero si se ha cargado ya datos en una fuente de datos JDBC (como pueda ser Microsoft Access), utilice `-inputJdbcURL` y las opciones relacionadas para copiar datos desde la otra fuente de datos JDBC.

El cargador utiliza el estándar J2SE JDBC, el driver JDBC, y algunas clases fuera del Mondrian que no suponene ficheros JARs adicionales. Ha sido provado contra Oracle, Postgres, MySQL y Microsoft Access.

Si su destino es una base de datos JDBC, deberá crear la base de datos o esquema antes de realizar la carga de datos. Esto es específico para cada base de datos.

Puede ignorar con seguridad las advertencias del log4j:

> `log4j:WARN No appenders could be found for logger (mondrian.rolap.RolapUtil).`
> `log4j:WARN Please initialize the log4j system properly.`

#### Ejemplos

Aquí tiene algunos ejemplos que puede ilustrar la idea genera de cómo invocar a `MondrianFoodMartLoader` . La línea de comandos cambiará dependiendo del sistema operativo, las fuentes y destinos de datos que utilice.

##### Ejemplo 1. Cargando MySQL desde un fichero en Linux

El siguiente ejemplo es una línea de commandos Linux que crea un "schema" para MySQL llamado 'foodmart', y crea las tables FoodMart desde los datos incluidos en los scripts SQL. Primero, crea una base de datos `foodmart` y un usuario `foodmart`:

> `$``mysqladmin create foodmart`
> `$``mysql`
> `mysql> grant all privileges on *.* to 'foodmart'@'localhost' identified by 'foodmart';`
> `Query OK, 0 rows affected (0.00 sec)`
> `mysql>` `quit`
> `Bye`

A continuación carga los datos:

> `$``java -cp "/mondrian/lib/mondrian.jar:/mondrian/lib/log4j-1.2.9.jar:/mondrian/lib/eigenbase-xom.jar:/mondrian/lib/eigenbase-resgen.jar:/mondrian/lib/eigenbase-properties.jar:/usr/local/mysql/mysql-connector-java-3.0.16-ga-bin.jar "`
> `mondrian.test.loader.MondrianFoodMartLoader`
> `-verbose -tables -data -indexes`
> `-jdbcDrivers= com.mysql.jdbc.Driver`
> `-inputFile=/mondrian/demo/FoodMartCreateData.sql`
> `-outputJdbcURL="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart"`

##### Ejemplo 2. Cargando PostgreSQL desde Access en Windows

El siguiente ejemplo es una línea de commandos Windows que crea las tables FoodMart para PostgreSQL desde los datos almacenados en una base de datos Access:

> `C:\mondrian>``java -cp "C:\mondrian\lib\mondrian.jar;C:\mondrian\lib\log4j- 1.2.9.jar;C:\mondrian\lib\eigenbase-xom.jar;C:\mondrian\lib\eigenbase-resgen.jar;C:\mondrian\lib\eigenbase-properties.jar;C:\mondrian\lib\postgres-jdbc.jar"`
> `mondrian.test.loader.MondrianFoodMartLoader`
> `-verbose -tables -data -indexes`
> `-jdbcDrivers="org.postgresql.Driver,sun.jdbc.odbc.JdbcOdbcDriver "`
> `-inputJdbcURL="jdbc:odbc:MondrianFoodMart"`
> `-outputJdbcURL="jdbc:postgresql://localhost/foodmart"`
> `-outputJdbcUser=postgres`
> `-outputJdbcPassword=password`

## 3. Despliegue y ejecución de una aplicación web con una base de datos no embebida

1. Instale Tomcat (version 5.0.25 or superior).
2. Desde el paquete descargado con los binarios, descomprímalos y coloque `lib/mondrian.war` sobre `TOMCAT_HOME``/webapps/mondrian`
3. Abra el fichero mondrian.properties sitado en `TOMCAT_HOME``/webapps/mondrian` y cambia las propiedades `mondrian.jdbcDrivers` para la base de datos que ha configurado anteriormente siguiendo las instrucciones de este documento.
4. Abra el fichero web.xml en `TOMCAT_HOME``/webapps/mondrian/WEB-INF` y personalice las dos cadenas de conexión existentes a la base de datos FoodMart que ha instalado, teniendo en cuenta el tipo de base de datos que ha elegido. Es decir,

   > `Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;`

   Cambiaría a

   > `Provider=mondrian;Jdbc=jdbc:mysql://localhost/foodmart?user=foodmart&#38;password=foodmart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers= com.mysql.jdbc.Driver;`

5. Modigique los ficheros `fourheir.jsp`, `mondrian.jsp`, `colors.jsp` y `arrows.jsp` situados en el directorio `TOMCAT_HOME``/webapps/mondrian/WEB-INF/queries`. Modifique la línea:

   > `<jp:mondrianQuery id="query01" jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver" jdbcUrl="jdbc:odbc:MondrianFoodMart" catalogUri="/WEB-INF/queries/FoodMart.xml">`

   por los mismos parámetros de base de datos para la base de datos FoodMart instalada según las instrucciones. Para el caso de MySQL, deberíamos tener algo del estilo a:

   > `<jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart" catalogUri="/WEB-INF/queries/FoodMart.xml">`

6. Copie los siguiente ficheros:
   - Si es necesario, copie su JAR con el driver JDBC al directorio `TOMCAT_HOME/common/endorsed`
   - Copie `xalan.jar` a `TOMCAT_HOME``/common/endorsed`
7. Inicialize su base de datos si es necesario.
8. Introduzca http://localhost:8080/mondrian en su navegador.

## 4. Despliegue y ejecución de una aplicación web con una base datos embebida

1. Desde el paquete descargado con los binarios, descomprímalos y coloque `lib/mondrian-embedded.war` sobre `TOMCAT_HOME``/webapps/mondrian-embedded`
2. Inicialice Tomcat
3. Introduzca http://localhost:8080/mondrian-embedded en su navegador.

## 5. Cómo configurar Mondrian como un servidor XML/A

Para configurar un servicio XMLA, siga los siguientes pasos.

### 1. Describa las fuentes de datos en el fichero `datasources.xml`

En el directorio WEB-INF de su webapp, cree un fichero `datasources.xml`, con un contenido como el siguiente:

> `<?xml version="1.0"?>
> <DataSources>
> <DataSource>
> <DataSourceName>MondrianFoodMart</DataSourceName>
> <DataSourceDescription>FoodMart 2000 Data Warehouse From MS Analysis Services</DataSourceDescription>
> <URL>http://localhost:8080/mondrian/xmla</URL>
> <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MondrianFoodMart; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
> <ProviderType>MDP</ProviderType>
> <AuthenticationMode>Unauthenticated</AuthenticationMode>
> <Catalogs>
> <Catalog name="FoodMart">
> <Definition>/WEB-INF/schema/FoodMart.xml</Definition>
> </Catalog>
> <Catalog name="Marketing">
> <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:odbc:MarketingDB; JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</DataSourceInfo>
> <Definition>/WEB-INF/schema/Marketing.xml</Definition>
> </Catalog>
> </Catalogs>
> </DataSource>
> <DataSource>
> <DataSourceName>PostgreSQLTest</DataSourceName>
> <DataSourceDescription>Test Data Warehouse On PostgreSQL</DataSourceDescription>
> <URL>http://localhost:8080/mondrian/xmla</URL>
> <DataSourceInfo>Provider=mondrian; Jdbc=jdbc:postgresql://localhost/olap; JdbcDrivers=org.postgresql.Driver; JdbcUser=pgsql; JdbcPassword=pgsql</DataSourceInfo>
> <ProviderName>Mondrian</ProviderName>
> <ProviderType>MDP</ProviderType>
> <AuthenticationMode>Unauthenticated</AuthenticationMode>
> <Catalogs>
> <Catalog name="Test">
> <Definition>/WEB-INF/schema/TestPgsql.xml</Definition>
> <Catalog>
> </Catalogs>
> </DataSource>
> </DataSources>`

`<ProviderType>` y `<AuthenticationMode>` se ignoran ya que la implementación actual de XML/A sólo soporta 'MDP' y 'Unauthenticated'.

#### Múltiples fuentes de datos y catálogos

Si tiene intención de utilizar Mondrian con la librería cliente de Microsoft, ADOMD.NET o Simba's O2X bridge , el fichero de fuentes de datos debe tener específicamente un elemento `<DataSource>` . Estos clientes ignorarán todos las fuentes de datos excepto una. Otros clients XML/A clients, como Rex o Jrubik trabajan con múltiples fuentes de datos.

Nótese que cada catálogo tiene un atributo name, y el URI (path) de un fichero XML schema. El nombre del catálogo debe coincidir con el atributo name del esquema del fichero (por ejemplo `<Schema name="FoodMart">`).

Ya sea, que utilice una fuente de datos o varias, los catálogos en el fichero `datasources.xml` deben contener nombres únicos.

### 2. Configuración de XmlaServlet en el archivo `web.xml`

Por ejemplo:

> `<servlet>`
> `<servlet-name>MondrianXmlaServlet</servlet-name>`
> `<servlet-class>mondrian.xmla.impl.DefaultXmlaServlet</servlet-class>`
> `</servlet>`

## 6. Miscelánea

### 6.1. Configuración de `mondrian.properties`

Las propiedades se describen en la Configuration Guide.

### 6.2. Configuración de la caché

Deberá especificar la cantidad de memoria disponible para la cache utilizando la opción -Xms de la Java VM, por ejemplo -Xms256m para 256 Mb de ram para la JVM.

## 7. Bases de datos compatibles

Se sabe que Mondrian corre sobre las siguiente bases de datos:

1. Apache Derby
2. Firebird
3. hsqldb
4. IBM DB2
5. Microsoft Access
6. Microsoft SQL Server
7. MySQL
8. NuoDB
9. Oracle
10. PostgreSQL
11. Sybase

Mondrian puede trabajar con casi todo tipo de fuentes de datos JDB, incluso si su base de datos no aparece en la lista anterior, del una oportunidad. Mondrian puede de forma genérica conocer las capacidades de la base de datos del driver JDBC, y generar SQL correcto.

Si consigue hacer funcionar Mondrian con otra base de datos, mándenos un email. Háganos llegar el driver que utilice, la versión de su base de datos, configuración de propiedades, y cualquier detalle que haya tenido que considerar.

### General database tips

Para ejemplos de cadenzas de conexión, mire en `mondrian.properties`. Hay ejemplos de cadenas de conexión para muchas bases de datos.

### Sybase

mizar_sf escribe :

> Intenté varias soluciones para conseguir que Mondrian (He utilizado 2.1RC) conectase con un servidor Sybase ASE [version 12.5]. Finalmente encontré las siguientes soluciones:

> - Descargar un driver jdbc3 compliant driver como jtds-1.2.jar desde sourceforge.
> - Colocar el driver en TOMCAT_HOME/common/endorsed
> - En ficheros de configuración como
>   - mondrian/WEB-INF/datasources.xml
>   - mondrian/WEB-INF/web.xml

> Modifiqué la línea de parámetros como sigue:

> `Provider=mondrian;JdbcUser=userName;JdbcPassword=userPass;Jdbc=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:port/dbName;JdbcDrivers= net.sourceforge.jtds.jdbc.Driver;Catalog=/WEB-INF/queries/myCatalog.xml`

> (datasources.xml no necesita ser modificado si solo necesitas probar la base de datos, pero si estás utilizando algo como OPENI hay que modificarlo.)

## 8. Aspectos de Compatibilidad

### 8.1. Weblogic 6.1 y Xerces

Weblogic 6.1 viene con una versión antigua e incompatible de Xerces. El síntoma del error:

>     java.lang.VerifyError: (class: org/eigenbase/xom/wrappers/XercesDOMParser,
>      method: parse signature: (Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)
>      Incompatible object argument for function call
>     at java.lang.Class.forName0
>     (Native Method)
>     at java.lang.Class.forName(Class.java:120)
>     at org.eigenbase.xom.XOMUtil.createDefaultParser(XOMUtil.java:165)
>     at org.eigenbase.resgen.Util.load(Util.java:49)
>     ...

La solución pasa por sustituir `xml-apis.jar` y `xercesImpl.jar` antes de `weblogic.jar` en su class-path.

Generalmente, Mondrian utiliza cualquier parser XML compatible JAXP que proporcione el sistema. Desafortunadamente el analizador de Weblogic no se puede configurar en modo non-validating, y Mondrian lo necesita. Por tanto, en un entorno Weblogic, Mondrian utiliza explícitamenteXerces. Esta nota describe cómo cambiar el analizador XML por defecto del Weblogic's.

### 8.2. JDK, Xalan y Tomcat

Los binarios de Mondrian, tal y como se pueden descargar de la web, necesitan JDK 1.4.x, Xalan 2.6.0, y Tomcat 5.0.25 o superior.

Si está ejecutando JDK 1.3.x, necesitará ficheros JAR exta, porque JDK 1.3 no incluye un parser XML. Copie `xalan.jar` y `xml-apis.jar` a `TOMCAT_HOME` `/common/lib`. (o `TOMCAT_HOME` `/common/endorsed`, si su versión de Tomcat tiene este directorio). Si su configuración es errónea, el error típico es el siguiente:

> `java.lang.VerifyError: Cannot inherit from final class`
> `at java.lang.ClassLoader.defineClass0(Native Method)`
> `at java.lang.ClassLoader.defineClass(ClassLoader.java:502)`
> `at java.security.SecureClassLoader.defineClass(SecureClassLoader.java :123)`
> `at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1664)`
> `at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:953)`
> `at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1394)`
> `at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1274)`
> `at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)`
> `at org.apache.xerces.impl.XMLNSDocumentScannerImpl.createContentDispatcher(Unknown Source)`
> `at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl .<init>(XMLDocumentFragmentScannerImpl.java:249)`
> `at org.apache.xerces.impl.XMLDocumentScannerImpl.<init>(XMLDocumentScannerImpl.java:245)`
> `at org.apache.xerces.impl.XMLNSDocumentScannerImpl .<init>(Unknown Source)`
> `at org.apache.xerces.parsers.IntegratedParserConfiguration.createDocumentScanner(Unknown Source)`
> `at org.apache.xerces.parsers.DTDConfiguration.<init>( DTDConfiguration.java:367)`
> `at org.apache.xerces.parsers.StandardParserConfiguration.<init>(StandardParserConfiguration.java:198)`
> `at org.apache.xerces.parsers.IntegratedParserConfiguration .<init>(Unknown Source)`
> `at org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown Source)`
> `at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)`

Este error aparece con JDK 1.3.1, Tomcat 4.1.18, Xalan 2.4.1. Las posibles soluciones a este error pasan por (a) cambiarse a JDK 1.4 y eliminar `xml-apis.jar` y `xercesImpl.jar` del fichero `mondrian.war`, o (b) volver a Xalan 2.3.1.

### 8.3. Log4j y Tomcat

Los WARs de Mondrian contienen en su distribución una versión de log4j.jar. Esto puede entrar en conflicto con su servidor de aplicaciones, como en el caso de JBoss, y causar errores en el log. Para solucionar esto, elimine log4j.jar del WAR de Mondrian.

Author: Julian Hyde and others; traducido por Félix Alberto Martín, based on install.html#65, 23 August, 2006.
Version: $Id$ (log)
Copyright (C) 2001-2005 Julian Hyde
Copyright (C) 2005-2006 Pentaho and others