http://www.opitz-consulting.com
"Spark vs. PL/SQL" war das Thema unserer Experten Christopher Thomsen und Marian Strüby bei der DOAG 2015 Konferenz und Ausstellung.
Mit Hadoop 2.0 öffnete sich die Big Data-Plattform für neue Algorithmen und Technologien, um auch als Basis für In-memory Computing, Ad-Hoc Query und Streaming-Anwendungen nutzbar zu sein. Apache Spark etabliert sich hier derzeit als Vorreiter unter den Hadoop-Allzweckwaffen und kommt in immer mehr Produkten - unter anderem auch dem Big Data Connector des Oracle Data Integrators und Oracle Big Data Discovery - als Ausführungsframework zum Einsatz. Was Spark ist, wo es in den neuen Oracle-Produkten in welcher Form zum Einsatz kommt und wie sich ETL-Prozesse, -Werkzeuge und die Datenintegration im Data Warehouse dadurch verändern, soll in diesem Vortrag exemplarisch durch Gegenüberstellung von in PL/SQL und Spark implementierten Anwendungsbeispielen aufgezeigt werden.
_ _
Über uns:
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. Mit OPITZ CONSULTING als zuverlässigem Partner können sich unsere Kunden auf ihr Kerngeschäft konzentrieren und ihre Wettbewerbsvorteile nachhaltig absichern und ausbauen.
Über unsere IT-Beratung: http://www.opitz-consulting.com
Unser Leistungsangebot: http://www.opitz-consulting.com
Karriere bei OPITZ CONSULTING: http://www.opitz-consulting.com
4. Sparks Kernkonzept
●Transformationen auf verteiltenResilent Distributed Datasets ausführen
●Verteilung der Datenim„shared-nothing Cluster“ im Arbeitsspeicher oder der Festplatte
5. Mit RDDs arbeiten
RDDRDDRDDRDD Transformation
Aktion Result
val file = sc textFile “myfile.csv“ val data = file map (_ split “;“)
data saveAsTextFile “myresult.txt“
7. Hadoop ist ...
●ein Framework für die Verwaltung vonCluster-Kapazitäten.
●eine Software, welcheRedundanz und Lastverteilung gewährleistet.
●auf Skalierung mit kostengünstigercommodity Hardware ausgelegt.
8. HerstellernutzenHadoopum ...
●ihre Software leichter skalierbarer zu machen.
●performanceoptimierte Appliancelösungen anbzubieten.
●eine kostengünstige Storagealternative anbieten zu können.
9. Data Node Data Node Data Node
Data Node Data Node Data Node
MasterNode i
Die Hadoop Infrastrukturbietet mit YARNeine stan
10. Data Node Data Node Data Node
Data Node Data Node Data Node
MasterNode Konsumenti
Das Hadoop Filesystem (HDFS) bietet eine redundanteundlastverteilte Storageplattform für aufliegendeApplikationen.
11. Cluster
Betriebs-
system
YARN, Mesos
Server x86, ARM
Algorithmus MapReduce, Tez, Slider,
Spark, Flink
Sprache Java, Scala, Python, HiveQL, PigLatin, ...
Applikation Datameer, RapidMiner,
Big Data Discovery, ...
Beowulf, Aiyara
17. Relationale Datenbankensind ...
●Allrounder
●ACID konform
●für interaktive Nutzung durch Konsumenten ausgelegt
Siescheitern häufig an ...
●Datenvolumen im Terabytebereich
●Streaming Applikationen
●nicht tabellarischen Daten
●Kostenstrukturen für Low Value Daten
●Anforderungen die Spezialistentools benötigen
19. VieleHadoop Tools sind ...
●Batchorientierte Werkzeuge
●Generische Plattformen
●Auf maximalen Datendurchsatz optimiert
●für die Verwaltung sehr großer Dateien undTabellen optimiert
Sie sind NICHT geeignet für ..
●wahlfreie Zugriffe
●Abfragen mitniedriger Latenzanforderung
●direkten Zugriffdurch Endkonsumenten
●Die Arbeit mit vielen kleinen Dateienoder vielen kleinen Tabellen
20. PL/SQL Sprachgrundlagen im Vergleich
CREATE FUNCTION myFunc(
someNum IN NUMBER)
RETURN NUMBER
IS
result NUMBER := 0;
BEGIN
FOR a in (SELECT num FROM someTable)
LOOP
BEGIN
IF a.num < 2 ** someNum THEN
result := result – a.num / 2;
ELSE
result := result + a.num - 1
END;
END LOOP;
END;
def myFunc(someNum: Long) = {
Sc textFile "someTable" map { a =>
val num = a.num
if (num < math.pow(2, someN
num / 2
else
num - 1
} reduce (_ + _)
}
PL/SQL Spark
Map und Reduce
Schritt statt
Zählervariable
21. Order
id NUMBER
client NUMBER
item NUMBER
amount FLOAT
status VARCHAR
modified DATE
Client
id NUMBER
name VARCHAR
address VARCHAR
city VARCHAR
country VARCHAR
Item
id NUMBER
name VARCHAR
price FLOAT
density FLOAT
New Orders
PriceHistory
id NUMBER
item NUMBER
price FLOAT
valid DATE
Report
22. Order
id NUMBER
client NUMBER
item NUMBER
amount FLOAT
status VARCHAR
modified DATE
SELECT *
FROM Order
WHERE amount >= 1
AND status LIKE 'Transport%';
SELECT client, ROUND(amount)
FROM Order;
SELECT COUNT(DISTINCT client) FROM Order
WHERE modified >= '2015-11-17';
SELECT item, SUM(amount)
FROM order
GROUP BY amount;
order filter (o => o.amount >= 1
&& o.status startsWith "Transport")
order map (o => o.client -> o.amount.toInt)
(order filter (_.modified.getTime >= format
parse "2015-11-17") map (_.client) distinct
).count
order map (o => o.item -> o.amount)
reduceByKey (_ + _)
case class Order(id: Long, client: Long,
item: Long, amount: Float,
status: String, modified: Date)
val dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss")
val order = sc textFile "Order.csv" map (_ split ";")
map (o => new Order((0).toLong, o(1).toLong,
o(2).toLong, o(3).toFloat, o(4),
dateFormat parse o(5))
SQL Spark
23. Order
id NUMBER
client NUMBER
item NUMBER
amount FLOAT
status VARCHAR
modified DATE
Item
id NUMBER
name VARCHAR
price FLOAT
density FLOAT
Client
id NUMBER
name VARCHAR
address VARCHAR
city VARCHAR
country VARCHAR
Wie viel m³ werden heute in Richtung Südkorea verschifft?
SQL Spark
SELECT SUM(o.amount / i.density)
FROM Order o
INNER JOIN Client c
ON o.client = c.id
INNER JOIN Item i
ON o.item = i.id
WHERE o.status = 'Transport via See'
AND c.country = 'Südkorea'
AND o.modified >= '2015-11-17'
val itemPair = item map (i => i.id -> i)
val targetClient = client filter (
_.country == "Südkorea") map (_.id) first
order filter {
o => o.status == "Transport via See"
&& o.modified.getTime >= new Date().getTime
} map (o => o.item -> o) join itemPair map {
e => e._2._1.amount / e._2._2.density
} reduce (_ + _)
24. neworder.csv
Order
id NUMBER
client NUMBER
item NUMBER
amount FLOAT
status VARCHAR
modified DATE
Client
id NUMBER
name VARCHAR
address VARCHAR
city VARCHAR
country VARCHAR
1;ArcelorMittal;Avenue de la Liberte 12;Luxemburg;Luxemburg
2;Hebei Iron and Steel;Shijiazhuang;Hebei;China
3;POSCO;Dongchon-dong 5;Pohang;Südkorea
4;Tata Steel;Bombay House 24;Mumbai;Indien
5;Gerdau;Av. Farrapos 1811;Porto Alegre;Brasilien
6;ThyssenKrupp;Mannesmannstraße 101;Duisburg;Deutschland
7;Evraz;6 Saint Andrew Street;London;Vereinigtes Königreich
8;Severstal;ul. Stalevarov 45А;Cherepovets;Russland
1010;Hebei Iron and Steel;Shijiazhuang;Hebei;China;Zink;54.07;2015-11-15 09:26:28
1011;Nucor;1915 Rexford Rd 400;Charlotte;Vereinigte Staaten von Amerika;Zink;9.01;2015-11-15 05:27:19
1012;Gerdau;Av. Farrapos 1811;Porto Alegre;Brasilien;Nickel;69.53;2015-11-15 12:47:05
Neue Datensätze hinzufügen
25. neworder.csv
SQL Spark
INSERT into client
SELECT seq_dim_client.nextval,
a.name, a.address, a.city, a.country
FROM (
SELECT DISTINCT
s.client_name,s.address,
s.city, s.country
FROM ext_neworder s
WHERE NOT EXISTS (
SELECT 'x' FROM client t
WHERE s.client_name = t.name
AND s.address = t.address
AND s.city = t.city
AND s.country = t.country)
) a
val nextClientId = client.reduce((a, b) =>
if (a.id > b.id) a else b) map (_.id)
{
{
neworder filter (o => !(client exists {
c => c.name == o.clientName
&& c.address == o
&& c.city == o.city
&& c.country == o
})
}.distinct.zipWithIndex map (
o => new Client(nextClientId + o._2,
o._1.clientName, o._1.addres
o._1.city, o._1.country))
++ client
} saveAsTextFile "stage/client.csv“
Client
id NUMBER
name VARCHAR
address VARCHAR
city VARCHAR
country VARCHAR
26. Item
id NUMBER
name VARCHAR
price FLOAT
density FLOAT
PriceHistory
id NUMBER
item NUMBER
price FLOAT
valid DATE
SQL Spark
INSERT into price_history
SELECT
seq_price_history.nextval, s.id,
s.price, sysdate
FROM ext_item s
WHERE NOT EXISTS (
SELECT 'x'
FROM price_history t
JOIN (
SELECT id, MAX(valid) valid
FROM price_history
GROUP BY id
) h
ON t.id = h.id
AND t.valid = h.valid
WHERE s.id = t.item
AND s.price = t.price);
val recentPrice = priceHistory groupBy (_.item)
map (p => p._1 -> p._2 sortBy (_.valid) last)
{
{
item map (i => i.name -> new )
leftOuterJoin recentPrice
filter (_._2._2.isEmpty)
map (_._2._1)
} ++ priceHistory
} saveAsTextFile "stage/priceHistory.csv“
27. ● Hadoop - Eine Erweiterung für die Oracle DB? (Matthias Fuchs)
17.11.2015 16:00 Uhr Kiew
● Using Analytical SQL to Intelligently Explore Big Data (Keith Laker)
18.11.2015 17:00 Uhr Oslo
● How to choose between Hadoop, NoSQL or Oracle Database
(Jean-Pierre Dijcks) 19.11.2015 12:00 Uhr Stockholm
● Big Data Processing mit Spark (Matthias Höreth)
20.11.2015 9:00 Uhr Helsinki
Weitere Vorträge zu diesem Thema auf der DOAG ...
27
28. •BI Community Event im Rahmen der DOAG K+A
Di. 17.11.2015 ab 18:30 im Landbierparadies Nürnberg Wodanstr. 15
•Unconference: OWB – Was Nun?
Di. 17.11.2015 / 15 Uhr
•Data Vault Forum
Mi. 18.11.2015 / 15 Uhr Galileo Lounge, Ebene 3
•Data Integration Day 2015
Mi. 9.12.2015 / 10 Uhr, Sulzbach (Taunus)
•DOAG BI
8.-9.6.2016, Bonn, Kameha
BI Community - Veranstaltungen
28
29. TO DO BIG DATA
Viel Spaß
aufder
DOAG
Konferenz