KPB+ duomenų bazė: nuo finansų iki Formulės 1

KDB+, įmonės produktas KX yra plačiai žinoma siauruose ratuose, itin greita, stulpelinė duomenų bazė, skirta laiko eilučių saugojimui ir jomis pagrįstiems analitiniams skaičiavimams. Iš pradžių jis buvo (ir yra) labai populiarus finansų industrijoje – juo naudojasi visi 10 geriausių investicinių bankų ir daugelis žinomų rizikos draudimo fondų, biržų ir kitų organizacijų. Neseniai KX nusprendė plėsti savo klientų ratą ir dabar siūlo sprendimus kitose srityse, kuriose yra didelis duomenų kiekis, sutvarkytas pagal laiką ar kitaip – ​​telekomunikacijos, bioinformatika, gamyba ir kt. Jie taip pat tapo „Aston Martin Red Bull Racing“ komandos partneriu „Formulėje 1“, kur padeda rinkti ir apdoroti duomenis iš automobilio jutiklių bei analizuoti vėjo tunelio bandymus. Šiame straipsnyje noriu papasakoti, kokios KDB+ savybės daro jį ypač našų, kodėl įmonės nori išleisti daug pinigų ir galiausiai, kodėl tai nėra duomenų bazė.
 
KPB+ duomenų bazė: nuo finansų iki Formulės 1
 
Šiame straipsnyje pabandysiu bendrai papasakoti, kas yra KDB+, kokias jo galimybes ir apribojimus jis turi bei kokia jo nauda įmonėms, norinčioms apdoroti didelius duomenų kiekius. Į KDB+ diegimo detales ar jos Q ​​programavimo kalbos detales nesileisiu – abi šios temos yra labai plačios ir vertos atskirų straipsnių. Daug informacijos šiomis temomis galite rasti adresu code.kx.com, įskaitant knygą Q – Q For Martals (žr. nuorodą žemiau).

Kai kurie terminai

  • Duomenų bazė atmintyje. Duomenų bazė, kuri saugo duomenis RAM, kad būtų galima greičiau pasiekti. Tokios duomenų bazės privalumai yra aiškūs, tačiau trūkumai yra duomenų praradimo galimybė ir poreikis turėti daug atminties serveryje.
  • Stulpelių duomenų bazė. Duomenų bazė, kurioje duomenys saugomi po stulpelio, o ne įrašai po įrašo. Pagrindinis tokios duomenų bazės privalumas yra tas, kad duomenys iš vieno stulpelio yra saugomi kartu diske ir atmintyje, o tai žymiai pagreitina prieigą prie jos. Nereikia įkelti stulpelių, kurie nenaudojami užklausoje. Pagrindinis trūkumas yra tai, kad sunku keisti ir ištrinti įrašus.
  • Laiko eilutės. Duomenys su datos arba laiko stulpeliu. Paprastai tokiems duomenims svarbi laiko tvarka, kad galėtumėte lengvai nustatyti, kuris įrašas yra prieš ar po dabartinio, arba pritaikyti funkcijas, kurių rezultatai priklauso nuo įrašų eilės. Klasikinės duomenų bazės yra sukurtos visiškai kitu principu – reprezentuojančių įrašų rinkinį kaip rinkinį, kur įrašų tvarka iš esmės nėra apibrėžta.
  • Vektorius. KDB+ kontekste tai yra to paties atominio tipo elementų, pavyzdžiui, skaičių, sąrašas. Kitaip tariant, elementų masyvas. Masyvai, skirtingai nei sąrašai, gali būti saugomi kompaktiškai ir apdoroti naudojant vektorinio procesoriaus instrukcijas.

 

Istorinė informacija,

KX 1993 m. įkūrė Arthuras Whitney, anksčiau dirbęs Morgan Stanley banke kurdamas A+ kalbą, APL – labai originalios ir vienu metu populiarios finansų pasaulyje kalbos – įpėdinį. Žinoma, KX Artūras tęsė ta pačia dvasia ir sukūrė vektorinę-funkcinę kalbą K, vadovaudamasis radikalaus minimalizmo idėjomis. K programos atrodo kaip skyrybos ir specialiųjų simbolių kratinys, ženklų ir funkcijų reikšmė priklauso nuo konteksto, o kiekviena operacija turi daug daugiau reikšmės nei įprastose programavimo kalbose. Dėl šios priežasties K programa užima minimalią vietą – kelios eilutės gali pakeisti teksto puslapius tokia žodine kalba kaip „Java“ – ir yra itin koncentruotas algoritmo įgyvendinimas.
 
Funkcija K, kuri įgyvendina daugumą LL1 analizatoriaus generatoriaus pagal pateiktą gramatiką:

1. pp:{q:{(x;p3(),y)};r:$[-11=@x;$x;11=@x;q[`N;$*x];10=abs@@x;q[`N;x]  
2.   ($)~*x;(`P;p3 x 1);(1=#x)&11=@*x;pp[{(1#x;$[2=#x;;,:]1_x)}@*x]  
3.      (?)~*x;(`Q;pp[x 1]);(*)~*x;(`M;pp[x 1]);(+)~*x;(`MP;pp[x 1]);(!)~*x;(`Y;p3 x 1)  
4.      (2=#x)&(@x 1)in 100 101 107 7 -7h;($[(@x 1)in 100 101 107h;`Ff;`Fi];p3 x 1;pp[*x])  
5.      (|)~*x;`S,(pp'1_x);2=#x;`C,{@[@[x;-1+#x;{x,")"}];0;"(",]}({$[".s.C"~4#x;6_-2_x;x]}'pp'x);'`pp];  
6.   $[@r;r;($[1<#r;".s.";""],$*r),$[1<#r;"[",(";"/:1_r),"]";""]]}  

 Artūras įkūnijo šią ypatingo efektyvumo su minimaliais kūno judesiais filosofiją KDB+, kuri pasirodė 2003 m. (manau, dabar aišku, iš kur kilo pavadinimo raidė K) ir yra ne kas kita, kaip ketvirtosios K versijos interpretatorius. Prie K K pridėta patogesnė versija, vadinama Q. Q taip pat pridėjo palaikymą konkrečiam SQL dialektui - QSQL, o interpretatorius - lentelių kaip sistemos duomenų tipo palaikymą, įrankius darbui su lentelėmis atmintyje ir diske ir kt.
 
Taigi iš vartotojo perspektyvos KDB+ yra tiesiog Q kalbos vertėjas, palaikantis lenteles ir į SQL panašias LINQ stiliaus išraiškas iš C#. Tai yra svarbiausias skirtumas tarp KDB+ ir kitų duomenų bazių bei pagrindinis jos konkurencinis pranašumas, kuris dažnai nepastebimas. Tai ne duomenų bazė + išjungta pagalbinė kalba, o visavertė galinga programavimo kalba + įtaisytas duomenų bazės funkcijų palaikymas. Šis skirtumas turės lemiamą vaidmenį išvardijant visus KPB+ privalumus. Pavyzdžiui…
 

Dydis

Pagal šiuolaikinius standartus KDB+ yra tiesiog mikroskopinio dydžio. Tai pažodžiui vienas submegabaitas vykdomasis failas ir vienas mažas tekstinis failas su kai kuriomis sistemos funkcijomis. Realiai – mažiau nei vienas megabaitas, o už šią programą įmonės moka dešimtis tūkstančių dolerių per metus už vieną procesorių serveryje.

  • Šis dydis leidžia KDB+ puikiai jaustis naudojant bet kokią aparatinę įrangą – nuo ​​Pi mikrokompiuterio iki serverių su terabaitais atminties. Tai neturi jokios įtakos funkcionalumui, be to, Q paleidžiamas akimirksniu, o tai leidžia jį naudoti, be kita ko, kaip scenarijų kalbą.
  • Tokio dydžio Q interpretatorius visiškai telpa į procesoriaus talpyklą, o tai pagreitina programos vykdymą.
  • Esant tokio dydžio vykdomajam failui, Q procesas užima nežymiai vietos atmintyje; galite paleisti šimtus jų. Be to, jei reikia, Q gali dirbti su dešimčių ar šimtų gigabaitų atminties viename procese.

universalumas

Q puikiai tinka įvairioms programoms. Procesas Q gali veikti kaip istorinė duomenų bazė ir suteikti greitą prieigą prie terabaitų informacijos. Pavyzdžiui, turime dešimtis istorinių duomenų bazių, kai kuriose iš kurių viena nesuspaustų duomenų diena užima daugiau nei 100 gigabaitų. Tačiau, laikantis pagrįstų apribojimų, duomenų bazės užklausa bus baigta per keliasdešimt ar šimtus milisekundžių. Apskritai, mes turime universalų vartotojo užklausų skirtąjį laiką – 30 sekundžių – ir jis veikia labai retai.
 
Q taip pat gali būti atminties duomenų bazė. Nauji duomenys į atmintyje esančias lenteles pridedami taip greitai, kad vartotojų užklausos yra ribojantis veiksnys. Duomenys lentelėse saugomi stulpeliuose, o tai reiškia, kad bet kokia operacija stulpelyje naudos procesoriaus talpyklą visu pajėgumu. Be to, KX bandė įgyvendinti visas pagrindines operacijas, tokias kaip aritmetika per vektorines procesoriaus instrukcijas, maksimaliai padidindamas jų greitį. Q taip pat gali atlikti užduotis, kurios nėra būdingos duomenų bazėms – pavyzdžiui, apdoroti srautinius duomenis ir skaičiuoti „realiu laiku“ (su vėlavimu nuo dešimčių milisekundžių iki kelių sekundžių, priklausomai nuo užduoties) įvairias finansinių priemonių agregavimo funkcijas skirtingu laiku. intervalais arba sukurti tobulų sandorių įtakos rinkai modelį ir atlikti jo profiliavimą beveik iš karto po jo užbaigimo. Tokiose užduotyse dažniausiai pagrindinis laiko delsimas yra ne Q, o poreikis sinchronizuoti duomenis iš skirtingų šaltinių. Didelis greitis pasiekiamas dėl to, kad duomenys ir juos apdorojančios funkcijos yra viename procese, o apdorojimas sumažinamas iki kelių QSQL išraiškų ir sujungimų vykdymo, kurie nėra interpretuojami, o vykdomi dvejetainiu kodu.
 
Galiausiai galite rašyti bet kokius paslaugų procesus Q. Pavyzdžiui, „Gateway“ procesai automatiškai paskirsto vartotojų užklausas į reikiamas duomenų bazes ir serverius. Programuotojas turi visišką laisvę įgyvendinti bet kokį balansavimo, prioritetų nustatymo, gedimų tolerancijos, prieigos teisių, kvotų ir iš esmės bet ką kito, ko geidžia širdis, algoritmą. Pagrindinė problema čia yra ta, kad visa tai turėsite įgyvendinti patys.
 
Kaip pavyzdį išvardysiu, kokių tipų procesus turime. Visos jos yra aktyviai naudojamos ir veikia kartu, sujungiant dešimtis skirtingų duomenų bazių į vieną, apdorojant duomenis iš kelių šaltinių ir aptarnaujant šimtus vartotojų bei taikomųjų programų.

  • Jungtys (feedhandler) prie duomenų šaltinių. Šie procesai paprastai naudoja išorines bibliotekas, kurios įkeliamos į Q. C sąsaja Q yra labai paprasta ir leidžia lengvai sukurti tarpinio serverio funkcijas bet kuriai C/C++ bibliotekai. Q yra pakankamai greitas, kad galėtų apdoroti, pavyzdžiui, FIX pranešimų srautą iš visų Europos vertybinių popierių biržų vienu metu.
  • Duomenų platintojai (tickerplant), kurie tarnauja kaip tarpinė grandis tarp jungčių ir vartotojų. Tuo pačiu metu jie įrašo gaunamus duomenis į specialų dvejetainį žurnalą, užtikrindami vartotojų patikimumą nuo ryšio praradimo ar pakartotinio paleidimo.
  • Atminties duomenų bazė (rdb). Šios duomenų bazės suteikia greičiausią įmanomą prieigą prie neapdorotų, šviežių duomenų, saugodamos juos atmintyje. Paprastai jie kaupia duomenis lentelėse dieną ir nustato juos iš naujo naktį.
  • Persist duomenų bazė (pdb). Šios duomenų bazės užtikrina, kad šiandieniniai duomenys būtų saugomi istorinėje duomenų bazėje. Paprastai, skirtingai nei rdb, jie nesaugo duomenų atmintyje, o dienos metu naudoja specialią talpyklą diske ir vidurnaktį nukopijuoja duomenis į istorinę duomenų bazę.
  • Istorinės duomenų bazės (hdb). Šios duomenų bazės suteikia prieigą prie ankstesnių dienų, mėnesių ir metų duomenų. Jų dydį (dienomis) riboja tik standžiųjų diskų dydis. Duomenys gali būti bet kur, ypač skirtinguose diskuose, kad būtų pagreitinta prieiga. Galima suspausti duomenis naudojant kelis pasirinktus algoritmus. Duomenų bazės struktūra gerai dokumentuota ir paprasta, duomenys saugomi stulpelis po stulpelio įprastuose failuose, todėl juos galima apdoroti, taip pat ir operacinės sistemos pagalba.
  • Duomenų bazės su apibendrinta informacija. Juose saugomi įvairūs agregatai, dažniausiai su, sugrupuoti pagal instrumento pavadinimą ir laiko intervalą. Atmintyje esančios duomenų bazės atnaujina savo būseną su kiekvienu gaunamu pranešimu, o istorinėse duomenų bazėse saugomi iš anksto apskaičiuoti duomenys, kad būtų pagreitinta prieiga prie istorinių duomenų.
  • Galiausiai, vartai procesaiaptarnaujančias programas ir vartotojus. Q leidžia visiškai asinchroniškai apdoroti gaunamus pranešimus, paskirstyti juos duomenų bazėse, tikrinti prieigos teises ir kt. Atminkite, kad pranešimai nėra ribojami ir dažniausiai nėra SQL išraiškos, kaip yra kitose duomenų bazėse. Dažniausiai SQL išraiška yra paslėpta specialioje funkcijoje ir konstruojama pagal vartotojo prašomus parametrus – konvertuojamas laikas, filtruojamas, normalizuojami duomenys (pavyzdžiui, akcijų kaina išlyginama, jei buvo išmokėti dividendai) ir kt.

Tipinė vieno duomenų tipo architektūra:

KPB+ duomenų bazė: nuo finansų iki Formulės 1

Pagreitinti

Nors Q yra interpretuojama kalba, ji taip pat yra vektorinė kalba. Tai reiškia, kad daugelis integruotų funkcijų, ypač aritmetinių, priima bet kokios formos argumentus – skaičius, vektorius, matricas, sąrašus – ir tikimasi, kad programuotojas įgyvendins programą kaip masyvo operacijas. Tokioje kalboje, jei pridėsite du vektorius iš milijono elementų, nebesvarbu, kad kalba būtų interpretuojama, pridėjimą atliks itin optimizuota dvejetainė funkcija. Kadangi didžioji laiko dalis Q programose skiriama operacijoms su lentelėmis, kuriose naudojamos šios pagrindinės vektorinės funkcijos, išvestis yra labai tinkamas veikimo greitis, leidžiantis apdoroti didžiulį duomenų kiekį net viename procese. Tai panašu į matematines Python bibliotekas – nors pats Python yra labai lėta kalba, joje yra daug puikių bibliotekų, tokių kaip numpy, kurios leidžia apdoroti skaitmeninius duomenis kompiliuotos kalbos greičiu (beje, numpy yra ideologiškai artimas Q. ).
 
Be to, KX labai atsargiai kūrė lenteles ir optimizavo darbą su jomis. Pirma, palaikomi kelių tipų indeksai, kuriuos palaiko įmontuotos funkcijos ir kuriuos galima pritaikyti ne tik lentelės stulpeliams, bet ir bet kokiems vektoriams – grupavimui, rūšiavimui, unikalumo atributams ir specialiam istorinių duomenų bazių grupavimui. Indeksas taikomas paprastai ir automatiškai koreguojamas pridedant elementus į stulpelį/vektorių. Indeksai gali būti vienodai sėkmingai taikomi lentelės stulpeliams tiek atmintyje, tiek diske. Vykdant QSQL užklausą, indeksai naudojami automatiškai, jei įmanoma. Antra, darbas su istoriniais duomenimis atliekamas naudojant OS failų rodymo mechanizmą (atminties žemėlapį). Didelės lentelės niekada nėra įkeliamos į atmintį, o būtini stulpeliai atvaizduojami tiesiai į atmintį ir realiai įkeliama tik ta jų dalis (čia padeda ir indeksai), kurios reikia. Programuotojui nėra skirtumo, ar duomenys yra atmintyje, ar ne, darbo su mmap mechanizmas yra visiškai paslėptas Q gelmėse.
 
KDB+ nėra reliacinė duomenų bazė; lentelėse gali būti savavališkų duomenų, o lentelės eilučių tvarka nesikeičia pridedant naujų elementų ir gali bei turėtų būti naudojama rašant užklausas. Ši funkcija skubiai reikalinga dirbant su laiko eilutėmis (duomenys iš mainų, telemetrijos, įvykių žurnalų), nes jei duomenys surūšiuoti pagal laiką, vartotojui nereikia naudoti jokių SQL gudrybių ieškant pirmos ar paskutinės eilutės arba N. lentelės eilutes, nustatykite, kuri eilutė eina po N-osios eilutės ir t. t. Lentelių sujungimas dar labiau supaprastinamas, pavyzdžiui, 16000 milijonų elementų lentelėje rasti paskutinę 500 XNUMX VOD.L („Vodafone“) operacijų citatą užtrunka apie sekundę diske ir dešimtis milisekundžių atmintyje.
 
Laiko sujungimo pavyzdys - citatų lentelė susieta su atmintimi, todėl nereikia nurodyti VOD.L kur, netiesiogiai naudojamas simbolis stulpelyje ir tai, kad duomenys rūšiuojami pagal laiką. Beveik visi sujungimai Q yra reguliarios funkcijos, o ne pasirinktos išraiškos dalis:

1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]  

Galiausiai verta paminėti, kad KX inžinieriai, pradedant pačiu Arthuru Whitney, yra tikrai apsėsti efektyvumo ir labai stengiasi išnaudoti visas Q standartines funkcijas bei optimizuoti dažniausiai pasitaikančius naudojimo būdus.
 

Visas

KDB+ yra populiarus tarp verslo pirmiausia dėl savo išskirtinio universalumo – jis vienodai gerai tarnauja kaip atminties duomenų bazė, kaip terabaitų istorinių duomenų saugojimo duomenų bazė ir kaip duomenų analizės platforma. Dėl to, kad duomenų apdorojimas vyksta tiesiogiai duomenų bazėje, pasiekiamas didelis darbo greitis ir taupomi ištekliai. Pilnavertė programavimo kalba, integruota su duomenų bazės funkcijomis, leidžia vienoje platformoje įgyvendinti visą šūsnį reikalingų procesų – nuo ​​duomenų gavimo iki vartotojų užklausų apdorojimo.
 

Norėdami gauti daugiau informacijos,

Trūkumai

Reikšmingas KDB+/Q trūkumas yra aukšta įėjimo riba. Kalba turi keistą sintaksę, kai kurios funkcijos yra labai perkrautos (pavyzdžiui, reikšmė turi apie 11 naudojimo atvejų). Svarbiausia, kad tam reikia radikaliai kitokio požiūrio į programų rašymą. Vektorinėje kalboje visada turite galvoti apie masyvo transformacijas, įgyvendinti visas kilpas per kelis atvaizdavimo / mažinimo funkcijų variantus (kurie Q vadinami prieveiksmiais) ir niekada nebandyti sutaupyti pinigų pakeitę vektorines operacijas atominėmis. Pavyzdžiui, norėdami rasti masyvo elemento N-ojo pasireiškimo indeksą, turėtumėte parašyti:

1. (where element=vector)[N]  

nors tai atrodo siaubingai neefektyvu pagal C/Java standartus (= sukuria loginį vektorių, kur grąžina tikruosius jame esančių elementų indeksus). Tačiau šis žymėjimas daro išraiškos reikšmę aiškesnę ir jūs naudojate greitas vektorines operacijas, o ne lėtas atomines. Koncepcinis skirtumas tarp vektorinės kalbos ir kitų yra panašus į skirtumą tarp būtinų ir funkcinių požiūrių į programavimą, ir jūs turite būti tam pasiruošę.
 
Kai kurie vartotojai taip pat nepatenkinti QSQL. Esmė ta, kad tai tik atrodo kaip tikras SQL. Tiesą sakant, tai tik į SQL panašių išraiškų interpretatorius, nepalaikantis užklausos optimizavimo. Vartotojas pats turi parašyti optimalias užklausas, o Q, kurioms daugelis nėra pasiruošę. Kita vertus, žinoma, visada galite parašyti optimalią užklausą patys, o ne pasikliauti juodosios dėžės optimizatoriumi.
 
Be to, knygą apie Q - Q For Martals galite rasti nemokamai adresu įmonės svetainė, ten taip pat surinkta daug kitos naudingos medžiagos.
 
Kitas didelis trūkumas yra licencijos kaina. Tai yra dešimtys tūkstančių dolerių per metus vienam procesoriui. Tik didelės įmonės gali sau leisti tokias išlaidas. Pastaruoju metu KX savo licencijavimo politiką padarė lankstesnę ir suteikia galimybę mokėti tik už naudojimo laiką arba išsinuomoti KDB+ Google ir Amazon debesyse. KX taip pat siūlo atsisiųsti nemokama versija nekomerciniais tikslais (32 bitų versija arba 64 bitų pagal užsakymą).
 

konkurentai

Yra nemažai specializuotų duomenų bazių, sukurtų panašiais principais – stulpelių, į atmintį orientuotų, orientuotų į labai didelius duomenų kiekius. Problema ta, kad tai yra specializuotos duomenų bazės. Ryškus pavyzdys yra Clickhouse. Ši duomenų bazė yra labai panaši į KDB+ duomenų saugojimo diske ir indekso sudarymo principą; kai kurias užklausas ji atlieka greičiau nei KDB+, nors ir nelabai. Bet net ir kaip duomenų bazė Clickhouse yra labiau specializuota nei KDB+ – žiniatinklio analizė vs savavališkos laiko eilutės (šis skirtumas labai svarbus – dėl to, pavyzdžiui, Clickhouse negalima naudoti įrašų eilės). Bet svarbiausia, kad Clickhouse nepasižymi KDB+ universalumu – kalba, kuri leistų apdoroti duomenis tiesiogiai duomenų bazėje, o ne pirmiausia įkelti juos į atskirą programą, kurti savavališkas SQL išraiškas, taikyti savavališkas funkcijas užklausoje, kurti procesus. nesusiję su istorinių duomenų bazės funkcijų vykdymu . Todėl sunku lyginti KDB+ su kitomis duomenų bazėmis, jos gali būti geresnės tam tikrais naudojimo atvejais arba tiesiog geriau, kai kalbama apie klasikines duomenų bazių užduotis, bet nežinau kito vienodai veiksmingo ir universalaus laikinųjų duomenų apdorojimo įrankio.
 

Python integracija

Kad šios technologijos nepažįstantiems žmonėms būtų lengviau naudotis KDB+, KX sukūrė bibliotekas, kurios viename procese glaudžiai integruotųsi su Python. Galite iškviesti bet kurią Python funkciją iš Q arba atvirkščiai – iškviesti bet kurią Q funkciją iš Python (ypač QSQL išraiškas). Bibliotekos prireikus (ne visada efektyvumo sumetimais) konvertuoja duomenis iš vienos kalbos formato į kitos kalbos formatą. Dėl to Q ir Python gyvena tokioje glaudžioje simbiozėje, kad ribos tarp jų yra neryškios. Dėl to programuotojas, viena vertus, turi visišką prieigą prie daugybės naudingų Python bibliotekų, kita vertus, jis gauna greitą bazę dirbti su dideliais duomenimis, integruotais į Python, o tai ypač naudinga tiems, kurie užsiima mašininiu mokymusi. arba modeliavimas.
 
Darbas su Q Python:

1. >>> q()  
2.q)trade:([]date:();sym:();qty:())  
3. q)  
4. >>> q.insert('trade', (date(2006,10,6), 'IBM', 200))  
5. k(',0')  
6. >>> q.insert('trade', (date(2006,10,6), 'MSFT', 100))  
7. k(',1')  

Nuorodos

Įmonės svetainė - https://kx.com/
Svetainė kūrėjams - https://code.kx.com/v2/
Q knyga mirtingiesiems (anglų k.) – https://code.kx.com/q4m3/
Straipsniai apie KDB+/Q programas iš kx darbuotojų - https://code.kx.com/v2/wp/

Šaltinis: www.habr.com

Добавить комментарий