Anwendung von Pentaho
Transcription
Anwendung von Pentaho
Anwendung der Open Source Business Intelligence Lösung Pentaho am Dienst für elektronische Publikation der Wirtschaftsuniversität Wien (ePub) Application of the Open Source Business Intelligence Platform Pentaho for ePub (the electronic Publication Service of the Vienna University of Economics and Business Administration) Amirian Tadeh (0253821) und Hamm Valentin (0250738) Abteilung für Informationswirtschaft Institut für Informationsverarbeitung und Informationswirtschaft Wirtschaftsuniversität Wien Augasse 2-6 A-1090 Wien, AUSTRIA E-Mail: tadeh.amirian@aon.at valentin.hamm@gmx.at -1- Anwendung der Open Source Business Intelligence Lösung Pentaho am Dienst für elektronische Publikation der Wirtschaftsuniversität Wien (ePub) Application of the Open Source Business Intelligence Platform Pentaho for ePub (the electronic Publication Service of the Vienna University of Economics and Business Administration) Stichworte: Business Intelligence, Pentaho, Data Mining, OLAP, Open Source, ETL Keywords: Business Intelligence, Pentaho, Data Mining, OLAP, Open Source, ETL Zusammenfassung Die vorliegende Arbeit stellt die Ergebnisse des Versuches der Anwendung der Open Source Business Intelligence Plattform Pentaho am Dienst der Wirtschaftsuniversität Wien für elektronische Publikationen dar. Neben einer allgemeinen Einleitung über Business Intelligence Anwendungen, werden weiteres noch die Besonderheiten von Pentaho dargestellt. Mittels Screenshots wird weiters der Import der Daten und die Erstellung von Reports mittels des Pentaho Report Designers erläutert. Den Abschluss der Arbeit liefert eine kurze Analyse der Schwierigkeiten bei der Erstellung dieser Reports und einige Handlungsempfehlungen für den Dienst der elektronischen Publikationen an der Wirtschaftsuniversität Wien. Abstract This paper describes the results from an empirical study application the open source business intelligence platform Pentaho for ePub, which is the electronic publication service of the Vienna University of Economics and Business Administration. Since Pentaho is an open source application, we are presenting a short overview of the development of Open Source Application, especially in the field of Business Intelligence. Furthermore this paper tries to outline the special advantages of Pentaho. To sum up, the paper is going to discuss some difficulties importing the necessary data and designing the reports. -2- Inhaltsverzeichnis 1 ABBILDUNGSVERZEICHNIS .................................................................................................................4 2 EINLEITUNG..............................................................................................................................................5 3 BUSINESS INTELLIGENCE ....................................................................................................................6 4 OPEN SOURCE.......................................................................................................................................11 4.1 GESCHICHTE VON OPEN SOURCE 11 4.2 OPEN SOURCE DEFINITION 12 4.3 ARTEN VON OPEN SOURCE LIZENZEN 14 5 OPEN SOURCE LÖSUNGEN IM BUSINESS INTELLIGENCE BEREICH ......................................16 6 PENTAHO ................................................................................................................................................18 6.1 VORTEILE VON PENTAHO 23 7 TECHNISCHES UMFELD FÜR DIE PROJEKTUMSETZUNG ..........................................................24 8 SCHWIERIGKEITEN BEIM IMPORTIEREN DER DATEN IN DIE MYSQL-DATENBANK ............25 9 PROBLEME BEIM ERSTELLEN DER REPORTS MIT DEM PENTAHO REPORTDESIGNER (INKL. WIZARD).............................................................................................................................................27 10 DAS ERSTELLEN EINES REPORTS (SCREENSHOTS)................................................................31 11 FAZIT......................................................................................................................................................46 12 ANHANG ................................................................................................................................................47 13 LITERATUR ...........................................................................................................................................59 -3- 1 Abbildungsverzeichnis Abbildung 1: Pentaho Server Architektur (Quelle: www.pentaho.org)......................... 21 Abbildung 2: Fehlermmeldung („Interner Fehler aufgetreten“)....................................... 29 Abbildung 3: Hinzufügen der Datenquelle ......................................................................... 31 Abbildung 4: 1. Schritt der Report-Erstellung.................................................................... 32 Abbildung 5: Auswahl der Datenquelle .............................................................................. 33 Abbildung 6: Bearbeitung der Verbindung zur Datenquelle ........................................... 33 Abbildung 7: Gestaltungs- und Gruppierungsmöglichkeiten .......................................... 34 Abbildung 8: Weitere Auswahlmöglichkeiten zur Gruppierung ...................................... 35 Abbildung 9: Formatierungsmöglichkeiten ........................................................................ 36 Abbildung 10: Feintuning...................................................................................................... 37 Abbildung 11: Integration eines Charts.............................................................................. 38 Abbildung 12: Vorschau des ReportDesigners................................................................. 39 Abbildung 13: Entwurfsansicht des ReportDesigners ..................................................... 40 Abbildung 14: Nutzungs-Stärkster Tag der Woche.......................................................... 41 Abbildung 15: Meistaufgerufene WorkingPapers gruppiert nach Institut ..................... 42 Abbildung 16: Anteile der verschiedenen Sprachen an den Workingpapers .............. 43 Abbildung 17: Meistgesuchten Stichwörter ....................................................................... 44 -4- 2 Einleitung Die Menge der Informationen die heutzutage in der Wissenschaft, der Wirtschaft und der Industrie gespeichert werden, nimmt immer mehr und immer schneller zu. Gleichzeitig weitet sich das Spektrum von selbstverständlichen Daten bis hin zu komplexen Themen wie Kundenverhalten aus. Diese Daten sind einerseits wichtig, um den Erfolg der Unternehmung zu analysieren, andererseits können in diesen Daten wichtige Informationen versteckt sein, die auf den ersten Blick nicht ersichtlich sind und die erst extrahiert werden müssen. Um diese versteckten Informationen aufzudecken und den Erfolg der Unternehmen darzustellen, bedient man sich einer Technologie, die sich „Business Intelligence“ nennt. Diese Business Intelligence Systeme bieten die Möglichkeit, um Berichte zu erstellen, die Daten dynamisch zu analysieren oder neue Informationen zu gewinnen. Das Ziel der folgenden Arbeit war es, das Open Source Business Intelligence System „Pentaho“, für einen Probedatensatz, der Seite für elektronische Publikationen der Wirtschaftsuniversität Wien (ePubwu) anzuwenden und die Arbeitsschritte, Schwierigkeiten, Vorteile und den Aufwand zu dokumentieren. ePubwu steht für elektronische Publikationen der Wirtschaftsuniversität Wien und ist die Plattform für forschungsbezogene Wirtschaftsuniversität. -5- elektronische Dokumente der 3 Business Intelligence Business Intelligence bezeichnet den analytischen Prozess, der fragmentierte – Unternehmens- und Wettbewerbsdaten in handlungsgerichtetes Wissen über die Fähigkeiten, Positionen, Handlungen und Ziele der betrachteten internen oder externen Handlungsfelder (Akteure und Prozesse) transformiert (KöMa02). Mit anderen Worten werden unter Business Intelligence im Allgemeinen die analytischen Konzepte, Prozesse und Werkzeuge zusammengefasst, deren Ziel es ist, aus vorhandenen Daten neues Wissen zu erlangen. Dieses wird dann im betriebswirtschaftlichen Bereich für Entscheidungen herangezogen oder im wissenschaftlichen Bereich um empirisch ermittelte Daten zu interpretieren. Dabei werden Business Intelligence Systeme aus mehreren Bestandteilen aufgebaut (Moni05): • Datenquellen • Arbeitsbereich • Basisdatenbank • Data Warehouse / Data Marts • Analyse Das Business Intelligence System holt sich die Daten aus unternehmensinternen oder –externen Datenquellen. (KöMa02) Diese können z.B. relationale Datenbanken oder Log-Dateien sein. Die Datenquellen sind aber kein Bestandteil des Business Intelligence Systems. Bevor die Daten dann zur Analyse in die Basisdatenbank eingespeichert werden, werden sie zur Überarbeitung im Arbeitsbereich gespeichert. Für diese Vorgänge sind die ETL – Komponenten verantwortlich (Extraktion, Transformation, Laden). Die Daten werden auf Fehler untersucht und korrigiert. (RuJo03) Die Transformation von Daten kann mehrer Schritte beinhalten: Während diesem Vorgang können beispielsweise Duplikate entfernt werden, Werte aus den Daten -6- hergeleitet oder fehlende Werte mit Hilfe von Regeln ergänzt und wieder hergestellt werden (DaWa07). • Unter Filterung werden die Extraktion aus den operativen Daten sowie die Bereinigung syntaktischer oder inhaltlicher Fehler in den zu verarbeitenden Daten verstanden. • Die Harmonisierung bezeichnet den Prozess der syntaktischen und betriebswirtschaftlichen Abstimmung der Daten. • Die Aggregation ist die Verdichtung gefilterter und harmonisierter Daten. • Als Anreicherung wird die Bildung und Speicherung betriebswirtschaftlicher Kenngrößen aus gefilterten und harmonisierten Daten bezeichnet. Die bereinigten Daten werden nun in die Basisdatenbank gespeichert, von wo sie dann im Rahmen des Data Warehouses aus ihr wieder verdichtet werden können. Bei der Analyse der Daten werden häufig drei Analyseverfahren unterschieden (PrTo06): • Data Access • Online Analytical Processing (OLAP) • Data Mining Beim Data Access beschränkt sich die Analyse der Daten nur auf das Lesen der Daten und der Repräsentation. Die Ergebnisse werden dann in Form von Reports und Auswertungen dargestellt. Ein häufig genutztes Tool sind Dashboards oder Ampelfunktionen. Hier werden Grenzwerte angegeben, die festlegen ab welchem Bereich sich der Wert im grünen, gelben oder roten Bereich befindet. Diese Darstellung erfreut sich großer Beliebtheit, da die Ergebnisse visuell ansprechend aufbereitet werden. Bei Tools, die die OLAP (Online Analytical Processing) - Analyse unterstützen, müssen Anfangs alle Kriterien definiert werden. Anschließend lassen sich mit Pivotierung unter anderem die Reihenfolge der Spalten, sowie den aktuellen -7- Ausschnitt des so genannten OLAP-Würfels verändern. Als OLAP-Systeme werden also analytische Tools zur Auswertung von multidimensionalen Datenmodellen auf das Unternehmen verstanden (PaKa06). Die OLAP-Anwendungen sind die am weitesten verbreiteten Analyseinstrumente zur Zeit. Sie ermöglichen dem Benutzer Daten innerhalb eines multidimensionalen Modells zu untersuchen, analysieren und Daten zusammenzufassen. Ein multidimensionales Modell stellt beispielsweise Messwerte sowie auch die entsprechenden Messdimensionen, in einem einzigen Modell zur Verfügung (RüWo05). Da in einem solchen Modell die Daten optimal strukturiert sind wird die Anfragezeit erheblich verkürzt. Anwender geschäftsrelevante Analysen online, OLAP erlaubt dem ohne großem wird erhöht, Zeitaufwand durchzuführen. Zu den Standard – OLAP – Operationen zählen: • Drill-Down: Detailierungsgrad der Daten wobei die Dimensionalität der ursprünglichen OLAP-Abfrage erhalten bleibt. • Roll-Up: (Inverse Operation zum Drill-Down) Der Detailierungsgrad der Daten entlang einer Dimension wird dabei verringert (PaKa06). • Pivoting: Pivoting ist das virtuelle Drehen des Data Cube bzw. das Betrachten der Berichtsdaten aus unterschiedlichen Perspektiven. Die Reihenfolge der aktuell dargestellten Dimensionen wird vertauscht. Die Dimensionalität der ursprünglichen OLAP-Abfrage bleibt erhalten. • Slicing: Slicing kann man sich als Abschneiden einer der Scheiben des Data Cube vorstellen, womit die Dimensionen der ursprünglichen OLAP-Abfrage um eine Dimension verringert wird (PrTo06). • Dicing: Dicing ist dagegen das Herausschneiden (-greifen) eines Unterdatenwürfels. Beim Ausschneiden eines Teiles aus dem bestehenden Data Cube (ein Filter wird über den Cube gelegt) bleibt die Dimensionalität der ursprünglichen OLAP-Abfrage erhalten, aber die dargestellten Elemente der Hierarchieobjekte werden verändert. Unter dem Data Mining werden Analyseverfahren zusammengefasst, die versuchen aus vorhandenen Informationen, neue Informationen zu extrahieren. Dieses -8- Analyseverfahren unbekannten beschreibt die Zusammenhängen weitgehend und Trends hypothesenfreie in großen Suche nach Datenpools, Data Warehouses oder dem OLAP-Modell. Diese Anwendungen haben also zum Ziel, Muster innerhalb strukturierter Daten zu finden und anzuzeigen. Um dies zu erreichen gibt es mehrere Möglichkeiten (GaJa05). Text Mining Text Mining ist die Fortschreibung der Grundidee des Data Mining auf unstrukturierte Textdokumente (Zeitungstexte, Patente, Gerichtsurteile, Buchreferenzen). Es verfolgt die Ziele, einen Überblick der Inhalte großer Dokumentenkollektionen zu liefern, Gemeinsamkeiten zu identifizieren, eine schnelle Informationsaufnahme zu ermöglichen und ähnliche Texte leichter zu finden. Die Hauptfunktion des Text Mining sind die Klassifikation und Gruppierung (Segmentierung, Clustering) von Dokumente, Informationsextraktion sowie automatische Textzusammenfassungen (ScTo06). Web Mining Aus der zunehmenden Komplexität des World Wide Web resultiert der wachsende Bedarf an weiterführenden Analysen, die den Inhalt und die Struktur des World Wide Web bzw. einzelner Websites sowie das Verhalten der Internetnutzer zum Gegenstand haben. Dies ist Aufgabe des Web Mining, das sich beim verwendeten und bei der Vorgehensweise an die Ansätze des Data Mining und Text Mining an lehnt. Die Aufgabenbereiche des Web Mining lassen sich in drei Kategorien unterteilen (ScTo06): • Web Content Mining befasst sich mit der inhaltlichen Analyse von Webseiten. Hierbei bedient es sich häufig Ansätzen des Text Mining, um in den Dokumenten Muster zu finden bzw. die Dokumente zu klassifizieren und zu gruppieren. • Web Structure Mining versucht die Topologie zwischen den Hyperlinks des World Wide Webs aufzudecken (Internet Dokumentstruktur) • Web Usage Mining analysiert das Verhalten einzelner Nutzer(Gruppen) auf Basis dieser Logfiles (GaJa05). -9- Prozessorientierte Betrachtung von Business Intelligence Business Intelligence lässt sich grundsätzlich in drei Phasen einteilen (WoUl03): 1. Phase: Innerhalb der Business Intelligence bildet die Aufbereitung und Bereitstellung von Informationen den ersten Schritt, wobei fragmentierte Informationen aus internen Entscheidungsprozesse und zielgerichtet externen Datenquellen zusammengeführt für werden. Insbesondere Data Warehouse und Wissensmanagementsysteme dienen als optimale Quellen. 2. Phase: Die Daten müssen dann je nach Zielsetzung und Anwendungsbereich in einem zweiten Schritt einer Analyse unterzogen werden. Hierzu werden zum Beispiel multidimensionale Verfahren und Tools wie OLAP oder das Data Mining herangezogen. Oft entstehen auch eigene analytische Anwendungssysteme wie Customer Relationship Intelligence oder Supply Chain Intelligence, die sich auf einzelne Schwerpunkte des Unternehmens konzentrieren. Neben den standardisierten Abfragemöglichkeiten ermöglichen derartige Systeme rechtzeitig erreignisgesteurte Warnmeldungen zu erkennen (z.B. bei der Überschreitung von Planwerten). 3. Phase: In einem dritten Schritt sind dann – basierend auf den Ergebnissen der Analyse – Maßnahmen festzulegen und auszuführen. Viele Systeme liefern diesbezüglich Entscheidungsunterstützende Vorschläge die von Menschen oder automatisiert (z.B. durch Wordklfow-Management-Systeme) über einen adäquaten Kommunikationskanal übermittelt werden (RuJo07). Wenn dabei Intra- oder Internet verwendet wird, spricht man auch oft von EBusiness-Intelligence (WoUl03). - 10 - 4 Open Source 4.1 Geschichte von Open Source Die Idee von Open Source hat die Softwareindustrie revolutioniert wie kaum eine Idee zuvor. Heute gelten viele Open Source Produkte als ernstzunehmende Konkurrenz für kommerzielle Lösungen. Die Kernidee hinter Open Source ist nicht neu, doch stellt sich die Sinnhaftigkeit dieser Projekte aus der Sicht des Shareholder Values in Frage. „Open Source wird oft als Angriff gegen die kommerzielle Welt dargestellt. Die Idee von Open Source kann jedoch durchaus einen Segen für kommerzielle Firmen bedeuten. Die gemeinschaftliche Entwicklung von Produkten spart Ressourcen und erlaubt flexible Weiterentwicklung der Technologie.“ (WiCh06) Open Source untereinander ermöglicht eine und ihren mit Art der Zusammenarbeit Kunden, die zwischen ökonomisch trotz Firmen höherer Transaktionskosten und Koordinierungskosten sinnvoll ist, da der Gesamtnutzen größer ist als die entstehenden Kosten. Dabei verhindert Open Source durch seine Offenheit effizient das Entstehen wohlfahrtsschädlicher Monopole und verlagert Wohlfahrtsgewinne von den Produzenten zu den Konsumenten. Die ökonomische Sinnhaftigkeit von Open Source zeigt, dass ‚Kooperation und Wettbewerb sich nicht prinzipiell ausschließen (LuBe04). In der Tat sind heutzutage kommerzielle und häufig börsennotierte Firmen die wohl wichtigsten Antriebsfedern hinter vielen bedeutenden Open Source Projekten wie Linux, Eclipse oder OpenOffice. RedHat, IBM und SUN sind nur drei der offensichtlicheren Beispiele für Firmen, die erhebliche Ressourcen für Software-Entwicklung aufwenden und es dennoch schaffen, von ihrem Einsatz nachhaltig zu profitieren (WiCh06). Während manche Analytiker Open Source primär als soziales und softwaretechnisches Phänomen und dementsprechenden Forschungsgegenstand auffassen, gibt es Meinungen die ganz andere Punkte als die eigentlich revolutionären hervorheben: Verkauf, Vertrieb und Marketing. - 11 - „Bei Open Source geht es darum, die Verbreitung eines Produktes zu maximieren, es über Firewalls und Bürokratien hinweg in die Händler von Anwendern und Entwicklern zu bekommen, sodass dieses es ausprobieren können. Später können sie dann auf den Anbieter zurückkommen, etwa für Dienstleistungen oder Supportverträge.“ (PlDa02) Open Source ist also nicht nur eine bestimmte Art und Weise Software gemeinschaftlich zu entwickeln, sondern auch, dieses zu vermarkten. Dabei kann man das Wort Marketing durchaus in einem äußerst positiven Sinne betrachten (WiCh06). Open Source steigert nicht nur die Möglichkeiten für Anwender, sich und ihrer Arbeit in die Entwicklung von Software einzubringen und zu helfen sie weiterzuentwickeln und zu verbessern, sondern auch, ihre Ideen und Wünsche in die entstehenden Produkte einzubringen. Es gibt Unternehmen also eine sehr effektive und kostengünstige Möglichkeit ihre Kunden besser zu verstehen. Dafür müssen jedoch entsprechende Strukturen und Prozesse geschaffen und professionell gehandhabt werden. Die Geschichte von Open Source handelt primär vom kreativen Umgang mit geistigem Eigentum und der Durchsetzung eines ungewohnten Produktions-, Konsumtions-, und Kooperationsmodus in der Gesellschaft (LuBe04). 4.2 Open Source Definition Software fällt unter die Kategorie Open Source, wenn folgende Kriterien erfüllt sind (KoSt04): Freie Wiedergabe Die Lizenz darf niemanden in seinem Recht einschränken, die Software als Teil eines Software-Paketes, das Programme unterschiedlichen Ursprungs enthält, zu verschenken oder zu verkaufen. Die Lizenz darf für den Fall eines solchen Verkaufs keine Lizenz- oder sonstigen Gebühren festschreiben. - 12 - Quellcode Das Programm muss den Quellcode beinhalten. Die Wiedergabe muss sowohl für den Quellcode als auch für die kompilierte Form zulässig sein. Wenn das Programm in irgendeiner Form ohne Quellcode weitergegeben wird, so muss es eine allgemein bekannte Möglichkeit geben, den Quellcode zum Selbstkostenpreis zu bekommen. Der Quellcode soll die Form eines Programms sein, die ein Programmierer vorzugsweise bearbeitet. Absichtlich unverständlich geschriebener Quellcode ist daher nicht zulässig. Zwischenformen des Codes, so wie sie etwa ein Präprozessor oder ein Konvertor erzeugt, sind unzulässig. Abgeleitete Software Die Lizenz muss Veränderungen und Derivate zulassen. Außerdem muss sie es zulassen, dass die solcherart entstandenen Programme unter denselben Lizenzbestimmungen weiterverttrieben werden können wie die Ausgangssoftware. Unversehrtheit des Quellcodes des Autors Die Lizenz darf die Möglichkeit den Quellcode in veränderter Form weiterzugeben, nur dann einschränken, wenn sie vorsieht dass zusammen mit dem Quellcode so genannte Patch Files weitergegeben werden dürfen, die den Programmcode bei der Kompilierung verändern. Die Lizenz, muss die Weitergabe von Software, die aus verändertem Quellcode entstanden ist, ausdrücklich erlauben. Die Lizenz kann verlangen, dass die abgeleiteten Programme einen anderen Namen oder eine andere Versionsnummer als die Ausgangssoftware tragen. Keine Diskriminierung von Personen oder Gruppen Die Lizenz darf niemanden benachteiligen. Keine Einschränkung bezüglich des Einsatzfeldes Die Lizenz darf niemanden daran hindern das Programm in einem bestimmten Bereich einzusetzen. Beispielsweise darf sie den Einsatz des Programms in einem Geschäft oder in der Genforschung nicht ausschließen. - 13 - Weitergabe der Lizenz Die Rechte an einem Programm müssen auf alle Personen übergehen, die diese Software erhalten, ohne dass für diese die Notwendigkeit bestünde, eine eigene, zusätzliche Lizenz zu erwerben. Die Lizenz darf nicht auf ein bestimmtes Produktpaket beschränkt sein Die Rechte an dem Programm dürfen nicht davon abhängig sein, ob das Programm Teil eines bestimmten Software-Paketes ist. Wenn das Programm aus dem Paket Herausgenommen und im Rahmen der zu diesem Programm gehörenden Lizenz benutzt oder weiter gegeben wird, so sollen alle Personen, die dieses Programm dann erhalten, alle Rechte daran haben, die auch in Verbindung mit dem ursprünglichen Software-Paket gewährt wurden. Die Lizenz darf die Weitergabe zusammen mit anderer Software nicht einschränken Die Lizenz darf keine Einschränkungen enthalten bezüglich anderer Software, die Zusammen mit der lizenzierten Software weitergegeben wird. So darf die Lizenz z. B. nicht verlangen, dass alle anderen Programme, die auf dem gleichen Medium weitergegeben werden, auch quelloffen sein müssen. Die Lizenz muss Technologie-neutral sein Keine Vorschrift der Lizenz darf sich auf eine einzigartige Technologie oder ein e individuelle Benutzerschnittstelle beziehen. 4.3 Arten von Open Source Lizenzen Die Open Source Initiative, Inc. (OSI) hat bis heute knapp 60 Lizenzen als definitionskonform bestätigt. Alle bis heute anerkannten Lizenzen lassen sich vereinfacht in drei Kategorien einteilen. Abgrenzungskriterium ist eine Lizenzbedingung, welche unter dem Begriff des «Copyleft» bekannt geworden ist. Über diese Bedingung stellt der Lizenzgeber sicher, dass veränderte Versionen des Lizenzgegenstands unter denselben Bedingungen verbreitet werden. Die bekannteste Lizenz mit Copyleft ist die GNU General Public License (GPL), jene ohne Copyleft die BSD Lizenz, benannt nach der Berkely Software Distribution. In - 14 - der Regel führt eine sog. Copyleft-Lizenz dazu, dass der Einbezug des davon betroffenen Softwarecodes in ein eigenes Programm zwar zulässig ist, dass das erweiterte Programmpaket aber nur unter derselben Lizenz weiterverbreitet werden darf. Differenzierungen sind zwar möglich, führen aber nicht immer zu eindeutigen Resultaten. Neben den Lizenzen mit Copyleft (GPL-artige) und solchen ohne Copyleft (BSDartige) gibt es Zwischenformen, welche für direkte Weiterentwicklungen des lizenzierten Softwarecodes zwar das Copyleftprinzip vorsehen, den Einbezug in Distributionen aber weitgehend erlauben. Für diese Kategorie scheint die Bezeichnung «Copyleft-light» passend. Als Beispiel können die GNU Lesser General Public License (L-GPL) oder die Mozilla Public License (MPL) angeführt werden (WiCh06). - 15 - 5 Open Source Lösungen im Business Intelligence Bereich Dem generellen Trend folgend, sind nun auch im Business Intelligence Bereich, Open-Source-Lösungen im Vormarsch. Traditionell war Business Intelligence die Domäne von Firmen wie Business Objects, Cognos, SAS und SAP, da komplexe Software-Pakete hinter diesen Lösungen standen. Unter dem Begriff Business Inteligence werden Techniken wie Datawarehousing, Datamining, Analyse und Reporting zusammengefasst, mit denen Unternehmen versuchen, ihre Geschäftsabläufe und Kontakte zu Kunden, Lieferanten und Partnern zu optimieren. Bei all diesen Funktionen stehen die Sammlung, Speicherung, Auswertung und Aufbereitung von Daten im Vordergrund. Aus riesigen, oft unstrukturierten Datenmengen lassen sich mittels geeigneter Software strategische Erkenntnisse gewinnen, Trends ableiten und Zielrichtungen definieren (RuJo07). Nachdem die komplexen Techniken im Rahmen eines Kompletpakets von kommerziellen Firmen angeboten wurden, konnten sich Open-Source-Lösungen erst an das Thema Business Intelligence heranwagen, nachdem die einzelnen Komponenten ebenso als quelloffene Varianten zur Verfügung standen. So stehen beispielsweise für das verwalten der Datenmassen, quelloffene Datenbanken wie MySQL und PostgreSQL als Datenspeicher für das Datawarehousing zur Verfügung. Um die oft aus verschiedenen Quellen stammenden Daten in das richtige Format zu bringen und in das Datawarehouse zu befördern, kommt ein Verfahren zum Einsatz das sich Extraction, Transformation & Loading (ETL) nennt. Unter den diversen Open-Source-Projekten, die sich dieser Aufgabe widmen, sind das belgische Tool Kettle und das CloverETL-Framework (RuJo03). Sind die Daten einmal in das System eingespeist, gilt es, sie zu analysieren und miteinander in Bezug zu setzen, um implizite Strukturen erkennen zu können – ein Prozess der auch unter dem Begriff Data Mining bekannt ist. Aus sonst unüberschaubaren Datenbeständen lassen sich durch automatisierte Auswertungen - 16 - potenziell nützliche Informationen destillieren. Eine Methode die in diesem Zusammenhang häufig zum Einsatz kommt ist OLAP. Das Akronym steht für On Line Analytical Processing und beschreibt ein Verfahren, zuvor entwickelte Hypothesen durch eine multidimensionale Analyse der Daten auf ihre Richtigkeit zu überprüfen. Dabei wird die Analyse nicht direkt an den operationalen Datenbankdaten vollzogen, sondern an einem so genannten OLAP Cube, einem mehrdimensionalen Modell einer Momentaufnahme der Daten. Der bekannteste freie OLAP-Server ist das in Java geschriebene Mondrian-Projekt (RüWo05). Die Aufbereitung der Ergebnisse zu aussagekräftigen Berichten übernehmen Reporting-Engines wie die Java-Bibliothek JaspersReports von der kalifornischen Software-Schmiede JasperSoft (Basi04). - 17 - 6 Pentaho Der amerikanische Open-Source Anbieter Pentaho, bietet eine Business Intelligence Komplettlösung an, bei der versucht wird viele Einzellösungen zu einem kompletten Framework zusammenzufassen und dafür Support aus einer Hand zu liefern. Die Pentaho Business-Intelligence Suite umfasst, ETL-, Analyse-, Reporting- und Workflow-Komponenten und bring die Projekte Mondrian, Kettle, die ReportingBibliothek JFreeReports und Pentahos Eigenentwicklungen wie Dashboards unter einen Hut. Dashboards ermöglicht Anwendern über ein Web-Frontend einen zentralen Zugang zu Auswertungen, Reports und anderen Informationen. Das Geschäftskonzept von Pentaho ist wahrlich einfach und simple und beruht auf der Tatsache, dass Unternehmen versuchen ihre Einnahmen zu vergrößern und dabei ihre Kosten so gering wie möglich zu halten. In diesem Punkt kommen Business Intelligence Lösungen zum Einsatz. Durch die Verwendung von Business Intelligence Lösungen wird die Effektivität und Effizienz im Unternehmen gesteigert und das Ziel der vergrößerten Einnahmen und geringen Kosten rückt in greifbare Nähe. Doch dabei konzentrieren sich herkömmliche Business Intelligence Lösungen auf einzelne Problembereiche und Geschäftsfelder. Durch die einzelnen Business Intelligence Tools, die sich im Laufe der Zeit bei den Unternehmen anhäufen entsteht ein undurchsichtiges Gebilde, welches einzelne Probleme ohne Zusammenhang versucht zu lösen. Mit diesen Tools war es bisher notwendig das Problem immer in einzelne Komponenten zu teilen und für jede Komponente das passende Tool mit der jeweiligen Lösung in Anspruch zu nehmen. Somit hat sich Pentaho zur Aufgabe gemacht, eine einheitliche Business Intelligence Plattform zu bilden, die es ermöglicht all diese einzelnen Tools, zu einer Lösung zusammenzuführen. Die Kritikpunkte bei traditionellen Business Intelligence Lösungen sind von der Seite von Pentaho, neben dem Preisfaktor, auch die Benutzerfreundlichkeit und die Anpassungsfähigkeit der kommerziell angeboten Software-Pakete. Nach der Beschreibung von Pentaho, versucht Pentaho, diese Schwachstellen der kommerziell angebotenen Produkte zu - 18 - verbessern, und versucht eine Komplettlösung anzubieten. Im Vergleich zu traditionellen Business Intelligence Lösungen ist die Pentaho Plattform eine Lösungs-orientierte und Prozess-zentrierte Komplettlösung mit Business Intelligence Komponenten. Die Business Intelligence Plattform von Pentaho gilt als Prozess-zentriert, da die zentrale Kontrolleinheit eine „workflow-engine“ ist. Diese workflow-engine benutzt Prozess-Definitionen, um die Business Intelligence Prozesse die im Rahmen der Plattform ausgeführt werden, zu definieren. Diese Prozesse können leicht adaptiert werden und weiters können neue Prozesse hinzugefügt werden. Die Pentaho Business Intelligence Plattform besteht aus folgenden Komponenten: • Das Business Intelligence Framework: bestehend aus dem ETL, den WebDiensten, dem Sicherheitszentrum, etc. • Die einzelnen Business Intelligence Komponenten: Reporterstellung, Analyse, Workflow, Dashboards und Data Mining • Dem Business Intelligence Workbench: Eine Reihe von Design- und Administrativen Tools, welche in der Eclipse Plattform integriert sind. Diese Tools erlauben es den Benutzern der Pentaho Business Intelligence Plattform eigene Reports, Dashboards, Business Intelligence Prozesse, Regeln und Analysemodelle zu erstellen. • Das Business Intelligence Framework kombiniert mit den einzelnen Business Intelligence Komponenten stellen den Pentaho Server dar. Wie bereits erwähnt ist die Architektur der Pentaho Business Intelligence Plattform eine Kombination aus eigenem Source Code und bereits ausgiebig erprobtem Open Source Code. Der Pentaho Server, welcher aus dem Pentaho Business Intelligence Framework und den einzelnen Pentaho Business Intelligence Komponenten besteht, läuft auf einem J2EE fähigen Webserver (z.B.: Apache, JBOSS AS, WebSphere, WebLogic und Oracle AS). Der Pentaho Server ermöglicht es, dass die einzelnen Funktionen der Pentaho Business Intelligence Plattform den verschiedenen Usern, in - 19 - einheitlicher Form und Aussehen präsentiert werden. Der Pentaho Server enthält die Engines und Komponenten für das Erstellen von Reports, die Analyse der Daten, die Business Rules, die Email und Desktop Benachrichtigung und den Workflow. Diese Komponenten sind derart integriert, dass sie Business Intelligence Probleme lösen können. Während eines Lösungsprozesses werden das Verhalten, das Interagieren mit anderen Komponenten der einzelnen Sub-Systeme durch eine Sammlung von Solution-Definitions definiert. Diese Solution Definitions sind XML Dokumente die folgende Punkte enthalten: • Die Definition der Geschächtsfprozesse • Die Definitionen von Aktivitäten, die das Bearbeiten von Daten veranlassen. Weiters sind die Vorlagen für die Reporterstellung und die Dashboards durch diese Dokumente definiert und festgelegt. • Die Beziehung zwischen den soeben genannten Komponenten - 20 - Abbildung 1: Pentaho Server Architektur (Quelle: www.pentaho.org) Wie aus Abbildung 1 ersichtlich basiert die Server Architektur von Pentaho auf den Open Source Komponenten auf. Die Pentaho Business Intelligence Plattform ist mit externen Applikationen verbunden, um Lösungen für jeden möglichen Geschäftsprozess zur Verfügung zu stellen. Diese externen Daten werden in das Data Warehouse geladen, indem das bereits beschriebene Open Source Tool ETL - 21 - benutzt wird. Die Solution Engine ist das Zentrum der Pentaho Business Intelligence Plattform Architektur und kontrolliert alle Zugriffe auf die einzelnen Business Intelligence Komponenten. Weiters ist aus der Abbildung 1 ersichtlich, dass die einzelnen Komponenten wie Module ausgetauscht und zum System hinzugefügt werden können. Dabei sind auf in Abbildung 1 nicht alle möglichen Komponenten ersichtlich. Die einzelnen Komponenten für Emails, das Drucken und das Formatieren von Nachrichten und Reports sind nicht verzeichnet. Ein weiteres erwähnenswertes Detail der Pentaho Business Intelligence Plattform ist das einfache Austauschen von bestimmten Technologien, durch gleichwertige Technologien. So kann zum Beispiel der durch JBOSS AS realisierte J2EE Server, durch jede Java JDK 1.4 kompatible Server Applikation ersetzt werden. Weiters bietet die Plattform die Userinterfaces in Java Server Pages (JSPs) an. Third Party oder eigene Java Server Pages können hinzugefügt werden. Das Mondrian Open Source OLAP Projekt ist in der Pentaho Business Intelligence Plattform integriert. Diese kann aber durch jede MDX kompatible OLAP Server Architektur genutzt werden. Neben den bereits erwähnten Open Source Komponenten der Pentaho Business Intelligence Plattform, bedient sich Pentaho noch einer Reihe offener Standards und Protokolle: • XML – W2C’s Extensible Markup Language • JSR-94 – JCP’s Rules Engine API • JSR-168 – JCP’s Portlet Spec • SVG – W3C’s Scalable Vector Graphics • XPDL – WFMC’s XML Process Definition Language • XForms W3C’s Web Forms • MDX – Microsoft’s OLAP Query Language • WSBPEL - Oasis’s Web Services Business Process Execution Language • WSDL - W3C’s Web Services Description Language • SOAP - W3C’s Simple Object Access Protocol - 22 - 6.1 Vorteile von Pentaho Nachdem der Aufbau der Pentaho Business Intelligence Plattform bereits in den vorangehenden Kapiteln beschrieben wurde, beschäftigt sich das folgende Kapitel mit den von Pentaho selbst erarbeiteten Vorteilen, ihrer Business Intelligence Plattform im Gegensatz zu den kommerziell Angebotenen Produkten. Neben der Komplettlösung von Pentaho werden bei der Implementierung die Kosten für weitere Business Intelligence Tools minimiert. Außerdem bietet Pentaho eine echte Workflow basierte Anwendung an, die einerseits einfach in die bestehenden Geschäftsprozesse zu integrieren ist und andererseits an das Unternehmen und die Bedürfnisse angepasst werden kann, da die Definitionen in den Solution Dokumenten adaptierbar sind. - 23 - 7 Technisches Umfeld für die Projektumsetzung Auf Grund der Internetrecherchen in der Anfangsphase des Projekts ermittelten die Autoren einige „Mindestanforderungen“ an die Hardware des Rechners, der sowohl den Server für die Pentaho BI-Plattform beherbergen, als auch als DevelopmentRechner für die Erstellung der Reports eingesetzt werden sollte. Obwohl sämtliche notwendige OpenSource-Software auch für Microsoft Windows vorliegt, entschieden sich die Autoren bei der Durchführung des Projekts auch mit dem eingesetzten Betriebssystem in der OpenSource-Welt zu bleiben. Die Autoren verwendeten daher folgendes System für die Durchführung des Projekts: • Intel Centrino 1,86 Ghz • 1GB RAM • Linux-Distribution „Ubuntu 7.04 – Feisty Fawn“ als Betriebssystem • MySQL-Datenbank 5.0 (aus den repositories des Betriebssystems installiert) • MySQL-GUI-Tools (http://dev.mysql.com/downloads/gui-tools/5.0.html) • OpenOffice.org (http://www.openoffice.org/) • phpMyAdmin (aus den repositories des Betriebssystems installiert) • Java-IDE Eclipse 3.2 (http://www.eclipse.org) • Pentaho Business Intelligence Platform Demo (Pre-Configured Install) (http://www.pentaho.com) • Pentaho Report Designer RC 2 (http://www.pentaho.com) - 24 - 8 Schwierigkeiten beim Importieren der Daten in die MySQL-Datenbank Grundsätzlich waren die Autoren sowohl mit der Anwendung einer Java-IDE (konkret: Eclipse 3.2), als auch mit diversen Management-Tools für MySQLDatenbanken (phpMyAdmin, MySQL Query Browser, OpenOffice.org v2.2 Database) vertraut. Die Anforderungen dieses Projekts zeigten jedoch, dass der MySQL Query Browser mit den Default-Einstellungen nicht geeignet ist, eine Datenbank inkl. der zugehörigen Tabellen schnell und benutzerfreundlich zu erstellen. Es wurde daher versucht mit dem Datenbank-Tool der OpenOffice.org-Produktfamilie (Version 2.2) auf die MySQL-Datenbank zuzugreifen, was sich auf Grund zahlreicher Programmabstürze ebenfalls als nicht praktikabel erwies. Es existiert keine Dokumentation über die Inhalte der Files (was bedeutet welches Attribut, usw.). Nachdem aus den Dokument-Files zu erkennen war, dass diese selbst mit Hilfe einer Datenbank generiert wurden, hätte man auch ein csv-File für die Portierung der Daten in die MySQL-Datenbank der Autoren verwenden können. Dies hätte allerdings noch immer erfordert, das Java-Programm für die Log-Files zu entwickeln. Die Dokument-Files umfassen Dissertationen und WorkingPapers. Beide Typen unterscheiden sich voneinander in der Namensgebung der Attribute, obwohl die Attribute äquivalent sind, z.B. für das Institut, an dem die Arbeit verfasst wurde => Dissertation: „DC.Contributor.personalName“ => WorkingPaper: „DC.Publisher.corporateName“ Dies machte es erforderlich, das Java-Programm um eine separate Routine zu erweitern, die sich mit dem Import der Daten aus den WP-Dokument-Files befasst. Die Files enthalten unterschiedlich viele Attribute, was sich auf die Ermittlung der max. Spaltenanzahl der Tabelle überdurchschnittlich negativ bemerkbar gemacht hat. Jedes File enthält nur jene Attribut-Wert-Paare, bei denen der Wert nicht NULL ist. Es ist daher schwierig zu ermitteln, welche Attribute über die Gesamtmenge der Files für jeden Dokument-Typ vorkommen. - 25 - Hier wurde Abhilfe geschaffen, indem das Java-Programm am Ende eine Liste mit den ermittelten Attributen ausgibt. Auch innerhalb der Files gibt es keine Konsistenz in der Namensgebung. Ein Wert für das Attribut „DC.Date.Created“ hat das Format YYYY, ein Wert für das Attribut „DC.Date.Submitted“ hat das Format YYYY-MM und der Wert für das Attribut „VL.Date“ hat das Format YYYY-MM-YY. Hier wurde ein Workaround gefunden, indem alle Datumsangaben in das MySQLTimestamp-Format YYYY-MM-DD 00:00:00 gebracht wurden. Fehlende Daten für Monate bzw. Tage wurden mit „01“ befüllt, die Uhrzeiten mit „00:00:00“. Es lässt sich also erkennen, dass die angeführten Inkonsistenzen den Zeitaufwand extrem in die Höhe getrieben und die vor dem Projekt durchgeführte Aufwandschätzung ad absurdum geführt haben. Die Aufwandschätzung für die Erstellung des Java-Programms war mit 15 Std. eigentlich schon recht großzügig bemessen, es stellte sich jedoch heraus, dass weit über 40 Std. notwendig sein werden, um ein lauffähiges Programm zu bekommen, das später auch flexibel auf verschiedene Ablageorte der Files reagieren kann. - 26 - 9 Probleme beim Erstellen der Reports mit dem Pentaho ReportDesigner (inkl. Wizard) Um die Konnektivität zwischen MySQL-Datenbank und ReportDesigner zu testen, wurden Teile der Daten aus der Pentaho-Datenbank (Hypersonic) in die MySQLDatenbank migriert. Hierzu wurden die Tools „Kettle“ und „Spoon“ von der PentahoPlattform heruntergeladen und erfolgreich für die Datenmigration angewendet. Grundsätzlich war der ReportDesigner in der Version RC 1 out-of-the-box nicht für die Verwendung der MySQL-Datenbank zu konfigurieren. Grund hierfür war, dass der korrekt installierte Java-MySQL-Connector nicht gefunden wurde. Dass der CLASSPATH zum Connector korrekt gesetzt war, wurde an Hand einer Installation von Jakarta Tomcat 5.5 (aus den repositories) getestet. Nach dem Anwenden der Anleitungen mehrerer How-Tos aus diversen Foren, wurde dann eine komplette Neuinstallation des Betriebssystems vorgenommen und danach nochmals die Installation von Connector und ReportDesigner vorgenommen. Wieder konnte das Tool den Connector nicht finden, ein anderes Programm aber schon. So konnte ausgeschlossen werden, der Fehler in der Installation (CLASSPATH setzen) lag und die Fehlerursache war eindeutig auf der Seite des ReportDesigners zu suchen. Nachdem zu diesem Zeitpunkt bereits feststand, dass in den nächsten Tagen ein neuer ReleaseCandidate des ReportDesigners veröffentlicht werden wird, wurde die MySQL-Anknüpfung an den ReportDesigner auf einen späteren Zeitpunkt verschoben und die Entwicklung des Java-Programms fortgesetzt. Nach dem Erscheinen des ReleaseCandidate 2 und dessen Installation funktionierte das Auffinden des Java-MySQL-Connectors ohne nennenswerte Probleme. Es wurde Verbindung zu den migrierten Daten in der MySQL-Datenbank aufgebaut und ein kleiner Test-Report erstellt. Somit war die grundsätzliche Einsatzbereitschaft des ReportDesigners hergestellt und es konnte wieder die volle Energie in die Fertigstellung des Java-Programms für die Befüllung der Datenbank investiert werden. - 27 - Nachdem die Datenbank schließlich korrekt befüllt war, wurde der ReportDesigner für die Erstellung von Reports herangezogen. Es stellte sich jedoch heraus, dass die eingebaute Hilfestellung für das Erstellen von SQL-Abfragen unzureichend und extrem instabil war. Das Verwenden des „QueryDesigners“ führte jedes Mal zum Absturz des gesamten ReportDesigners. Nach mehrmaligen Versuchen und Updates auf neuere Versionen haben sich die Autoren dazu entschieden, die SQL-Statements manuell zu definieren. Hierzu wurde das Tool „phpMyAdmin“ aus den repositories installiert und erfolgreich eingesetzt. Die nächste (negative) Überraschung kam dann beim Design des Reports für die Zugriffstatistiken. Es ist derzeit nicht möglich, mehrere SQL-Abfragen für ein und denselben zu definieren. Die Kennzahlen wurden daher in diese Richtung angepasst, dass nun überwiegend Ergebnislisten generiert werden, die in ihrem Ausmaß limitiert wurden („Limit“-Befehl). Eine weitere Schwierigkeit brachte die visuelle Aufbereitung der Reports mit sich, da der ReportDesigner bei mehreren Versuchen die Reports mit grafischen Elementen (horizontale Linien, Hintergrundfarben für Text, usw.) auszustatten abstürzte und sich erst nach dem „Killen“ des entsprechenden Prozesses erneut starten ließ. Bei den erstellten Reports wurde aus den oben angegebenen Gründen die grafische Gestaltung so einfach wie möglich gehalten. - 28 - Die Erstellung der Reports war extrem durch Programmabstürze des ReportDesigners und des zugehörigen Wizards geprägt, die den Einsatz in einer Produktivumgebung definitiv ausschließen. Das konkrete Problem war jenes, dass nach Abschluss aller notwendiger Schritte im Wizard, der Wizard mit Klick auf „Done“ abgeschlossen werden sollte, das Programm häufig abstürzte ReportDesigner ebenfalls beendete. Abbildung 2: Fehlermeldung („Interner Fehler aufgetreten“) - 29 - und den Das Terminal gab hierzu folgende Fehlermeldung aus: „The program 'SWT' received an X Window System error. This probably reflects a bug in the program. The error was 'BadWindow (invalid Window parameter)'. (Details: serial 47368 error_code 3 request_code 3 minor_code 0) “ Die Internetrecherche zur Behebung dieses Fehlers bzw. Möglichkeit einer entsprechenden Installation eines Patches blieb leider erfolglos. Es konnten somit die Reports weder in PDF, CSV, XLS, o.ä. Format, als auch als Pentaho-Template erstellt werden, das notwendig ist, um den Report am PentahoBusinessIntelligence-Server aufrufen zu können. - 30 - 10 Das Erstellen eines Reports (Screenshots) Abbildung 3: Hinzufügen der Datenquelle In Abbildung 3 sieht man das manuelle Hinzufügen einer Datenquelle für den Pentaho Report Designer (bei Verwendung des Wizards nicht notwendig). - 31 - Der Aufruf des ReportDesign Wizards über das Menü DATEI -> Report Wizard führt zu folgendem Screen: Abbildung 4: 1. Schritt der Report-Erstellung In Abbildung 4 befinden wir uns in Schritt 1. Hier wird der Titel des Reports, sowie dessen Beschreibung definiert. - 32 - In einem zweiten Schritt muss die Datenquelle ausgewählt bzw. erstellt werden und das entsprechende SQL-Statement eingegeben werden. Abbildung 5: Auswahl der Datenquelle Abbildung 6: Bearbeitung der Verbindung zur Datenquelle - 33 - Nach dem erstmaligen Erstellen der Datenquellen ist sie fortan immer unter dem Namen „ePub“ als Auswahlmöglichkeit vorhanden; Abbildung 7: Gestaltungs- und Gruppierungsmöglichkeiten - 34 - In Abbildung 7 wird festgelegt, ob und wie die Daten in der Ausgabeliste gruppiert werden sollen. Dies macht vor allem dann Sinn, wenn eine hierarchische organisatorische Gliederung der Daten möglich ist, z.B. Ist- und Soll-Budget für einzelne Regionen -> Länder -> Kontinente usw.; Hierbei stellt jede Gruppierung eine Kumulierung der enthaltenen Daten dar; Hier können das Format und die Gruppen-Funktionen (für die Berechnung) definiert werden; Abbildung 8: Weitere Auswahlmöglichkeiten zur Gruppierung - 35 - Abbildung 9: Formatierungsmöglichkeiten In Abbildung 9 werden das Papierformat und Ausrichtung, die Seitenränder, usw. vorgegeben; optional kann ein Image als Wasserzeichen angegeben werden, das auf jede Seite gedruckt wird; - 36 - Abbildung 10: Feintuning In Abbildung 10 kann noch ein abschließendes Feintuning vorgenommen werden, wie z.B. Bezeichnung der Summenzeile, Anzeige von Gitternetzlinien, usw.; Hier wird ebenfalls festgelegt, ob ein Chart zum Einsatz kommen soll - 37 - Abbildung 11: Integration eines Charts Will man ein Chart in den Report integrieren, kann man die entsprechenden Einstellungen in dem in Abbildung 11 dargestellten Pop-Up vornehmen; - 38 - Abbildung 12: Vorschau des ReportDesigners In Abbildung 12 sieht man den mit dem Wizard generierten Report in der Ansicht „Vorschau“ des ReportDesigners. - 39 - Abbildung 13 zeigt die Entwurfsansicht des ReportDesigners. Abbildung 13: Entwurfsansicht des ReportDesigners Vorschau-Ansichten der einzelnen Reports inkl. zugehörigen SQL-Statements: Nachdem die Report-Generierung nicht funktioniert, sollen die folgenden Screenshots zumindest eine Indikation dafür geben, welche Daten auf dem fertigen Report dargestellt worden wären. Hierbei ist jedoch zu beachten, dass das Hinzufügen von mehr als 5 Feldern per Drag-and-Drop das Programm zum Absturz bringt. Um Abstürze zu vermeiden, haben die Autoren daher die Einschränkung getroffen, dass nur das Ergebnis der Abfrage in Form einer Liste und allenfalls ein passender Chart pro Report vorkommen sollen. - 40 - Nutzungs-Stärkster Tag der Woche Abbildung 14: Nutzungs-Stärkster Tag der Woche SELECT DAYNAME( `date` ) AS wochentag, count( `id` ) AS useranz FROM logs_basic WHERE 1 GROUP BY wochentag ORDER BY DAYOFWEEK( `date` ) ; - 41 - Top 10 der meistaufgerufenen WorkingPapers; gruppiert nach Institut Abbildung 15: Meistaufgerufene WorkingPapers gruppiert nach Institut SELECT wp_basic.dc_title AS title, wp_basic.dc_creator_personalname AS autor, wp_basic.dc_publisher_corporatename AS institut, count( logs_views.userid ) AS aufrufe FROM wp_basic, logs_views WHERE logs_views.views = ( REPLACE( wp_basic.id, '/meta', '' ) ) GROUP BY title ORDER BY aufrufe DESC LIMIT 0 , 10; - 42 - Anteile der verschiedenen Sprachen an den WorkingPapers Abbildung 16: Anteile der verschiedenen Sprachen an den Workingpapers SELECT dc_language_id AS sprache, count( id ) AS anzahl FROM wp_basic WHERE 1 GROUP BY sprache ORDER BY anzahl DESC; - 43 - Die meistgesuchten Stichwörter (Top 10) Abbildung 17: Meistgesuchten Stichwörter SELECT keyword AS stichwort, count( userid ) AS suchen FROM `logs_queries_keyw` WHERE LENGTH( keyword ) > 3 GROUP BY stichwort ORDER BY suchen DESC LIMIT 0 , 10; Die Bedingung „Länge des Stichworts > 3“ wurde gewählt, um allfällige Bindewörter, Präpositionen, usw. überwiegend aus dem Ergebnis auszuschließen; ein manueller Test hat ergeben, dass das einzige Bindewort, das aus Sicht der Anzahl in dieser Liste aufscheinen müsste, das Wort „and“ ist. Somit wurde die Plausibilität der o.a. Bedingung bewiesen. - 44 - Berechnung von Kennzahlen: Es wurden noch weitere SQL-Abfragen definiert, die Informationen über das Nutzungsverhalten der User in Form von quantitativen Kennzahlen liefern sollen. Exemplarisch sollen die Kennzahlen, sowie die zugehörigen SQL-Abfragen im Folgenden erwähnt werden: durchschnittliche Log-In-Dauer in Min (exkl. 0-Sec-Log-Ins): Ergebnis: 11,22 min SQL-Query: SELECT AVG( TIMESTAMPDIFF( SECOND , `date` , `end` ) /60 ) AS 'dauer' FROM logs_basic WHERE TIMESTAMPDIFF( SECOND , `date` , `end` ) <> 0; durchschnittliche Log-In-Dauer in Min (inkl. 0-Sec-Log-Ins): Ergebnis: 8,28 min SQL-Query: SELECT AVG( TIMESTAMPDIFF( SECOND , `date` , `end` ) /60 ) AS 'dauer' FROM logs_basic; - 45 - 11 Fazit Pentaho wirbt mit seiner einfachen Handhabung als Open Source Lösung für das Einrichten einer Business Intelligence Plattform. Im Rahmen dieser Arbeit konnte diese Behauptung nicht bestätigt werden. Begonnen mit dem Import der Daten bis hin zur Erstellung der Reports traten unvorhergesehene Fehler auf. Zwar bietet Pentaho alle notwendigen Funktionen um mit den kommerziellen Business Intelligence Produkten mithalten zu können, doch stellt sich die Frage ob die Ergebnisse der Analysen den Aufwand des Konfigurieren des Systems rechtfertigen. - 46 - 12 Anhang Data Import in Java: import java.io.*; import java.util.*; import java.util.Vector; import java.sql.*; public class dataimport { public static Vector columns_diss = new Vector(); public static Vector columns_wp = new Vector (); public static Vector columns_logs = new Vector (); public static String current_id = null; public static String url = "jdbc:mysql://localhost:3306/ePub"; public static Connection conn = null; /** * @param args * Gibt dem Programm jenen (absoluten) Pfad (inkl. Dateiname und Endung) mit, an dem das properties-file gespeichert ist. */ public static void main(String[] args) { try { DriverManager.registerDriver(new org.gjt.mm.mysql.Driver()); conn = DriverManager.getConnection(url, "ePub_user", "ePub_password"); } catch (SQLException e) { System.out.println("DB-Fehler: "+e); } String propertiesFile=args[0].trim(); //String propertiesFile = "/home/valentin/dbtest_testData/dbtest.properties"; // Reading properties file. Properties properties = new Properties(); try { properties.load(new FileInputStream(propertiesFile)); - 47 - // The Folders shall be separated by commas in the properties-File or the keyword "all" shall be stated; // "all" means that all subfolders of logfiles.PathToFolders shall be included String logfileFolders=properties.getProperty("logfiles.Folders"); // The PathToFolders shall contain an ending /-sign and be an absolute path String pathToDataFolders=properties.getProperty("logfiles.PathToFolders"); String datafileFolders_diss=properties.getProperty("datafiles_diss.Folders"); String pathToDataFolders_diss=properties.getProperty("datafiles_diss.PathToFolders"); String datafileFolders_wp=properties.getProperty("datafiles_wp.Folders"); String pathToDataFolders_wp=properties.getProperty("datafiles_wp.PathToFolders"); handleFolders (logfileFolders, pathToDataFolders, 1); handleFolders (datafileFolders_diss, pathToDataFolders_diss, 2); handleFolders (datafileFolders_wp, pathToDataFolders_wp, 3); System.out.println("\n\n\nSpalten fuer die basic Diss-DB:"); showContent(columns_diss, false); System.out.println("\n\n\nSpalten fuer die basic WP-DB:"); showContent(columns_wp, false); System.out.println("\n\n\nSpalten fuer die logs-DB:"); showContent(columns_logs, false); } catch (IOException e) { System.out.println("Fehler beim Lesen des properties-File:" +e); } } /** * * @param folder * @param path * @param typeOfFiles 1: logfiles; 2: diss; 3: wp; */ public static void handleFolders (String folder, String path, int typeOfFiles) { String[] dataFolders=null; if (folder.equals("all")==false){ dataFolders=folder.split(","); System.out.println("Ordner wurden explizit angegeben"); } else { // logfilesFolders=="all" - 48 - dataFolders=new File(path).list(); if (dataFolders!=null){ for (int i=0; i<=dataFolders.length-1;i++){ System.out.println(dataFolders[i]); } } } String fileType = ""; switch (typeOfFiles) { case 1: fileType="logFiles"; break; case 2: fileType="diss"; break; case 3: fileType="wp";break; } // Check, if the amount of the folders is right System.out.println(dataFolders.length + " Ordner mit "+fileType+" angegeben:"); for (int i=0;i<=dataFolders.length-1;i++) { System.out.println("=============================================== ==============="); System.out.println("Beginne mit Verarbeitung von Ordner: "+dataFolders[i]); String concreteDataFolder=path+dataFolders[i]; switch (typeOfFiles) { case 1: importLogFilesIntoDatabase(concreteDataFolder); break; case 2: importDissFilesIntoDatabase(concreteDataFolder); break; case 3: importWpFilesIntoDatabase(concreteDataFolder); break; } System.out.println("Verarbeitung von Ordner "+concreteDataFolder+" abgeschlossen!"); } System.out.println("\n\nAlle Ordner durchsucht. Programmende."); } public static void importLogFilesIntoDatabase (String dataFolder) { File folder=new File(dataFolder); File[] logFiles = folder.listFiles(); System.out.println("Im Ordner "+dataFolder+" gefundene Dateien ("+logFiles.length+"):"); if (logFiles!=null){ for (int i=0; i<=logFiles.length-1;i++){ - 49 - System.out.println("=============================================== ============="); System.out.println(folder+"/"+((File) logFiles[i]).getName()+" hat folgenden Inhalt: "); readFileContent(logFiles[i]); } } else System.out.println("Das Array mit den Files ist NULL"); } public static void readFileContent (File f){ try { String streak; Vector insertObjects = new Vector (); Vector vec_query_attr = new Vector(); Vector vec_query_keyw = new Vector(); Vector vec_views = new Vector(); File enterFile = f; FileReader enterStream = new FileReader(enterFile); BufferedReader eInput = new BufferedReader(enterStream); while ((streak = eInput.readLine()) != null) { String[] nameValueCouple = streak.split(" := "); if (nameValueCouple[0].equals("query")==true) { // System.out.println("QUERY:"); addColumnToColumnList(nameValueCouple[0], columns_logs); String[] queries=nameValueCouple[1].substring(1,nameValueCouple[1].length()-1).split(";"); for (int i=0; i<=queries.length-1; i++) { if (queries[i].contains(":=")==true) { String[] queryCouple = queries[i].split(":="); if (queryCouple.length==2) { // System.out.println("QueryAttribut: "+queryCouple[0]); // System.out.println("QueryWert: "+queryCouple[1]); vec_query_attr.addElement(queryCouple); } } else { // Query waren nur Stichwoerter String[] queryKeywords = queries[i].split(" "); for (int j=0; j<=queryKeywords.length-1; j++){ String keyword = queryKeywords[j].replace("\"", "'"); // System.out.println("QueryStichwort: "+ keyword); vec_query_keyw.addElement(keyword); } - 50 - } } } else if (nameValueCouple[0].equals("view")==true) { // System.out.println("VIEWS:"); addColumnToColumnList(nameValueCouple[0], columns_logs); String[] views=nameValueCouple[1].substring(1,nameValueCouple[1].length()-1).split(";"); for (int i=0; i<=views.length-1; i++) { // System.out.println(views[i]); vec_views.addElement(views[i]); } } else { if (nameValueCouple[0].equalsIgnoreCase("userid")){ //notwendig zur Identifikation fuer queries und views current_id = nameValueCouple[1].substring(1, nameValueCouple[1].length()-1); } // System.out.println("Name: "+nameValueCouple[0]); addColumnToColumnList(nameValueCouple[0], columns_logs); // System.out.println("Wert: "+nameValueCouple[1].substring(1, nameValueCouple[1].length()-1)); insertObjects.addElement(nameValueCouple); } } insertVectorInDatabase(insertObjects, "logs_basic"); insertObjects=null; insertQueryIntoDB(vec_query_attr, vec_query_keyw); vec_query_attr=null; vec_query_keyw=null; insertViewsIntoDB (vec_views); vec_views=null; } catch (IOException e) { e.printStackTrace(); } } public static void importDissFilesIntoDatabase (String dataFolder) { try { // System.out.println("=============================================== ======"); - 51 - // System.out.println("=============================================== ======"); // System.out.println("importDissFilesIntoDatabase"); File enterFile=new File(dataFolder+"/meta.dat"); FileReader enterStream = new FileReader(enterFile); BufferedReader eInput = new BufferedReader(enterStream); String streak; Vector documentDetails = new Vector (); Vector documentKeywords = new Vector (); Vector documentKeywords_eng = new Vector (); String documentId = null; while ((streak = eInput.readLine()) != null) { String[] nameValueCouple = streak.split(" := "); if (((nameValueCouple[0].equals("DC.Subject.Keywords")) || (nameValueCouple[0].equals("DC.Subject.Keywords.eng")))==false) { if (nameValueCouple[0].equals("ID")){ documentId=nameValueCouple[1].substring(1, nameValueCouple[1].length()-1); } // System.out.println("Name: "+nameValueCouple[0]); addColumnToColumnList(nameValueCouple[0], columns_diss); // System.out.println("Wert: "+nameValueCouple[1].substring(1, nameValueCouple[1].length()-1)+" ==> Laenge: "+nameValueCouple[1].substring(1, nameValueCouple[1].length()-1).length()); if ((nameValueCouple[0].equals("DC.Date.Created")) || (nameValueCouple[0].equals("DC.Date.Accepted"))){ nameValueCouple[1]=nameValueCouple[1].substring(0, nameValueCouple[1].length()-1)+"-01-01 00:00:00}"; } if (nameValueCouple[0].equals("DC.Date.Submitted")){ nameValueCouple[1]=nameValueCouple[1].substring(0, nameValueCouple[1].length()-1)+"-01 00:00:00}"; } if (nameValueCouple[0].equals("VL.Date")){ String[] dateValue = nameValueCouple[1].substring(1, nameValueCouple[1].length()-1).split(" "); nameValueCouple[1]="{"+buildMysqlTimestamp(dateValue)+"}"; } if (((nameValueCouple[0].equals("DC.Description.Abstract.eng")) || (nameValueCouple[0].equals("DC.Description.Abstract")))==true){ nameValueCouple[1]=nameValueCouple[1].replace("'", ""); - 52 - } documentDetails.addElement(nameValueCouple); } else { System.out.println("KEYWORDS ("+nameValueCouple[0]+"):"); Vector helpVec = new Vector(); // String[] keywords=nameValueCouple[1].substring(1,nameValueCouple[1].length()1).split("/"); for (int i=0; i<=keywords.length-1; i++) { // System.out.println(keywords[i].trim()); helpVec.addElement(keywords[i].trim()); } // System.out.println("=====END OF KEYWORDS====="); if (nameValueCouple[0].equals("DC.Subject.Keywords.eng")){ documentKeywords_eng=helpVec; } else { documentKeywords = helpVec; } } } insertVectorInDatabase(documentDetails, "diss_basic"); insertDocumentKeywordsIntoDB("diss_keywords", documentId, documentKeywords, "deu"); insertDocumentKeywordsIntoDB("diss_keywords", documentId, documentKeywords_eng, "eng"); } catch (IOException e) { e.printStackTrace(); } } public static void importWpFilesIntoDatabase (String dataFolder) { try { // System.out.println("=============================================== ======"); // System.out.println("=============================================== ======"); // System.out.println("importWpFilesIntoDatabase"); File enterFile=new File(dataFolder+"/meta.dat"); FileReader enterStream = new FileReader(enterFile); BufferedReader eInput = new BufferedReader(enterStream); - 53 - String streak; Vector documentDetails = new Vector (); Vector documentKeywords = new Vector (); Vector documentKeywords_eng = new Vector (); String documentId = null; while ((streak = eInput.readLine()) != null) { String[] nameValueCouple = streak.split(" := "); if (((nameValueCouple[0].equals("DC.Subject.Keywords")) || (nameValueCouple[0].equals("DC.Subject.Keywords.eng")))==false) { if (nameValueCouple[0].equals("ID")){ documentId=nameValueCouple[1].substring(1, nameValueCouple[1].length()-1); } // System.out.println("Name: "+nameValueCouple[0]); addColumnToColumnList(nameValueCouple[0], columns_wp); // System.out.println("Wert: "+nameValueCouple[1].substring(1, nameValueCouple[1].length()-1)+" ==> Laenge: "+nameValueCouple[1].substring(1, nameValueCouple[1].length()-1).length()); if (nameValueCouple[0].equals("VL.Date")){ String[] dateValue = nameValueCouple[1].substring(1,nameValueCouple[1].length()-1).split(" "); nameValueCouple[1]=buildMysqlTimestamp(dateValue); } if (nameValueCouple[0].equals("DC.Date.Created")){ nameValueCouple[1]=nameValueCouple[1].substring(0, nameValueCouple[1].length()-1)+"-01-01 00:00:00}"; } if (((nameValueCouple[0].equals("DC.Description.Abstract.eng")) || (nameValueCouple[0].equals("DC.Description.Abstract")))==true){ nameValueCouple[1]=nameValueCouple[1].replace("'", ""); } documentDetails.addElement(nameValueCouple); } else { // System.out.println("KEYWORDS ("+nameValueCouple[0]+"):"); Vector helpVec = new Vector(); String[] keywords=nameValueCouple[1].substring(1,nameValueCouple[1].length()1).split("/"); for (int i=0; i<=keywords.length-1; i++) { // System.out.println(keywords[i].trim()); helpVec.addElement(keywords[i].trim()); } // System.out.println("=====END OF KEYWORDS====="); if (nameValueCouple[0].equals("DC.Subject.Keywords.eng")){ documentKeywords_eng=helpVec; - 54 - } else { documentKeywords = helpVec; } } } showContent (documentDetails, true); insertVectorInDatabase(documentDetails, "wp_basic"); insertDocumentKeywordsIntoDB("wp_keywords", documentId, documentKeywords, "deu"); insertDocumentKeywordsIntoDB("wp_keywords", documentId, documentKeywords_eng, "eng"); } catch (IOException e) { e.printStackTrace(); } } public static void addColumnToColumnList (String column, Vector columnList) { if (columnList.contains(column)==false){ columnList.addElement(column); } } public static void showContent (Vector vec, boolean containsArray){ for (int i=0; i<=vec.size()-1; i++) { if (containsArray==true){ String[] array = ((String[])(vec.elementAt(i))); for (int j=0; j<=array.length-1; j++){ System.out.println(array[j]); } } else { System.out.println((String) vec.elementAt(i)); } } System.out.println("======= Ende des Vektors ========\n\n\n"); } public static void insertVectorInDatabase (Vector vec, String table) { String columns = ""; String values = "'"; for (int i=0; i<=vec.size()-1;i++){ String[] nameValueCouple=((String[]) vec.get(i)); columns=columns+nameValueCouple[0]+", "; if (nameValueCouple[0].trim().equals("ip")==true){ String[] help = nameValueCouple[1].trim().substring(1,nameValueCouple[1].length()-1).split(" / "); - 55 - values=values+help[0].trim()+"', '"; } else if (((nameValueCouple[0].trim().equals("date")) || (nameValueCouple[0].trim().equals("end"))) == true){ String[] dateValue = nameValueCouple[1].substring(1,nameValueCouple[1].length()-1).split(" "); String timestamp = buildMysqlTimestamp (dateValue); values=values+timestamp+"', '"; } else { values=values+nameValueCouple[1].trim().substring(1,nameValueCouple[1].lengt h()-1).replace("'", "")+"', '"; } } columns=columns.substring(0,columns.trim().length()-1); values=values.substring(0,values.trim().length()-3); String sqlStatement = "insert into "+table+" ("+columns.replace(".", "_")+") values ("+values+")"; System.out.println("====> "+sqlStatement); try { Statement stmt = conn.createStatement (); stmt.executeUpdate(sqlStatement); System.out.println("\nErfassung erfolgreich."); } catch (Exception e) { System.out.println("\nFehler bei Erfassung: " + sqlStatement + "\n\n" + e); } } public static void insertQueryIntoDB (Vector vec_attr, Vector vec_keyw){ if (vec_attr!=null) { for (int i=0; i<=vec_attr.size()-1; i++) { String attr = ((String[]) vec_attr.get(i))[0]; String value = ((String[]) vec_attr.get(i))[1]; String query= "insert into logs_queries_attr values ('"+current_id+"', '"+attr.toLowerCase().replace(".", "_")+"', '"+value.replace("\"", "").replace("'", "")+"')"; System.out.println(query); try { Statement stmt = conn.createStatement (); stmt.executeUpdate(query); System.out.println("\nErfassung erfolgreich."); } catch (Exception e) { System.out.println("\nFehler bei Erfassung: " + query + "\n\n" + e); - 56 - } } } if (vec_keyw!=null) { for (int i=0; i<= vec_keyw.size()-1; i++) { String keyword = ((String)vec_keyw.get(i)).replace("'", ""); String query="insert into logs_queries_keyw values ('"+current_id+"', '"+keyword+"')"; System.out.println(query); try { Statement stmt = conn.createStatement (); stmt.executeUpdate(query); System.out.println("\nErfassung erfolgreich."); } catch (Exception e) { System.out.println("\nFehler bei Erfassung: " + query + "\n\n" + e); } } } } public static void insertDocumentKeywordsIntoDB (String table, String docID, Vector vec, String lang) { if (vec!=null){ for (int i=0; i<=vec.size()-1; i++) { String keyword = ((String)vec.get(i)).replace("'", ""); String query="insert into "+table+" values ('"+docID+"', '"+keyword+"', '"+lang+"')"; System.out.println(query); try { Statement stmt = conn.createStatement (); stmt.executeUpdate(query); System.out.println("\nErfassung erfolgreich."); } catch (Exception e) { System.out.println("\nFehler bei Erfassung: " + query + "\n\n" + e); } } } } public static void insertViewsIntoDB (Vector vec){ if (vec!=null) { for (int i=0; i<= vec.size()-1; i++) { String keyword = ((String)vec.get(i)).replace("'", ""); String query="insert into logs_views values ('"+current_id+"', '"+keyword+"')"; - 57 - System.out.println(query); try { Statement stmt = conn.createStatement (); stmt.executeUpdate(query); System.out.println("\nErfassung erfolgreich."); } catch (Exception e) { System.out.println("\nFehler bei Erfassung: " + query + "\n\n" + e); } } } } public static String buildMysqlTimestamp (String[] dates) { String timestamp=null; String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; int i=0; while (dates[1].trim().equals(months[i])==false){ i++; } String mm = ""+(i+1); if (mm.length()==1){ mm="0"+mm; } String yyyy = dates[dates.length-1]; String dd = dates[dates.length-3]; if (dd.length()==1){ dd="0"+mm; } String time = dates[dates.length-2]; timestamp = yyyy+"-"+mm+"-"+dd+" "+time; return timestamp; } } - 58 - 13 Literatur (Basi04) Basis04 AG; Open Source Business Intelligence. Bern 2004. (DaWa07) Data Warehouse und Data Marts: Erfolgskritische Architekturkomponenten. http://bpm.iwi.unisg.ch/downloads/gi/kemper.pdf. 2007. (GaJa05) Gajdzik Jakob; Data Mining. Methoden und Algorithmen. Zürich 2005. (KoSt04) Kooths Stefan; Freie Software und Open Source. Definitionen, Pro und Contra. Münster 2004. (KöMa02) Köster Mathais: Business Intelligence und Data-Warehouse: Datenfriedhof oder Schatztruhe. In: content mananger 10/2002. (LuBe04) Luthiger, Benno: Alles aus Spaß? Zur Motivation von Open-Source Entwicklern.2004. (Moni05) Monitor – Intelligence. 10/2005. Das Magazin für Informationstechnologie. Business (PaKa06) Karman Parsyae; OLAP and Data Mining: Bridging the Gap. http://www.dbpd.com/vault/parsfeb.htm. 2006 (PlDa02) Ploch Danota et al.; Einführung in Open Source Software. (PrTo06) Priebe Torsten und Pernul Günther; Sicherheit in Data-Warehouse- und OLAP-Systemen. Regensburg. 2005. (RuJo03) Rubin Jon: Die DB2 Architektur für Business Intelligence – Business Intelligence-Lösungen. August 2003. (RuJo07) Rupp Johannes; Trends in Business Intelligence und Data Warehouse. 2007 (RüWo05) Rütter Wolfgang; Die ORACLE OLAP Option. Gummersbach. 2005. (ScTo06) 2006. Scheffer Tobias und Bickl Steffen; Text Mining und Web Mining. Berlin. (WiCh06) Wieser Christian; Open Source Software. Mannheim 2006. (WoUl03) Wollgandt Ulrike und Trefz Alexandra; Business Intelligence – Der Prozess. Stuttgart 2003. - 59 -