JavaOne - T-Shirt Contest

Wie gesagt ich weiß nicht mehr, welche Dimensionen die Matrixen hatte, aber es war so, das man einen Vorteil beim verteilten berechnen hatte :wink:

Ein weiteres Anwendungsfeld, in dem Clustering sinnvoll ist, sind Datamining-Algorithmen. Aber woher soll man da sinnvollerweise Daten nehmen, die man analysieren kann…

Ja, da gibt’s ein paar Test-Datensätze für irgendwelche Contests, und ggf. schaut man mal bei http://www.kaggle.com/ rein und staubt im Idealfall neben dem T-Shirt noch ein paar €€€ ab :o) Aber abgesehen davon, dass die auch erstmal implementiert werden müssen, muss man da wohl auch erstmal ein „Gespür“ dafür haben, welche von Hazelcast wirklich profitieren würden.

Wegen der Matrixmultiplikation habe ich mal ein bißchen überlegt und rumgecodet, aber das ist (… so viel zum Thema „Gespür“ :wink: …) nicht so trivial - zumindest nicht mit dem Strassen, den ich erst in Betracht gezogen habe. Natürlich findet man auch recht schnell sowas wie Loading... , wo wieder CastMapR ins Spiel käme, aber das schreibt man eben auch nicht einfach so hin. Vermutlich wäre es etwas einfacher, wenn man die direkte Multiplikation machen würde, aber auch da stellt sich die Frage, wie man die Daten sinnvoll verteilt. Es macht ja keinen Sinn, wenn JEDER Clusterknoten die komplette Matrix bekommt - aber wenn ich es richtig verstehe, führt da mit Hazelcast erstmal kein Weg dran vorbei, weil man die Daten nicht zum Verarbeiten an die Cluster schickt, sondern alles zu einer einheitlichen Speicherpampe wird. Mit dem Strassen hat man da eh verloren, aber unabhängig davon: Für eine „gute“ Lösung (egal mit welchem Ansatz) müßte man sich wohl noch tiefer in die Details von Hazelcast’s „Near Cache“ usw. reinfräsen.

Zum Thema Data-Mining hab ich hier 10GB Zeitungsartikel rumfliegen mit denen ich mal http://de.wikipedia.org/wiki/Latent_Dirichlet_Allocation veranstaltet habe.

Kannst du die mal hier als Ahnhag posten? :o)

Hab’ jetzt mal ein bißchen an Matrixmultiplikation rumgebastelt, aber das ist noch nichts konkretes. Insbesondere verwendet es noch nicht Hazelcast, aber ich arbeite darauf hin…

Der Smoketest ist durch.

Jetzt geht es noch um die lästigen Kleinigkeiten. Aber ich bin schon mal recht begeistert.

Hab’ mal meinen “Beitrag” auf https://github.com/javagl/HazelcastMatMul veröffentlicht.

Kurz zur Erklärung:

Das ganze ist eine verteilte Matrix-Multiplikation. Es gibt ein paar recht pragmatische interfaces für Matrizen, speziell 2D-Matrizen mit float-Elementen. Zusätzlich gibt es ein Interface “MatrixMultiplicator”, das eben zwei solcher Matrizen multiplizieren und das Ergebnis in eine dritte Matrix schreiben kann. Der wichtigste Kern ist der “ParallelMatrixMultiplicator”. Der ist dafür verantwortlich, die Matrix in kleinere Stücke zu zerlegen, und das Gesamtprodukt aus den kleineren Stücken zu berechnen. Dafür verwendet er einen ExecutorService. Und dieser ExecutorService kann natürlich einer sein, der von Hazelcast stammt.

Der Knackpunkt an dem ganzen ist, dass dieser ParallelMatrixMultiplicator hierarchisch geschachtelt werden kann. Das ist wichtig, damit auf den jeweiligen Hazelcast-Knoten auch alle verfügbaren Resourcen ausgenutzt werden: Die Multiplikation der kleineren Teilmatrizen, die an die Clusterknoten geschickt werden, wird eben wiederum parallel durchgeführt, mit einem “lokalen” Threadpoolexecutor, der die Teilmatrizen weiter zerlegt und damit alle lokal verfügbaren Kerne auslastet. Theoretisch könnte man das beliebig weit schachteln:
100000x100000-Matrix soll multipliziert werden
10000x10000-Matrizen werden an ein einige wenige Workstations (mit schneller Netzanbindung) geschickt
1000x1000-Matrizen werden an viele Desktop-PCs (mit ggf. langsamerer Netzanbindung) geschickt
100x100-Matrizen werden von den einzelnen Kernen der Deskop-PCs multipliziert

Ein bißchen tricky ist da natürlich der Datenstransfer, und es gibt einige Tuning-Parameter für die Zerlegung. Aber bei einem kurzen Test heute im Büro auf mehreren Machinen sah es (ohne konkrete Zahlen nennen zu wollen) so aus, als könnte das bei größeren Matrizen tatsächlich was bringen.

Ob es nun gut oder schlecht ist, dass man das ganze auch ohne Hazelcast laufen lassen könnte, indem man den Hazeclast-ExecutorService durch einen anderen ersetzt, weiß ich nicht. Aber … schließlich dient die Anlehung von Hazelcast an die Standard-API ja gerade dem Zweck, das ganze leicht einklinkbar zu machen…

@Marco13 : deine Testsuite zeugt von Selbstbewusstsein. Find ich gut :smiley:

Tatsächlich zeugt die Tatsache, dass ich die schlicht noch nicht mit gepusht habe, eher von fehlendem Selbstbewußtsein :wink: Die „wichtigsten“ Tests werden eigentlich mit HazelcastMatMul/MatMulTests.java at master · javagl/HazelcastMatMul · GitHub gemacht, und lokal habe ich natürlich noch ein paar weitere, aber die sind noch nicht gepusht. Vielleicht kann bis dahin das, was ich auch mehrfach auf der Seite betont habe, nämlich dass es ein experimenteller proof-of-concept ist, als Rechtfertigung herhalten :o

Da ist mir noch ein Nano-Fehler aufgefallen: HazelcastMatMul/src/main/java/de/javagl/hazelcast/matmul/package-info.java at master · javagl/HazelcastMatMul · GitHub
Dort ist das „experimental“ halb fett und halb kursiv eingefasst. Du solltest dich für eins von beidem entscheiden. :stuck_out_tongue_winking_eye:

Sry, dass ich hier keine konstruktiveren Beiträge abliefere - ich habe mir das Projekt noch nicht genauer angesehen, sondern nur einmal ganz flüchtig die ersten Anlaufstellen gecheckt.

DAS hätte auch ein Unit-Test nicht erfasst :o) Ja, Danke, ein paar weitere “nano-Fehler” hatte ich auch schon gesehen, mal schauen ob ich die gleich mit den Tests zusammen pushen kann.

Der Contest wird noch ein wenig verlängert, da ich erst zu Mitte November wieder eine längere Weile in Deutschland bin :slight_smile:
Einreichungen bis 15. Nov. sind also möglich.

Gibt es schon Einreichungen? Und wenn ja, wie viele?

Bisher offiziell noch keine (außer deiner Anmerkung), aber ist ja auch noch etwas Zeit :slight_smile:

„Anmerkung“? Naja, ich kann dir das, was jetzt auf GitHub steht, natürlich auch nochmal per PN als ZIP schicken, aber das ist wohl nicht nötig :wink:

Majora hatte ja noch was angedeutet… Und vielleicht warten andere noch bis zur „Deadline“…

Kann man auch mehrere Beiträge einreichen? Ich bin ja nicht so sicher, ob so eine Matrixmultiplikation die Kriterien von Originalität und Kreativität erfüllt … :o :wink:

Mir egal, da ich ja später nur eine Abstimmung mache und das Beste gewinnen soll. Von mir aus :slight_smile: Aber einfach startbar sollte es dann ja schon sein :slight_smile:

Ich persönlich hätte ja auch gerne was gemacht, aber mir fehlt eine Idee die ich auch in endlicher Zeit (= wenige Tage) umsetzen kann. Und es muss ja irgendwie auch Sinn machen. Ich bin ja generell immer so ein bisschen mit dem Gedanken unterwegs woraus und womit man ein Spiel machen könnte. Hazelcast würde sich für bestimmte Dinge sicherlich anbieten, aber gerade jetzt mal für ein schnelles Beispiel fehlt mir irgendwie die Idee.

Ja, ich hatte noch was zweites angesetzt… bin aber nicht sicher, ob man da Hazelcast irgendwie „sinnvoll“ drin unterbringen kann: Der Gedanke war grob sowas wie ein Schiffe-Versenken auf einem unendlich großen Spielfeld mit beliebig vielen Spielern, aber… da gibt’s nur rudimentäre Ansätze. Da müßte man noch einiges an Zeit in das Spiel und die entsprechenden Strukturen an sich stecken… um dann am Ende die eine oder andere Map durch eine Hazelcast-Map zu ersetzen :wink:

So, jetzt nochmal Gedanken darüber gemacht wo so verteilte Systeme überhaupt eingesetzt werden bzw warum:

[ul]
[li]Verarbeitung vieler Daten (Skalierbarkeit, Verteilung der Aufgaben, …)
[/li][li]Viel Rechenleistung wird benötigt (s.o.)
[/li][li]Information verteilen → Mehrere Instanzen
[/li][/ul]

Für die Verarbeitung vieler Daten bräuchte man überhaupt erstmal viele Daten.
Software die viel (wirklich viel) Rechenleistung benötigt ist ja in der Regel auch nicht so arg trivial, wenn sie Sinn haben soll. Mir ist da spontan eingefallen irgendwas wegen Bildbearbeitung zu machen, da hatten wir im Studium mal eine tolle Vorlesung und das Rendern dauerte immer ewig. Aber dafür bräuchte man ja erstmal eben dieses Bildbearbeitungsprogramm und DANN könnte man das da implementieren…
Informationen verteilen wäre ja sowas wie bei Torrents.

Da der Kopf jetzt gerade Matsch ist kann ich nicht weiter denken, aber letztlich fällt mir einfach kein Beispiel ein das sinnvoll ist und „mal eben“ gemacht wäre. :frowning:

Das mit den “vielen Daten” ist so eine Sache. Wie schon weiter oben etwas sarkastisch angedeutet: WENN irgendwas gerade gehypt wird, DANN ja “Big Data” (das berechnet man in der Cloud, mit SOA … :o) ). Daten zu finden wäre nicht so das Problem. Ich bin nur nicht sicher, ob das primäre Ziel von Hazelcast die Verarbeitung großer Datenmengen ist, und nicht etwa die verteilten Strukturen an sich (Redundanz etc)… Zumindest beim verteilten ExecutorService kann man aber wohl davon ausgehen.