Zurück

Pentaho CE 5.4.0.1-130 mit PostgreSQL 9.4 Backend installieren

Um Pentaho in der Community Edition mit anderen Datenbanken wie PostgreSQL zu installieren, bedarf es ein paar Nachjustierungen. Pentaho Enterprise Edition nimmt einem die komplette Handarbeit mit einem freundlichen Wizard ab.

Standardmäßig wird der Pentaho 5 BI Server mit einer HSQL Datenbank geliefert. Das ist schön, um ohne großen Einrichtungsaufwand schnell starten zu können. Für eine Produktionsumgebung wird man die HSQL allerdings durch die eigene Datenbankumgebung der Wahl ersetzen wollen. Für unseren Artikel hier ist das PostgreSQL.

Wir gehen hier davon aus, dass der BI Server auf einem Linux Server installiert werden soll. Prinzipiell müsste der Vorgang unter Windows ähnlich funktionieren.

PostgreSQL installieren

Dieser Schritt hängt von den eigenen Vorlieben und der verwendeten Linux-Distribution ab. Der Einfachkeit halber bauen wir uns hier schnell ein Docker Image.

docker pull postgres:9.4
mkdir -p /root/pentaho-postgres/volumes/data
docker run --detach --name pentaho-postgres --publish 127.0.0.1:5432:5432 --volume /root/pentaho-postgres/volumes/data:/var/lib/postgresql/data --env POSTGRES_PASSWORD=password postgres:9.4

Herunterladen und entpacken der Pentaho Pakete

sudo mkdir /opt/pentaho-5.4.0.1-130
sudo ln -s pentaho-5.4.0.1-130 /opt/pentaho
wget -O biserver-ce-5.4.0.1-130.zip http://sourceforge.net/projects/pentaho/files/Business%20Intelligence%20Server/5.4/biserver-ce-5.4.0.1-130.zip/download
sudo unzip biserver-ce-5.4.0.1-130.zip -d /opt/pentaho-5.4.0.1-130

In neueren Pentaho Versionen entfällt eine Aufgabe, die früher nötig war. Damals musste man jeweils noch die Permissions der mitgelieferten Shell-Skripte anpassen:

# not needed any more, as permissions are packaged into the distribution zip file nowadays
# sudo chmod +x /opt/pentaho/biserver-ce/*.sh

Installieren der aktuellen PostgreSQL JDBC-Treiber

wget https://jdbc.postgresql.org/download/postgresql-9.4-1201.jdbc41.jar
# remove old driver version included in the Pentaho distribution
sudo rm /opt/pentaho/biserver-ce/tomcat/lib/postgresql-9.3-1102-jdbc4.jar
sudo cp postgresql-9.4-1201.jdbc41.jar /opt/pentaho/biserver-ce/tomcat/lib

Anpassen der Datenbank-Installations-Skripte

Auf Anpassungen an den Datenbank-Skripten wird hier verzichtet. Möchte man
  • Datenbank-Namen,
  • Benutzer-Namen,
  • Benutzer-Passwörter
oder andere Details der Postgres-Installation ändern, muss man in diesem Schritt Hand anlegen an den Datenbank-Skripten

${VISUAL} /opt/pentaho/biserver-ce/data/postgresql/create_*.sql
Aber Vorsicht! Änderungen an dieser Stelle wirken sich auf die Config-Felder aus, die wir im folgenden anpassen.

Ausführen der Datenbank-Initialisierung

Die PostgreSQL-Installationsskripte liefert Pentaho im Verzeichnis /opt/pentaho/biserver-ce/data/postgresql mit. Sie lassen sich wie gewohnt mit psql einspielen. Für unsere Docker-Umgebung bedeutet das
docker run --interactive --tty --rm --link pentaho-postgres:postgres --volume /opt/pentaho/biserver-ce/data/postgresql:/tmp/pentaho-postgresql --env PGPASSWORD=password postgres:9.4 bash -c 'exec psql -h "${POSTGRES_PORT_5432_TCP_ADDR}" -p "${POSTGRES_PORT_5432_TCP_PORT}" -U postgres -a -f "/tmp/pentaho-postgresql/create_quartz_postgresql.sql"'
docker run --interactive --tty --rm --link pentaho-postgres:postgres --volume /opt/pentaho/biserver-ce/data/postgresql:/tmp/pentaho-postgresql --env PGPASSWORD=password postgres:9.4 bash -c 'exec psql -h "${POSTGRES_PORT_5432_TCP_ADDR}" -p "${POSTGRES_PORT_5432_TCP_PORT}" -U postgres -a -f "/tmp/pentaho-postgresql/create_repository_postgresql.sql"'
docker run --interactive --tty --rm --link pentaho-postgres:postgres --volume /opt/pentaho/biserver-ce/data/postgresql:/tmp/pentaho-postgresql --env PGPASSWORD=password postgres:9.4 bash -c 'exec psql -h "${POSTGRES_PORT_5432_TCP_ADDR}" -p "${POSTGRES_PORT_5432_TCP_PORT}" -U postgres -a -f "/tmp/pentaho-postgresql/create_jcr_postgresql.sql"'

Anpassen der Pentaho Settings

Als erstes konfigurieren wir die JNDI-Resourcen für die Pentaho Webapp.

cat > /opt/pentaho/biserver-ce/tomcat/webapps/pentaho/META-INF/context.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/pentaho" docbase="webapps/pentaho/">
        <Resource name="jdbc/Hibernate" auth="Container" type="javax.sql.DataSource"
                factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxActive="20" maxIdle="5"
                maxWait="10000" username="hibuser" password="password"
                driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/hibernate"
                validationQuery="select 1" />
                
        <Resource name="jdbc/Quartz" auth="Container" type="javax.sql.DataSource"
                factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxActive="20" maxIdle="5"
                maxWait="10000" username="pentaho_user" password="password"
                driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/quartz"
                validationQuery="select 1"/>

</Context>
EOF

Im nächsten Schritt passen wir die JDBC-Einstellungen für Spring Security an.

cat > /opt/pentaho/biserver-ce/pentaho-solutions/system/applicationContext-spring-security-jdbc.properties <<EOF
# For full set of properties see http://commons.apache.org/proper/commons-dbcp/configuration.html

# Please notice: this is only for Hypersonic. Update this for any other database you are using

# The fully qualified Java class name of the JDBC driver to be used
datasource.driver.classname=org.postgresql.Driver

# The connection URL to be passed to our JDBC driver to establish a connection
datasource.url=jdbc:postgresql://localhost:5432/hibernate

# The connection username to be passed to our JDBC driver to establish a connection
datasource.username=hibuser

# The connection password to be passed to our JDBC driver to establish a connection
datasource.password=password

# The SQL query that will be used to validate connections from this pool before returning them to the caller. 
# This query must be an SELECT statement that returns at least one row.
# HSQLDB: SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
# MySQL, H2, MS-SQL, POSTGRESQL, SQLite: SELECT 1
# ORACLE: SELECT 1 FROM DUAL
datasource.validation.query=SELECT 1

# the maximum number of milliseconds that the pool will wait (when there are no available connections) 
# for a connection to be returned before throwing an exception, or <= 0 to wait indefinitely. Default value is -1
datasource.pool.max.wait=-1

# The maximum number of active connections that can be allocated from this pool at the same time, or negative for no limit. Default value is 8
datasource.pool.max.active=8
 
# The maximum number of connections that can remain idle in the pool, without extra ones being destroyed, or negative for no limit. Default value is 8
datasource.max.idle=4

# The minimum number of active connections that can remain idle in the pool, without extra ones being created when the evictor runs, or 0 to create none. Default value is 0
datasource.min.idle=0
EOF

Der nächste Schritt befasst sich ebenfalls mit Spring Security, aber mit der JDBC-Quelle für alle Module, die Hibernate benutzen.

cat > /opt/pentaho/biserver-ce/pentaho-solutions/system/applicationContext-spring-security-hibernate.properties <<EOF
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/hibernate
jdbc.username=hibuser
jdbc.password=password
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
EOF

Die Hibernate-Konfiguration muss ebenfalls auf PostgreSQL umgebogen werden.

sed -i 's!system/hibernate/hsql.hibernate.cfg.xml!system/hibernate/postgresql.hibernate.cfg.xml!g' /opt/pentaho/biserver-ce/pentaho-solutions/system/hibernate/hibernate-settings.xml

Hat man Usernamen, o.ä. geändert, muss auch noch /opt/pentaho/biserver-ce/pentaho-solutions/system/hibernate/postgresql.hibernate.cfg.xml angefasst werden Nachfolgend werden die JNDI-Konfigurationen für simple-jndi angepasst. Die Demodatenbanken werden in diesem Beispiel einfach deaktiviert.

cat > /opt/pentaho/biserver-ce/pentaho-solutions/system/simple-jndi/jdbc.properties <<EOF
# Copyright 2008 - 2010 Pentaho Corporation.  All rights reserved. 
# This program is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
# Foundation.
#
# You should have received a copy of the GNU Lesser General Public License along with this
# program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
# or from the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
#SampleData/type=javax.sql.DataSource
#SampleData/driver=org.hsqldb.jdbcDriver
#SampleData/url=jdbc:hsqldb:hsql://localhost/sampledata
#SampleData/user=pentaho_user
#SampleData/password=password
Hibernate/type=javax.sql.DataSource
Hibernate/driver=org.postgresql.Driver
Hibernate/url=jdbc:postgresql://localhost:5432/hibernate
Hibernate/user=hibuser
Hibernate/password=password
Quartz/type=javax.sql.DataSource
Quartz/driver=org.postgresql.Driver
Quartz/url=jdbc:postgresql://localhost:5432/quartz
Quartz/user=pentaho_user
Quartz/password=password
#Shark/type=javax.sql.DataSource
#Shark/driver=org.hsqldb.jdbcDriver
#Shark/url=jdbc:hsqldb:hsql://localhost/shark
#Shark/user=sa
#Shark/password=
#SampleDataAdmin/type=javax.sql.DataSource
#SampleDataAdmin/driver=org.hsqldb.jdbcDriver
#SampleDataAdmin/url=jdbc:hsqldb:hsql://localhost/sampledata
#SampleDataAdmin/user=pentaho_admin
#SampleDataAdmin/password=password
EOF

Der PostgreSQLDelegate ist für Quartz bereits voreingestellt. Hier reicht es zu prüfen, dass das auch tatsächlich der Fall ist.

# check for postgresql delegate
grep Delegate /opt/pentaho/biserver-ce/pentaho-solutions/system/quartz/quartz.properties

Nun kommt der schwierigste Teil: Die Jackrabbit-Konfiguration. Hier muss entweder händisch editiert werden oder man verwendet das Patch-Skript, das diesem Blog-Artikel beigefügt ist.

${VISUAL} /opt/pentaho/biserver-ce/pentaho-solutions/system/jackrabbit/repository.xml

Hier muss alles auskommentiert werden, was sich auf die Default Ablage im lokalen Dateisystem bezieht. Stattdessen wird alles einkommentiert, das PostgreSQL als Datenbank verwendet.

...
  -->
  <!-- uncomment PostgreSQL FileSystem section -->
  <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
    <param name="driver" value="org.postgresql.Driver"/>
    <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
    <param name="user" value="jcr_user"/>
    <param name="password" value="password"/>
    <param name="schema" value="postgresql"/>
    <param name="schemaObjectPrefix" value="fs_repos_"/>
  </FileSystem>
  <!--

...

  <!-- comment current FileSystem section -->
  <!--
  <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
     <param name="path" value="${rep.home}/repository"/>
  </FileSystem>
  -->

...

  -->
  <!-- uncomment PostgreSQL DataStore section -->
  <DataStore class="org.apache.jackrabbit.core.data.db.DbDataStore">
    <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
    <param name="driver" value="org.postgresql.Driver"/>
    <param name="user" value="jcr_user"/>
    <param name="password" value="password"/>
    <param name="databaseType" value="postgresql"/>
    <param name="minRecordLength" value="1024"/>
    <param name="maxConnections" value="3"/>
    <param name="copyWhenReading" value="true"/>
    <param name="tablePrefix" value=""/>
    <param name="schemaObjectPrefix" value="ds_repos_"/>
  </DataStore>
  <!--

...

  <!-- comment current DataStore section -->
  <!--
      <DataStore class="org.apache.jackrabbit.core.data.FileDataStore"/>
  -->

...

    --> 
    <!-- uncomment PostgreSQL FileSystem workspace section -->
    <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
      <param name="driver" value="org.postgresql.Driver"/>
      <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
      <param name="user" value="jcr_user"/>
      <param name="password" value="password"/>
      <param name="schema" value="postgresql"/>
      <param name="schemaObjectPrefix" value="fs_ws_"/>
    </FileSystem>
    <!--

...

    <!-- comment FileSystem workspace section -->
    <!--
    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
      <param name="path" value="${wsp.home}"/>
    </FileSystem>
    -->

...

    --> 
    <!-- uncomment PostgreSQL PersistenceManager section -->
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager">
      <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
      <param name="driver" value="org.postgresql.Driver"/>
      <param name="user" value="jcr_user"/>
      <param name="password" value="password"/>
      <param name="schema" value="postgresql"/>
      <param name="schemaObjectPrefix" value="${wsp.name}_pm_ws_"/>
    </PersistenceManager>
    <!--

...

    <!-- comment PersistenceManager section -->
    <!--
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
      <param name="url" value="jdbc:h2:${wsp.home}/db"/>
      <param name="schemaObjectPrefix" value="${wsp.name}_"/>
    </PersistenceManager>
    -->

...


    -->
    <!-- uncomment PostgreSQL FileSystem versioning section -->
    <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
      <param name="driver" value="org.postgresql.Driver"/>
      <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
      <param name="user" value="jcr_user"/>
      <param name="password" value="password"/>
      <param name="schema" value="postgresql"/>
      <param name="schemaObjectPrefix" value="fs_ver_"/>
    </FileSystem>
    <!--

...

    <!-- comment FileSystem versioning section -->
    <!--
    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
      <param name="path" value="${rep.home}/version" />
    </FileSystem>
    -->

...

    -->
    <!-- uncomment PostgreSQL PersistenceManager versioning section -->
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager">
      <param name="url" value="jdbc:postgresql://localhost:5432/jackrabbit"/>
      <param name="driver" value="org.postgresql.Driver"/>
      <param name="user" value="jcr_user"/>
      <param name="password" value="password"/>
      <param name="schema" value="postgresql"/>
      <param name="schemaObjectPrefix" value="pm_ver_"/>
    </PersistenceManager>
    <!--

...

    <!-- comment PersistenceManager versioning section -->
    <!--
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
      <param name="url" value="jdbc:h2:${rep.home}/version/db"/>
      <param name="schemaObjectPrefix" value="version_"/>
    </PersistenceManager>
    -->

...

In der /opt/pentaho/biserver-ce/tomcat/webapps/pentaho/WEB-INF/web.xml muss nun noch die HSQL deaktiviert werden, die per Default bei jedem Tomcat-Start mit anläuft.

...

  <!-- disable HSQL startup by commenting -->
  <!-- [BEGIN HSQLDB DATABASES] -->
  <!--
  <context-param>
    <param-name>hsqldb-databases</param-name>
    <param-value>sampledata@../../data/hsqldb/sampledata,hibernate@../../data/hsqldb/hibernate,quartz@../../data/hsqldb/quartz</param-value>
  </context-param>
  -->
  <!-- [END HSQLDB DATABASES] -->

  <!--  and also  commenting -->
  <!-- [BEGIN HSQLDB STARTER] -->
  <!--
  <listener>
    <listener-class>org.pentaho.platform.web.http.context.HsqldbStartupListener</listener-class>
  </listener>
  -->
  <!-- [END HSQLDB STARTER] -->

...

Abkürzung: Unser Patch

Wer sich die Mühe sparen will, alle oben beschriebenen Änderungen manuell durchzuführen, findet an diesen Blog-Post angehängt einen Patch, der sich wie gewohnt mit patch installieren lässt.

cd /opt/pentaho
patch -p3 < biserver-ce-5.4.0.1-130.postgresql.patch

Bug & Hotfix: Upper case QRTZ table name check

In allen aktuellen Pentaho-Versionen ist ein Bug im Datenbank-Check enthalten, der implizit annimmt, dass es Quartz-Tabellen gibt, die den String QRTZ enthalten. Die Fehlermeldung liest sich in etwa wie

20:30:14,523 ERROR [EmbeddedQuartzSystemListener] EmbeddedQuartzSystemListener.ERROR_0007_SQLERROR
org.postgresql.util.PSQLException: ERROR: syntax error at or near "RUNSCRIPT"
  Position: 1
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:510)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:372)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:300)
        at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
        at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
        at org.pentaho.platform.scheduler2.quartz.EmbeddedQuartzSystemListener.verifyQuartzIsConfigured(EmbeddedQuartzSystemListener.java:176)
        at org.pentaho.platform.scheduler2.quartz.EmbeddedQuartzSystemListener.startup(EmbeddedQuartzSystemListener.java:100)
        at org.pentaho.platform.engine.core.system.PentahoSystem$2.call(PentahoSystem.java:398)
        at org.pentaho.platform.engine.core.system.PentahoSystem$2.call(PentahoSystem.java:389)
        at org.pentaho.platform.engine.core.system.PentahoSystem.runAsSystem(PentahoSystem.java:368)
        at org.pentaho.platform.engine.core.system.PentahoSystem.notifySystemListenersOfStartup(PentahoSystem.java:389)
        at org.pentaho.platform.engine.core.system.PentahoSystem.access$000(PentahoSystem.java:77)
        at org.pentaho.platform.engine.core.system.PentahoSystem$1.call(PentahoSystem.java:326)
        at org.pentaho.platform.engine.core.system.PentahoSystem$1.call(PentahoSystem.java:323)
        at org.pentaho.platform.engine.core.system.PentahoSystem.runAsSystem(PentahoSystem.java:368)
        at org.pentaho.platform.engine.core.system.PentahoSystem.notifySystemListenersOfStartup(PentahoSystem.java:323)
        at org.pentaho.platform.engine.core.system.PentahoSystem.init(PentahoSystem.java:294)
        at org.pentaho.platform.engine.core.system.PentahoSystem.init(PentahoSystem.java:207)
        at org.pentaho.platform.web.http.context.SolutionContextListener.contextInitialized(SolutionContextListener.java:135)

...

Zum Glück handelt es sich um einen reinen Check, der an dieser Stelle stattfindet. Daher kann man problemlos gemäß der Tipps zu diesem Bug im Pentaho Forum eine Dummy-Tabelle hinzufügen, die Pentaho vorgaukelt, dass alles seine Ordnung hat.

cat > /opt/pentaho/biserver-ce/data/postgresql/create_QRTZ.sql <<EOF
\connect quartz pentaho_user

CREATE TABLE "QRTZ"
(
NAME VARCHAR(200) NOT NULL,
PRIMARY KEY (NAME)
);
EOF

docker run --interactive --tty --rm --link pentaho-postgres:postgres --volume /opt/pentaho/biserver-ce/data/postgresql:/tmp/pentaho-postgresql --env PGPASSWORD=password postgres:9.4 bash -c 'exec psql -h "${POSTGRES_PORT_5432_TCP_ADDR}" -p "${POSTGRES_PORT_5432_TCP_PORT}" -U postgres -a -f "/tmp/pentaho-postgresql/create_QRTZ.sql"'

Server starten

Zu guter Letzt kann nun der Tomcat gestartet werden.

cd /opt/pentaho/biserver-ce
./start-pentaho.sh

Sie erreichen den Server nun wie gewohnt unter http://localhost:8080/pentaho.

Quellen

  1. http://www.schenkels.nl/2013/12/how-to-install-and-configure-pentaho-bi-suite-5-ce-ubuntu-12-04-postgresql-9-2/
  2. https://anonymousbi.wordpress.com/2013/12/15/pentaho-bi-server-5-0-1ce-mysql-installation-guide/
  3. http://kirk.webfinish.com/?p=219
  4. http://pablotips.blogspot.de/p/installing-tomcat-and-pentaho.html
Kommentare
Trackback-URL:

Noch keine Kommentare. Seien Sie der Erste.

Ancud IT-Beratung GmbH
Glockenhofstraße 47 
90478 Nürnberg 

Tel.: +49 911 2525 68-0