W ciągu ostatnich kilku dziesięcioleci bazy danych i analiza danych uległy drastycznej zmianie.

Przedsiębiorstwa mają coraz bardziej złożone wymagania dotyczące analizowania i wykorzystywania danych – a także coraz wyższe standardy dotyczące wydajności zapytań.

Pamięć stała się niedroga, umożliwiając zastąpienie zestawu strategii wydajnościowych wspieranych przez analizę pamięciową.

Procesory i układy GPU zwiększyły wydajność, ale ewoluowały również w kierunku optymalizacji przetwarzania danych równolegle.

Pojawiły się nowe rodzaje baz danych do różnych zastosowań, z których każda ma swój własny sposób przechowywania i indeksowania danych. na przykład, ponieważ obiekty rzeczywiste są łatwiejsze do przedstawienia jako hierarchiczne i zagnieżdżone struktury danych, JSON i bazy dokumentów stały się popularne.

Pojawiły się nowe dyscypliny, w tym inżynieria danych i nauka o danych, obie z dziesiątkami najnowszych narzędzi do realizacji konkretnych celów analitycznych.

Kolumnowe reprezentacje danych stały się głównym nurtem w pracy analitycznej, ponieważ przynoszą ogromne korzyści pod względem szybkości i wydajności.

Mając na uwadze te trendy, pojawiła się przejrzysta okazja do stworzenia typowej reprezentacji w pamięci, z której każdy silnik może korzystać; nowoczesnej, wykorzystującej wszystkie nowe strategie wydajnościowe, które są obecnie dostępne; oraz takiej, która tworzy dzielenie się wiedzą pomiędzy platformami w sposób płynny i efektywny. często jest to celem Apache Arrow. Dowiedz się więcej o pochodzeniu i historii Apache Arrow.

Aby skorzystać z analogii, należy rozważyć wyjazd do Europy na wakacje przed Unią Europejską. aby pojechać do 5 krajów w ciągu 7 dni, można obliczyć sam fakt, że po prostu trzeba było spędzić kilka godzin na granicy w celu kontroli paszportowej i stracić wiele pieniędzy w ramach wymiany walut. tak często działa praca z danymi w pamięci bez Strzałki: ogromne nieefektywności istnieją do serializacji i deserializacji struktur danych, a replika powstaje w procesie, marnując pamięć i zasoby procesora. W przeciwieństwie do tego, Strzałka jest jak wizyta w Europie po UE, a więc i euro: nie czekasz na granicy, a wszędzie jest jedna waluta.

Strzałka łączy w sobie zalety kolumnowych struktur danych z obliczaniem w pamięci. Zapewnia ona korzyści w zakresie wydajności tych nowoczesnych technik, zapewniając jednocześnie elastyczność złożonych danych i dynamicznych schematów. A wszystko to robi w sposób otwarty i ustandaryzowany.

Apache Arrow Core Technologies

Sam Apache Arrow nie jest silnikiem pamięci masowej ani wykonawczym. Został on zaprojektowany, aby funkcjonować jako wspólna podstawa dla kolejnych rodzajów systemów:

Silniki wykonujące SQL (takie jak Drill i Impala)

Systemy analizy danych (takie jak Pandas i Iskra)

Systemy strumieniowe i kolejkowe (takie jak Kafka i Storm)

Systemy magazynowe (takie jak Parkiet, Kudu, Cassandra i HBase)

Strzałka składa się z różnych połączonych technologii przeznaczonych do wbudowania w silniki magazynowe i wykonawcze. Kluczowymi elementami składowymi Strzałki są:

Zdefiniowane zestawy typów danych zawierające zarówno typy SQL jak i JSON, takie jak Int, BigInt, Decimal, VarChar, Map, Struct i Array.

Reprezentacje kanoniczne: Kolumnowe reprezentacje wiedzy w pamięci do obsługi arbitralnie złożonej struktury rekordów zbudowanej na podstawie zdefiniowanych typów danych.

Wspólne struktury danych: Świadome strzałek struktury danych towarzyszących, w tym listy wyboru, tabele hash i kolejki.

Komunikacja międzyprocesowa osiągana w ramach pamięci wspólnej, TCP/IP i RDMA.

Biblioteki danych do odczytu i zapisu danych kolumnowych w wielu językach, w tym Java, C++, Python, Ruby, Rust, Go i JavaScript.

Algorytmy Pipeline i SIMD dla różnych operacji, w tym wybór bitmapy, hashing, filtrowanie, bucketing, sortowanie i dopasowanie.

Columnar In-Memory Compression, w tym zestaw technik zwiększających wydajność pamięci.

Narzędzia do krótkotrwałego utrzymywania się pamięci dzięki pamięci nieulotnej, SSD lub HDD.

Jako takie, Strzałka nie konkuruje z żadnym z tych projektów. Jej głównym celem jest znalezienie się w każdym z nich, aby zapewnić zwiększoną wydajność i większą interoperacyjność. W rzeczywistości, Arrow jest budowana przez wiodących twórców wielu z tych projektów.

Wydajność

Im szybciej użytkownik dotrze do rozwiązania, tym szybciej będzie zadawał inne pytania. Wysoka wydajność prowadzi do większej ilości analiz, większej liczby przypadków użycia i dalszych innowacji. W miarę jak procesory stają się coraz szybsze i bardziej zaawansowane, jednym z kluczowych wyzwań jest zapewnienie efektywnego wykorzystania procesorów w technologii przetwarzania.

Strzałka jest specjalnie zaprojektowana tak, aby zmaksymalizować jej wydajność:

Cache Locality: Bufory pamięci to kompaktowe reprezentacje wiedzy zaprojektowane dla współczesnych procesorów. Struktury są definiowane liniowo, dopasowując się do typowych wzorców odczytu. co oznacza, że dane porównywalnego typu są kolokowane w pamięci. Ułatwia to wstępne ustawianie pamięci podręcznej, minimalizując przestoje procesora wynikające z braków pamięci podręcznej i dostępu do pamięci głównej. Te wydajne przez CPU struktury danych i wzorce dostępu osiągają zarówno tradycyjne płaskie struktury relacyjne jak i nowoczesne złożone struktury danych.

Pipelingi: Wzorce wykonania są zaprojektowane tak, aby wymagały zalet superskalarnej i potokowej natury najnowszych procesorów. często odbywa się to poprzez minimalizację liczby instrukcji w pętli i złożoności pętli. Te ciasne pętle powodują lepszą wydajność i mniejszą liczbę błędów przewidywania gałęziowego.

Instrukcje SIMD: Instrukcje Single Instruction Multiple Data (SIMD) pozwalają na bardziej wydajną pracę algorytmów wykonawczych poprzez wykonywanie wielu operacji podczas jednego cyklu zegara. Strzałka organizuje dane, które mają być dopasowane do operacji SIMD.

Lokalizacja pamięci podręcznej, pipelowanie i operacje superskalarne często zapewniają 10-100x szybsze wykonanie. Ponieważ wiele zadań analitycznych jest związanych z procesorem, korzyści te przekładają się na radykalny wzrost wydajności użytkownika końcowego. Oto kilka przykładów:

PySpark: IBM zmierzył 53-krotny wzrost szybkości przetwarzania danych przez Pythona i Sparka po dodaniu obsługi Strzałki w PySparku

Parkiet i C++: Wczytywanie danych do Parkietu od C++ z prędkością do 4GB/s

Pandas: Odczytywanie w pandkach do 10GB/s

Strzałka również promuje udostępnianie danych bez kopiowania. Ponieważ strzałka jest przyjęta, ponieważ reprezentacja w każdym systemie, jeden system może przekazać dane do zużycia do systemu przeciwnego. A gdy systemy te znajdują się na równoważnym węźle, opisanej powyżej kopii można również uniknąć poprzez wykorzystanie pamięci współdzielonej. sugeruje to, że w wielu przypadkach przenoszenie danych pomiędzy dwoma systemami nie będzie miało żadnego wpływu na koszty ogólne.

Wydajność pamięci

Wydajność pamięci jest wspaniała, ale często pamięć jest ograniczona. Strzałka jest przeznaczona do rysowania, choć informacje nie mieszczą się całkowicie w pamięci. Główny układ zawiera wektory wiedzy i zbiory tych wektorów (zwane też rekordowymi partiami). Rekordowe partie to zazwyczaj 64KB-1MB, licząc od obciążenia, i są zazwyczaj ograniczone do 2^16 rekordów. Poprawia to nie tylko lokalizację pamięci podręcznej, ale także sprawia, że obliczanie w pamięci masowej jest możliwe nawet w sytuacjach słabej pamięci.

Przy wielu klastrach Big Data zaczynających się od 100 do 1000 serwerów, systemy muszą być gotowe do zarabiania w pamięci mieszanej klastra. Strzałka ma na celu osłabienie wartości przenoszonych danych w sieci. Wykorzystuje ona funkcję scatter/gather reads and writes oraz posiada projekt zerowej serializacji/ deserializacji, co pozwala na tanie przesyłanie danych pomiędzy węzłami. Strzałka współpracuje również bezpośrednio z interkonektami obsługującymi RDMA w celu dostarczenia jednej sieci pamięci dla większych obciążeń pamięci.

Obsługa języka programowania

Inną istotną zaletą przyjęcia Apache Arrow, oprócz większej wydajności i interoperacyjności, może być równe szanse dla różnych języków programowania. Tradycyjne współdzielenie danych jest oparte na integracji na poziomie IPC i API. Choć często jest to proste, wpływa to negatywnie na wydajność, gdy język użytkownika różni się od języka podstawowego systemu. Licząc na język, a co za tym idzie na zestaw zaimplementowanych algorytmów, transformacja językowa powoduje, że większa część przedziału czasowego następuje.