Wie viele Schulen gibt es auf der Welt? Einlesen von Hunderten von Gigabyte an Daten in die JVM von Apache Arrow / Sudo Null IT News

JVM ist die Hauptplattform für Big-Data-Lösungen wie Hadoop, Spark, Presto, NiFi, aber die Leistung wird durch das Kopieren/Serialisieren von Daten „für jedes Niesen“, gefolgt von Garbage Collection und dem Fehlen von SIMD-Optimierungen bei der Arbeit mit Daten, erheblich beeinträchtigt.

Ist es möglich, Hunderte von Gigabyte an Parquet-Dateien in einem JVM-Programm ohne Spark/Hadoop zu lesen? Dabei hilft uns die Apache-Arrow-Bibliothek – ein Projekt, das verbindet Dutzende von Lösungen mit Big Data zu arbeiten. Aber dazu braucht es noch nicht einmal einen Cluster mit Tausenden von Kernen und Petabyte Speicher!

Als Beispiel messen wir mit unbekannter Genauigkeit die “Durchschnittstemperatur in einem Krankenhaus” – wir werden im OpenStreetMap-Projekt die Anzahl der Schulgebäude auf der ganzen Welt zählen. Und wenn sie sagen, dass Bildung überflüssig ist und in der Schule viel unnötiges Wissen vermittelt wird, dann möchte ich sofort eine Frage stellen. Stellen Sie sich vor, wohin Menschen, die von den “Fesseln der Bildung” befreit sind, eilen und was sie im Erwachsenenalter können werden? Nur ein Konsument von Inhalten zu sein?

Die Quelldaten für das Beispiel sind also OpenStreetMap planet-220704.osm.pbf Ich werde hier nicht darauf eingehen, wie man sie in Parkettdateien umwandelt, kann ich nur empfehlen OpenStreetMap Parquetizer als eine der Optionen.

Beginnen wir mit der klassischen Verarbeitungslösung – in PostGIS berechnen wir, dass weltweit 1005638 Gebäude getaggt sind wie ist die Schule.

Wir werden die Daten des Planeten von PostGIS in einem mit kompatiblen Schema übernehmen pgsnapshotmit installierter Erweiterung h3-pg . Die Datenbank belegt 588 GB und läuft in einem Docker-Container auf einem Laptop mit 16 GB RAM und einem Samsung 970 EVO Plus M.2-Laufwerk:

Für das Bild mit dem KDPV wurden die Daten durch eine Abfrage aufbereitet und für diejenigen, die die Visualisierung wiederholen möchten, habe ich die Daten zusammen mit den Grenzpolygonen gespeichert Kern:

Tischschule erstellen als select h3_3, count

als “Zählen” von Wegen, wo geschlossen und tags->’building’ = ‘school’ oder (tags->’building’ is not null and tags->’amenity’=’school’) group by h3_3 order by 2 desc Die Aufschlüsselung der Daten nach Regionen für die Aggregation erfolgte im hierarchischen H3-System weiterAusfallstufe 3

. Und nur die Regionen, in denen es mehr als 100 Schulgebäude pro Region gibt, werden in QGIS visualisiert

wählen Sie h3_to_geo_boundary_geometry(h3_3::h3index), zählen Sie von der Schule, wo count>100

Wie vollständig Daten über Schüler in OpenStreetMap sind, ist eine große Frage. Normalerweise sind die Daten in Millionenstädten relevanter. OpenStreetMap funktioniert nach den gleichen Prinzipien wie Wikipedia, also bei Ungenauigkeiten alle Fragen an die Community.

Und jetzt die Lösung zum Zählen der Anzahl von Schulen auf der ganzen Welt auf Apache Arrow. Hinzufügen von Abhängigkeiten zu maven

Das Ergebnis dieser AusführungProgramme

: 1005636 (806575 ms)

Die Lösung ist also alles andere als ideal, zumindest in Bezug auf zusätzliche Objektzuweisungen und fehlende Funktionen in der Java-Dataset-API: Es reicht nicht aus, nur die für die Berechnung erforderlichen Spalten und Push-Down-Filter zu lesen. Aber die Idee war zu zeigen, dass es möglich ist, 188,2 GB komprimierte zstd-Parquet-Dateien in Java ohne Hadoop/Spark zu verarbeiten! Die Dataset-API in Java ist noch weit von der Funktionalität von Python entfernt, also diejenigen, die das Projekt mit unterstützen möchten 10.000 Sterne auf Github Es gibt vollen Handlungsspielraum! Von den derzeit fehlenden nützlichen Funktionen – Arbeit mit Datenpartitionierungsschemata Hive/Verzeichnis/Dateinamensstil. Warte immer noch auf die Fusion mein PR

um das Apache ORC-Format in der Java Dataset API zu unterstützen. Apache Arrow versucht, ein gemeinsames Datenformat im RAM für die Arbeit mit Spaltendaten in Programmen in verschiedenen Programmiersprachen zu sein. Das Projekt umfasst auch die Gandiva JIT-Expression-Engine und die Dataset-API als universelle Möglichkeit, Daten aus verschiedenen Partitionierungsschemata zu lesen und zu verarbeiten in Parquet, ORC, Arrow IPC , csv aus dem Dateisystem oder Objektspeicher über die S3-API. Das gemeinsame Format bedeutet, dass Sie gemeinsam genutzten Speicher verwenden können, um Daten ohne Konvertierung zwischen verschiedenen Programmiersprachen zu übertragen, speicherabgebildete Dateien verwenden, um mit Arrow IPC-Dateien zu arbeiten, und RDMA, um Daten über das Netzwerk auszutauschen. All diese Funktionen können als Grundlage der nächsten DBMS-Generation und als Verbesserung gegenüber aktuellen Projekten, wie z. B. der Verwendung von Spark, angesehen werdenIntel-OAP (eingeführte Datensatz-API-Datenquelle und Verarbeitungsvektorisierung für Spark SQL). Apache Arrow ist die Basis für GPGPU-Stromschnellen

von NVIDIA. Für diejenigen, die daran interessiert sind, wie Daten in der Arrow Dataset-API gelesen werden, können Sie meine Implementierung sehen arrow_to_database Loader Apache Parquet und Arrow IPC-Dateien in die Datenbank über JDBC und natürlich die DokumentationApache-Pfeil

.

Wenn Sie das Thema Arbeit mit Apache Arrow oder Geodaten interessant finden, schreiben Sie im nächsten Artikel, worüber ich sprechen soll. Willkommen zum Posten von Kommentaren!

Wenn das Bildungssystem vereinfacht wird und die Entwickler aufhören, ihr Wissen weiterzuentwickeln/aktualisieren, wie sie es in den letzten Tagen bei Habré gefordert haben, dann wird IMHO alles wieder an die gleiche Stelle wie bei Pneumoslon im Song „Viel ist möglich …“ rutschen. .”

Similar Posts

Leave a Reply

Your email address will not be published.