SAP HANA Development

Werbung
Whitepaper
In-Memory optimierte
Java-Anwendungsszenarien
Java-Entwickung mit SAP HANA
und deren Architektur
In-Memory optimierte Java-Anwendungsszenarien
Java-Entwicklung mit SAP HANA und deren Architektur
Autor:
Stefan Kühnlein,
Solution Architect bei
OPITZ CONSULTING
Haben Sie Fragen
zu diesem Thema?
Dann sprechen Sie uns gerne an!
Kontakt:
[email protected]
Inhaltsübersicht
Einleitung
Einleitung
Was hat sich verändert?
Wetteranalyse via Twitter und SAP HANA
Entwicklung einer nativen SAP HANA Anwendung
Entwicklung einer nicht nativen SAP HANA Anwendung mit Java
Auswertung der Tweets mit Textanalyse
Fazit
Links & Literatur
Über OPITZ CONSULTING
Welche Möglichkeiten bietet SAP HANA für Java-Applikationen und wie
können Softwarearchitekten und Entwickler diese nutzen? Neben einer
kurzen Vorstellung der In-Memory optimierten Lösungskomponenten, die
SAP HANA bereitstellt, werden unterschiedliche Szenarien zur Nutzung von
SAP HANA aus einer Java-Anwendung aufgezeigt.
Dabei geht es neben der Darstellung von funktionalen Möglichkeiten,
wie der direkten Analyse transaktionaler Daten, der Verarbeitung unstrukturierter Informationen aus sozialen Medien oder verschiedenen Algorithmen zum Mining großer Datenmengen, auch um die verschiedenen
Schnittstellen, mit denen diese Funktionen aus einer Java-Anwendung
angesprochen werden können.
Texte und Abbildungen wurden mit größter Sorgfalt erarbeitet. OPITZ CONSULTING kann jedoch für eventuell verbleibende fehlerhafte Angaben und
deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Das Recht an dargestellten Verfahren, Showcases, Implementierungsbeispielen und Sourcecodes liegt ausschließlich bei OPITZ CONSULTING.
© OPITZ CONSULTING GmbH 2014
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 2
Für die Entwicklung von Anwendungen auf der SAP HANA Plattform stehen dem Entwickler zwei Programmiermodelle zur Verfügung, mit denen
er die Daten und Funktionen der Plattform nutzen kann:
Was hat sich verändert?
Wirft man einen Blick in heutige Unternehmen, so stellt man fest, dass sich
die Anforderungen erheblich verändert haben. Unternehmen sind stärker
als früher unter Druck, Informationen über verschiedene Kanäle zu sammeln und zeitnah auszuwerten. Bisherige Verfahren und Architekturen
stoßen bei der Speicherung und der zeitnahen Analyse großer, unterschiedlicher Datenmengen an die Grenzen von Machbarkeit und Wirtschaftlichkeit.
Insbesondere die Notwendigkeit zur Voraggregation der Daten führt bei
großen Datenmengen zu einer hohen Redundanz und erschwert die zeitnahe Erstellung von Analyseergebnissen. Dazu kommen die unterschiedlichen Datenformate, die zu verarbeiten sind und die bestehende Architekturen vor neue Herausforderungen stellen.
Um diesen Problemen entgegenzuwirken, wurde mit Polyglot Persistence
ein Architekturpattern entwickelt, dass die Speicherung der Daten je nach
ihrer Herkunft in ein passendes Datenbanksystem übernimmt. Dieses Konzept birgt allerdings neue Risiken, vor allen im Betrieb, da mit Polyglot
Persistence nun nicht nur eine, sondern gleich mehrere Datenbanken betrieben werden müssen.
Allein die Datenmengen, die soziale Medien hervorbringen und die für die
Informationsgewinnung zunehmend wichtiger werden, sind riesig. Wurden
früher via Twitter nur Freunde informiert, wird der Kurznachrichtendienst
heute unter anderem auch für Marketing oder Recruiting eingesetzt. So
wurden beispielsweise bei der vergangenen Weltmeisterschaft in Brasilien
während der gesamten Turnierzeit 672 Millionen Tweets abgesetzt.
Native Anwendungsentwicklung
Die Entwicklung einer nativen Anwendung erfolgt mit den SAP HANA
Entwicklungswerkzeugen (Eclipse- oder webbasiert). Native Anwendungen
werden direkt auf der SAP HANA Plattform ausgeführt und benötigen
keine zusätzliche Laufzeitkomponente wie einen Anwendungsserver. Die
Entwicklung der datenintensiven Geschäfts- und Kontrollflusslogik kann
entweder mit SQLScript oder mit JavaScript im Kontext der Plattformkomponente SAP HANA Extended Application Services (XS) erfolgen.
Nicht native Anwendungsentwicklung
Nicht native Anwendungen werden außerhalb der SAP HANA Entwicklungsplattform (z. B. in Java, C++, ABAP) entwickelt, getestet und bereitgestellt und greifen über einen entsprechenden Treiber (z. B. JDBC, ODBC,
ADBC) auf die Daten und SQL-Funktionen der SAP HANA Plattform zu.
Abbildung 1 zeigt die grundlegende Architektur für native und nicht
native SAP HANA Anwendungen. So zeigt die linke Seite die zweischichtige
Architektur einer nativen Anwendung, bei der mittels eines Browsers über
das HTTP-Protokoll auf die Anwendung zugegriffen wird.
Die rechte Seite zeigt die dreischichtige Architektur einer nicht nativen
Anwendung, bei der der Anwender über einen Browser, Rich Client oder
Fat Client auf die Applikationslogik mit dem jeweiligen Protokoll zugreift.
Mit SAP HANA hat SAP eine Datenbank entwickelt, die neuste HardwareTechnologien mit einem effektiven In-Memory-Datenmanagement verbindet und dadurch neue Chancen für die Entwicklung von Anwendungen
eröffnet. So kann auf die Voraggregation von Daten verzichtet werden und
die Verarbeitung von strukturierten als auch von unstrukturierte Daten
erfolgt in derselben Datenbank. Mit SAP HANA entfällt außerdem die aufwendige Aufbereitung der Daten für OLAP-Systeme. Das reduziert die
Anzahl der Datenbanken sowie ETL-Strecken stark und vereinfacht komplexe Systemlandschaften.
Mit SAP HANA stellt der Hersteller nicht nur eine Datenbank auf einer
dedizierten Hardware zur Verfügung, sondern auch eine Plattform für die
Entwicklung von Echtzeitanwendungen. So liefert SAP HANA funktionale
Komponenten wie GeoSpatial, Text Mining, Bibliotheken für Predictive
Analysis und Data Mining, deren Algorithmen für die In-MemoryVerarbeitung optimiert wurden und eng an die Datenbank gekoppelt sind.
© OPITZ CONSULTING GmbH 2014
Abbildung 1: Gegenüberstellung nativer und nicht nativer SAP HANA
Anwendungen (Quelle: SAP HANA Developer Guide [1])
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 3
Abbildung 2 stellt die zur Verfügung stehenden Programmiersprachen und
zugehörigen Umgebungen der SAP HANA Plattform dar. Je nach Anwendungsfall beziehungsweise Architekturausrichtung wird eine der entsprechenden Technologien ausgewählt, um die Leistungsfähigkeit von SAP
HANA optimal für die Anwendungslogik nutzen zu können. So kann z. B.
die Entwicklung der Anwendungslogik einer nativen SAP HANA Anwendung mit Hilfe der Core Data Services (CDS), HDBtable und SQLScript erfolgen. Mit serverseitigem JavaScript (XSJS) wird ebenfalls Anwendungslogik
implementiert, die direkt auf der SAP HANA Plattform ausgeführt wird.
Für die Speicherung der Twitter-Nachrichten wird eine Tabelle „TWEETS“ in
SAP HANA wie folgt angelegt:
Abbildung 3: Definition der Tabelle „TWEETS“ in SAP HANA Studio
Der Zugriff auf die Persistenzschicht erfolgt entweder direkt mittels der
JavaScript Database API oder unter Verwendung des OData-Standards. Für
die Erstellung der User Interfaces, die an die serverseitigen JavaScript- oder
OData Services gebunden werden, kann das integriere SAPUI5 HTML5 SDK
oder auch jede andere Open Source Library verwendet werden.
Für die Anbindung von nicht nativen SAP HANA Anwendungen, stehen je
nach verwendeter Programmiersprache die entsprechenden Treiber zur
Verfügung. So erfolgt der Zugriff auf die SAP HANA Datenbank für JavaAnwendungen via JDBC, für C/C++/.NET Anwendungen via ODBC und
ADO.NET oder für ABAP-Anwendungen via ADBC.
Entwicklung einer nativen
SAP HANA Anwendung
Native SAP HANA Anwendungen nutzen die Technologie und die Services,
die durch die integrierte SAP HANA Extended Application Services (XS)
bereitgestellt werden. Für die Entwicklung von nativen SAP HANA Anwendungen sind folgende Rahmenbedingungen zu berücksichtigen:
■
■
■
Alle Artefakte der Anwendung werden im internen Repository
der SAP HANA Plattform gespeichert.
Serverseitige Anwendungslogik wird entweder mit SQLScript
oder mit Hilfe von serverseitigem (XS) JavaScript erstellt.
Die Darstellung des Benutzerinterfaces erfolgt ausschließlich im Client
(Browser oder Mobile).
Mit den SAP HANA Extended Application Services (XS) wird des Weiteren
ein Satz von serverseitigen JavaScript Application Programming Interfaces
(API) zur Verfügung gestellt, mit denen eigene Anwendungen erweitert
werden können. So erfolgt z. B. mit der ausgelieferten Database API der
Zugriff mittels SQL auf die Tabellen, Views, Analytical- und CalculationViews sowie auf Stored Procedures. Ebenfalls besteht die Möglichkeit,
mittels HTTP-Requests Daten von einem Service abzurufen oder immer
wiederkehrende Aufgaben automatisiert zu starten. Die folgende Tabelle
stellt die zur Verfügung stehenden APIs dar:
Abbildung 2: Techniken für die Entwickung von Anwendungen auf Basis
von SAP HANA (Quelle: SAP HANA Developer Guide [1])
Wetteranalyse via Twitter
und SAP HANA
Im folgenden Beispiel wird die Speicherung und Auswertung mit Hilfe der
integrierten Textanalyse von Wetterdaten aus dem sozialen Netzwerk Twitter in SAP HANA gezeigt. Hierzu wird exemplarisch nach Tweets mit Tags
wie #wetter oder #wetterstation gesucht. Mit Hilfe der integrierten
Textanalyse von SAP HANA sowie den geographischen Daten der Tweets,
kann eine „soziale“ Wetterkarte erstellt werden.
© OPITZ CONSULTING GmbH 2014
API
Beschreibung
Database
Die Database API erlaubt dem Entwickler, eine Verbindung
zur Datenbank aufzubauen. So können z. B. Transaktionen
gestartet, geschlossen oder abgebrochen sowie SQLStatements und -Prozeduren ausgeführt werden.
Outbound
Connectivity
Die Outbound Connectivity API ermöglicht Zugriffe auf
HTTP-Ziele, die Services zur Verfügung stellen, die durch die
SAP HANA XS Anwendung genutzt werden können.
Request Processing
Mit der Request Processing API wird sowohl lesend als auch
schreibend auf den Kontext des aktuellen HTTP-Requests
zugegriffen. So kann der Entwickler den Inhalt des Request
und des Response verändern.
Die zeitliche Steuerung von immer wiederkehrenden Aufgaben, die im Hintergrund ausgeführt werden sollen, kann mit
Hilfe der Job Schedule API realisiert werden.
Job Schedule
Trace
Mit der Trace API wird auf die verschiedensten Trace-Levels
zugegriffen und Traces durch die Anwendung generiert. Die
erzeugten Dateien können im SAP HANA Studio in der
Perspektive Administration unter der Sektion Diagnosis Files
eingesehen werden.
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 4
Für das Lesen von Tweets, die mit den HashTag #wetter oder
#wetterstation gekennzeichnet wurden, benötigen wir in unserem Beispiel
sowohl die Outbound Connectivity API als auch die Job Schedule API.
Twitter bietet entsprechende REST-Services an, um nach Tweets zu suchen.
Für die Nutzung der Outbound Connectivity muss dem SAP HANA User,
unter dem die Anwendung läuft, die Rolle HTTPDestViewer zugeordnet
werden. Die Konfiguration der Eigenschaften der HTTP-Verbindung erfolgt
in einer separaten Datei mit einer speziellen Syntax und der Extension .xshttpdest. Für den Zugriff auf den Twitter REST-Service wird folgende
Konfiguration in der wetter.xshttpdest-Datei benötigt:
description = "Wetteranalyse mit Twitter";
host = "api.twitter.com";
Für die Abfrage der Tweets wird Twitter‘s REST-API GET search/tweets
verwendet. Damit die Schnittstelle benutzt werden kann, muss man sich
über OAuth identifizieren. Für die Authentifizierung zur Benutzung der
REST-API für die Suche nach Tweets ist die Application-only-Authentication ausreichend, da für diesen Kontext keine benutzerspezifischen Daten benötigt werden und ein sogenannter „Inhaber-Token“ ausreichend ist.
Mit folgendem Codeabschnitt kann ein Inhaber-Token innerhalb der SAP
HANA XS Engine angefordert werden:
function getTweets(maxId) {
var searchQuery = "/1.1/search/tweets.json?q=%23wetter%
20OR%20%23wetterstation&max=1000";
var dest = $.net.http.readDestination
("opitz.wetteranalyse", "wetter");
var client = new $.net.http.Client();
port = 443;
if (maxId !== null && maxId !== '') {
searchQuery = searchQuery + "&since_id=" + maxId;
}
pathPrefix = "";
useProxy = false;
proxyHost = "";
proxyPort = 0;
var req = new $.web.WebRequest($.net.http.GET,
searchQuery);
authType = none;
useSSL = true;
timeout = 0;
Die Abfrage der neusten Tweets mit den HashTag #wetter oder
#wetterstation erfolgt in einem serverseitigen JavaScript. Damit dieses
Script regelmäßig durch die Job Schedule aufgerufen wird, muss die Abfrage der aktuellsten Tweets in einer JS-Funktion eingebettet sein.
function getTweets(maxId) {
var dest = $.net.http.readDestination
("opitz.wetteranalyse", "wetter");
var tweets = JSON.parse(getTweets(getLastId
(conn)).asString());
if (tweets !== null && tweets.statuses !== null
&& tweets.statuses.length > 0) {
var count = tweets.statuses.length;
for (index = 0; index < count; index++) {
saveTweet(conn, tweets.statuses[index]);
}
conn.commit();
}
}
© OPITZ CONSULTING GmbH 2014
return client.getResponse().body;
}
Nach Erhalt des Inhaber-Token können die neusten Tweets zu den Hashtags #wetter oder #wetterstation wie folgt abgerufen werden:
function collectWetterTweets() {
var conn = $.db.getConnection
("opitz.wetteranalyse::wetteranalyse");
try {
var index = 0;
} catch (ex) {
$.trace.error(ex.message);
} finally {
if (!conn.isClosed()) {
conn.close();
}
}
req.headers.set("Authorization", "Bearer " +
getBearerToken());
client.request(req, dest);
var client = new $.net.http.Client();
var req = new $.web.WebRequest($.net.http.GET,
"/1.1/search/tweets.json?q=%23wetter%
20OR%20%23wetterstation&since_id ="+maxId);
req.headers.set("Authorization", "Bearer " +
getBearerToken());
client.request(req, dest);
return client.getResponse().body;
Zuletzt müssen die Tweets in der Datenbank gespeichert und ausgewertet
werden. Dies kann entweder mittels der Database Library der XS-Engine
oder unter Verwendung des OData Services erfolgen.
Damit die Daten kontinuierlich über die Rest-API ermittelt und in der Datenbank persistiert werden können, wird ein entsprechender Scheduler
aufgesetzt. Hierzu ist in der SAP HANA XS-Engine (siehe Tabelle 1) eine API
implementiert, die es erlaubt, entsprechende Aufgaben zu bestimmten
Zeiten bzw. in bestimmten Zeitabständen durchzuführen. Ein solcher Job
wird über eine spezielle Datei, der *.xsjob-Datei, aufgesetzt.
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 5
Zum Lesen und Speichern der Wetter-Tweets in einem Interval von fünf
Minuten wird folgende Job-Definition aufgesetzt:
{
"description": "Wetteranalyse mittels Twitter",
"action":
"opitz.wetteranalyse:wetteranalyse.xsjs::collectWetterTweet
s",
"schedules":
[
{
"description": "Lesen der Tweets mit den
Hashtags #wetter und #wetterstation",
"xscron": "* * * * * */5 *",
"parameter": { }
}
]
}
Nach der Aktivierung der xsjob-Datei wird der Job noch nicht gestartet
und ausgeführt. Das Starten des Jobs erfolgt über das XS HANA Administration Tool. Das Starten des Jobs über das HANA XS Admininstration Tool
kann allerdings nur durch einen Benutzer ausgeführt werden, der über die
Rolle sap.hana.xs.admin.roles::JobAdministrator verfügt.
Entwicklung einer nicht nativen
SAP HANA Anwendung mit Java
Nicht native Anwendungen, die auf die SAP HANA Plattform zugreifen,
können die Services nutzen, die durch die integrierte XS-Technologie bereitgestellt werden. Die nicht native Anwendung wird im Vergleich zur
nativen Anwendung auf einem externen Application Server ausgeführt.
Mit dem Pattern der nicht nativen Anwendung werden alle Szenarien
bezeichnet, bei der die Entwicklung und die Ausführung der Anwendung
außerhalb der SAP HANA Plattform erfolgt. Die Anwendungslogik der nicht
nativen SAP HANA Anwendung läuft auf einem externen Application Server oder als Standalone-Anwendung und greift auf das Datenmodell durch
die Verwendung von z. B. einer JDBC-Verbindung auf die entsprechenden
Tabellen, Views oder Analytical bzw. Calculation Views zu.
Im Java-Umfeld kann dies sowohl direkt mittels der JDBC-API oder indirekt
über die Java Persistence API (JPA) erfolgen. Sowohl die aktuelle Version
von Hibernate 4.3.5 als auch EclipseLink 2.5.2 unterstützen den Zugriff auf
die SAP HANA Datenbank via JPA und JDBC. Jedoch gibt es einige Einschränkungen und bekannte Bugs, die auf den entsprechenden Internetseiten zu finden sind. Die Einschränkungen bei der Verwendung von EclipseLink und SAP HANA sind unter [2] zu finden.
Im Folgenden wird gezeigt, wie die bereits oben entwickelte XS Anwendung zur Speicherung von Twitter-Nachrichten nun mittels einer externen
Java-Anwendung und JPA in der Datenbank persistiert werden können.
Hierzu wird dasselbe Datenbankschema verwendet. Im Gegensatz zur nativen SAP HANA Anwendung werden nun die Daten direkt von der
Streaming API abgegriffen und nicht über einen REST-Service. Durch die
Verwendung der Streaming API können Entwickler auf den globalen Datenstrom der Tweets mit einer geringen Latenz zugreifen.
© OPITZ CONSULTING GmbH 2014
Ein entsprechender Streaming-Client veröffentlicht Nachrichten über
Tweets und weitere Ereignisse, ohne dass ständig über die RESTSchnittstelle eine Abfrage gestartet werden muss. Hierzu stellt Twitter die
folgenden Streaming-API für die unterschiedlichsten Anwendungen bereit:
■
■
■
Public Streams: Streams der öffentlichen Daten innerhalb von Twitter.
Diese Daten können zur Auswertung über Personen, Themen oder Data
Mining verwendet werden.
User Streams: Mit Hilfe dieses Streams können die Daten eines einzelnen Benutzers aufgezeichnet werden.
Site Streams: Site Streams sind die Multi-User-Version der User
Streams. Site-Streams sind für Server gedacht, die sich im Namen von
vielen Usern bei Twitter anmelden.
Im Gegensatz zur Implementierung der Anwendung als native SAP HANA
XS Anwendung, wo die Tweets über die REST-Schnittstelle abgegriffen
werden, kann auf die Public Streams mit Hilfe der Streaming API zugegriffen werden. Zur Speicherung der Tweets wird ein entsprechendes ORMapping der Tabellen für EclipseLink benötigt. Im Rahmen des Mapping
der Tabellen auf die entsprechenden POJOs sind keine Besonderheiten zu
beachten. Lediglich der SAP HANA JDBC Treiber (ngdbc.jar) muss sich zusätzlich zu den obligatorischen Libraries im Classpath der Anwendung
befinden. Damit EclipseLink erkennt, dass es sich um eine SAP HANA Datenbank handelt, muss das Property eclipselink.target-database gesetzt sein. Die persistence.xml stellt sich für unser Beispiel wie folgt dar:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/
persistence http://xmlns.jcp.org/xml/ns/persistence/
persistence_2_1.xsd">
<persistence-unit name="TwitterJPA" transactiontype="RESOURCE_LOCAL">
<class>de.sap.hana.twitter.entity.Tweets</class>
<properties>
<property name="eclipselink.jdbc.bind-parameters"
value="true" />
<property name="eclipselink.jdbc.native-sql"
value="false" />
<property name="javax.persistence.jdbc.user"
value="TEST_SKU" />
<property name="javax.persistence.jdbc.password"
value="Secret012" />
<property name="javax.persistence.jdbc.url"
value="jdbc:sap://192.168.5.49:30115/?
autocommit=false" />
<property name="javax.persistence.jdbc.driver"
value="com.sap.db.jdbc.Driver" />
<property name="eclipselink.jdbc.cache-statements"
value="false" />
<property name="eclipselink.target-database"
value="HANA" />
<property name="eclipselink.jdbc.batch-writing"
value="JDBC" />
</properties>
</persistence-unit>
</persistence>
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 6
Das POJO, das für das Mapping zwischen der Datenbank und Businesslogik
benötigt wird, sieht wie folgt aus:
public class TwitterStatusListener implements
StatusListener {
private EntityManager entityManager = null;
public class Tweets implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "Twitter_Seq")
@SequenceGenerator(name = "Twitter_Seq", sequenceName =
"SEQ_TWEETS_ID", allocationSize = 1)
private long id;
public TwitterStatusListener(EntityManager pEntityManager)
{
entityManager = pEntityManager;
}
@Override
public void onStatus(Status status) {
Tweets tweet = new Tweets();
private long twitter_id;
tweet.setTwitter_id(status.getId());
tweet.setUser(status.getUser().getName());
tweet.setText(status.getText());
tweet.setCreateTime(status.getCreatedAt());
private String text;
@Column(name = "CREATION")
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
if (status.getGeoLocation() != null) {
tweet.setLatitude(Double.valueOf(status.getGeoLocation
().getLatitude()));
tweet.setLongitude(Double.valueOf(status.getGeoLocation
().getLongitude()));
}
private String user;
private Double latitude;
private Double longitude;
Bis auf das Attribut createTime des POJOs „Tweet“, wurden alle Attribute
analog der Tabellendefinition gewählt. Das Attribute createTime wird
durch die Annotation auf das Datenbankattribut CREATION gemappt. Zur
Erzeugung der eindeutigen ID des Datensatzes wird die Sequence
SEQ_Twitter_ID verwendet. Dieser Wert wird dem Javaobjekt automatisch
über die Java Persistence API (JPA) zugewiesen.
Das Streaming der Tweets zu den oben genannten HashTags erfolgt mit
der twitter4j Library. Diese Library stellt mit der Klasse TwitterStream eine
entsprechende Implementierung bereit, mit der die Tweets gelesen werden
können. Die Klasse TwitterStream wird mit Hilfe der Factory TwitterStreamFactory erzeugt. Um den Stream auf bestimmte HashTags zu begrenzen, wird eine FilterQuery entsprechend initialisiert und der Methode
filter() des TwitterStreams übergeben.
factory = Persistence.createEntityManagerFactory
("TwitterJPA");
entityManager.getTransaction().begin();
entityManager.persist(tweet);
entityManager.getTransaction().commit();
}
@Override
public void onException(Exception ex) {
}
@Override
public void onDeletionNotice(StatusDeletionNotice
statusDeletionNotice) {
}
@Override
public
void onTrackLimitationNotice(int
numberOfLimitedStatuses) {
}
public void onScrubGeo(long userId, long upToStatusId) {
}
@Override
public void onStallWarning(StallWarning warning) {
}
EntityManager em = factory.createEntityManager();
initTwitterFactory();
TwitterStream stream = twitterfactory.getInstance();
Im Gegensatz zur nativen SAP HANA Anwendung wird durch die Verwendung der Streaming-API von Twitter kein Job benötigt, mit dem der Start
der Sammlung und Speicherung von Tweets gesteuert wird.
stream.addListener(new TwitterStatusListener(em));
FilterQuery query = new FilterQuery();
stream.filter(query.track(new String[] { "#wetter",
"#wetterstation" }));
Zum Auswerten der Tweets wird eine Implementierung des Interfaces
TwitterStatusListener benötigt. Die Zerlegung der Tweets in ihre Bestandteile sowie der Speicherung in der SAP HANA Datenbank erfolgt in der zu
implementierenden Methode onStatus(Status status).
© OPITZ CONSULTING GmbH 2014
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 7
Auswertung der Tweets
mit Textanalyse
Das Ergebnis der SQL Abfrage zeigt Abbildung 5:
Um nach bestimmten Informationen in den gespeicherten Tweets zu suchen, wird ein Volltextindex in SAP HANA mit folgendem SQL-Ausdruck
angelegt.
CREATE FULLTEXT INDEX "TWEETS_ANALYSIS" ON
"TWEETS"("TEXT") FUZZY SEARCH INDEX ON
CONFIGURATION 'EXTRACTION_CORE_VOICEOFCUSTOMER'
TEXT ANALYSIS ON
Neben der Volltextsuche mittels SQL/MM Standard erlaubt der angelegte
Index, Resultate der Textanalyse bei der Abfrage zu berücksichtigen. Über
unterschiedliche Konfigurationen werden die von SAP HANA durchgeführten linguistischen Analysen definiert. Die Analyseergebnisse stehen in einer
automatisch erstellte Tabelle mit dem Prefix $TA im eigenen Schema. Die
Textanalysen basieren auf bereitgestellten Wörterbüchern, die ebenfalls
inhaltlich erweitert werden können.
Abbildung 5: Mögliches Ergebnis einer SQL Suche in den Twitter Feeds
Bei der Textanalyse werden ebenfalls Stimmungen erkannt, die wie folgt
abgefragt werden können:
SELECT "TWEETS"."ID",
"TWEETS"."TEXT","$TA_TWEETS_ANALYSIS"."TA_TOKEN"
"$TA_TWEETS_ANALYSIS","TWEETS"
FROM
WHERE "$TA_TWEETS_ANALYSIS"."ID" = "TWEETS"."ID" AND
"TA_TYPE" = 'StrongPositiveSentiment';
So sucht obiger SELECT-Ausdruck nach Tweets, die sich positiv über das
Wetter äußern.
Abbildung 4 zeigt die Definition der Tabelle $TA_TWEET_ANALYSIS, in der
die Ergebnisse der Textanalyse abgelegt werden. Die Spalte „TA_TOKEN“
speichert den entsprechend erkannten String, wie z. B. „22.0°C“ oder „Kiel“, Möglich sind auch lokationsbasierte Abfragen auf Basis der SAP HANA
GeoSpatial Engine. In den Spalten LONGITUDE und LATITUDE der Tabelle
und die Spalte „TA_TYPE“ den erkannten Entity-Typ wie z. B. „MEASURE“
TWEETS wird der Längen- und Breitengrad des Tweets gespeichert. Mit
oder „LOCALITY“.
Hilfe des Datentyps ST_POINT Datentyps können so Berechnungen auf
Basis der Lokation durchgeführt werden und auf einer Landkarte dargestellt werden.
Fazit
Für SAP HANA lassen sich im Wesentlichen zwei unterschiedliche Ansätze
zur Entwicklung eigener Anwendungen unterscheiden:
Abbildung 4: Definition der automatisch generierten Tabelle
$TA_TWEETS_ANALYSIS zur Aufnahme der Textanalyse-Ergebnisse
Folgender SELECT Ausdruck sucht Tweets die in ihrem Text eine Kennzahl
(wie z.B. Temperatur), und gleichzeitig den String „Gewitter“ enthalten: SELECT "TWEETS"."ID",
"TWEETS"."TEXT","$TA_TWEETS_ANALYSIS"."TA_TOKEN", snippets
("TEXT") FROM "$TA_TWEETS_ANALYSIS","TWEETS"
WHERE "$TA_TWEETS_ANALYSIS"."ID" = "TWEETS"."ID" AND
"TA_TYPE" = 'MEASURE' AND CONTAINS(TEXT,'Gewitter');
Zum einen native SAP HANA Anwendungen, die direkt auf der SAP HANA
Plattform ausgeführt werden und keinen Applikationsserver benötigen. Bei
der Umsetzung der Geschäftslogik ist man bei nativen Anwendungen allerdings auf JavaScript und datenbanknahes SQLScript beschränkt. PlattformFunktionen wie die GeoSpatial Engine, Textanalyse, Predicitve Analysis oder
auch die Auswertung transaktionaler Daten können ohne Einschränkungen
genutzt werden. Speziell für diese Anwendungen liefert SAP eine eigene
Programmiersprache namens River. Der Zugriff vom Client erfolgt hauptsächlich per OData.
Im Weiteren stehen Standard-Schnittstellen wie JDBC, ODBC und ADO.NET
zur Verfügung, um komplexere Geschäftslogik mit bewährten und bereits
eingesetzten Methoden und Technologien zu entwickeln. Bei der Verwendung von ORM-Technologien ist, wie bei anderen Datenbanksystemen
auch, auf die Spezifika von SAP HANA zu achten.
Wichtig ist dabei zu betonen, dass sich beide Entwicklungsansätze nicht
ausschließen, sondern dass hybride Anwendungen möglich sind, die
Vorteile der nativen Anwendung mit z. B J2EE-Anwendungen verbinden.
© OPITZ CONSULTING GmbH 2014
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 8
Links & Literatur
[1]
HANA Developer Guide 1.1–2014-08-21:
http://help.sap.de/hana/SAP_HANA_Developer_Guide_en.pdf
[2]
Eclipselink Development HANA Plattform:
http://wiki.eclipse.org/EclipseLink/Development/DatabasePlatform/
HANAPlatform#Limitations_of_the_Platform
Über OPITZ CONSULTING
Als führender Projektspezialist für ganzheitliche IT-Lösungen tragen wir
zur Wertsteigerung der Organisationen unserer Kunden bei und bringen IT
und Business in Einklang. Unser Leistungsspektrum umfasst ITStrategieberatung, individuelle Anwendungsentwicklung, SystemIntegration, Prozessautomatisierung, Business Intelligence, Betriebsunterstützung der laufenden Systeme sowie Aus- und Weiterbildung im hauseigenen Schulungszentrum. Mit OPITZ CONSULTING als zuverlässigem Partner können sich unsere Kunden auf ihr Kerngeschäft konzentrieren und
ihre Wettbewerbsvorteile nachhaltig absichern und ausbauen.
OPITZ CONSULTING wurde 1990 gegründet und beschäftigt heute an acht
Standorten mehr als 400 Mitarbeiter. Zu unserem Kundenkreis zählen ¾
der DAX30-Unternehmen sowie branchenübergreifend mehr als 600 bedeutende Mittelstandunternehmen.
Folgen Sie uns:
youtube.com/opitzconsulting
@OC_WIRE
slideshare.net/opitzconsulting
xing.com/net/opitzconsulting
© OPITZ CONSULTING GmbH 2014
Whitepaper: In-Memory optimierte Java-Anwendungsszenarien
Seite 9
Herunterladen