KDB+ databank: fan finânsjes oant Formule 1

KDB+, bedriuwsprodukt KX is in rûnom bekend yn smelle sirkels, ekstreem fluch, columnar databank ûntwurpen foar it bewarjen fan tiid rige en analytyske berekkeningen basearre op harren. Yn it earstoan wie (en is) it tige populêr yn 'e finansjele yndustry - alle top 10 ynvestearringsbanken en in protte bekende hedgefûnsen, útwikselingen en oare organisaasjes brûke it. Koartlyn besleat KX har klantbasis út te wreidzjen en biede no oplossingen yn oare gebieten wêr't in grutte hoemannichte gegevens is, organisearre troch tiid of oars - telekom, bioinformatika, produksje, ensfh. Se waarden ek in partner fan it Aston Martin Red Bull Racing-team yn Formule 1, wêr't se helpe by it sammeljen en ferwurkjen fan gegevens fan autosensors en it analysearjen fan wyntunneltests. Yn dit artikel wol ik jo fertelle hokker funksjes fan KDB + it super-performing meitsje, wêrom bedriuwen ree binne om in protte jild oan te besteegjen, en as lêste, wêrom is it net echt in databank.
 
KDB+ databank: fan finânsjes oant Formule 1
 
Yn dit artikel sil ik besykje jo yn 't algemien te fertellen wat KDB+ is, hokker mooglikheden en beheiningen it hat, en wat de foardielen binne foar bedriuwen dy't grutte hoemannichten gegevens ferwurkje wolle. Ik sil net yngean op de details fan de ymplemintaasje fan KDB+ of de details fan de programmeartaal Q. Beide fan dizze ûnderwerpen binne tige breed en fertsjinje aparte artikels. In soad ynformaasje oer dizze ûnderwerpen is te finen op code.kx.com, ynklusyf in boek oer Q - Q For Mortals (sjoch link hjirûnder).

Guon termen

  • In-memory databank. In databank dy't bewarret gegevens yn RAM foar flugger tagong. De foardielen fan sa'n databank binne dúdlik, mar de neidielen binne de mooglikheid fan gegevensferlies en de needsaak om in protte ûnthâld op 'e tsjinner te hawwen.
  • Columnar databank. In databank wêryn gegevens kolom foar kolom wurde opslein ynstee fan rekord foar record. It wichtichste foardiel fan sa'n databank is dat gegevens út ien kolom wurde opslein tegearre op skiif en yn it ûnthâld, dat gâns fersnelt tagong ta it. D'r is net nedich om kolommen te laden dy't net yn 'e query wurde brûkt. It wichtichste neidiel is dat it lestich is om records te wizigjen en te wiskjen.
  • Tiid rige. Gegevens mei in datum- of tiidkolom. Typysk is tiidbestelling wichtich foar sokke gegevens, sadat jo maklik kinne bepale hokker record foarôfgiet of folget op 'e aktuele, of funksjes tapasse wêrfan de resultaten ôfhinklik binne fan 'e folchoarder fan 'e records. Klassike databases binne boud op in folslein oar prinsipe - fertsjintwurdigje in samling fan records as in set, wêr't de folchoarder fan 'e records yn prinsipe net definiearre is.
  • Vector. Yn it ramt fan KDB+ is dit in list mei eleminten fan itselde atoomtype, bygelyks nûmers. Mei oare wurden, in array fan eleminten. Arrays, yn tsjinstelling ta listen, kinne kompakt wurde opslein en ferwurke mei help fan vector processor ynstruksjes.

 

Histoaryske eftergrûn

KX waard yn 1993 oprjochte troch Arthur Whitney, dy't earder wurke by Morgan Stanley Bank oan 'e A+-taal, de opfolger fan APL - in tige orizjinele en op in stuit populêre taal yn 'e finansjele wrâld. Fansels, yn KX, Arthur bleau yn deselde geast en makke de fektor-funksjonele taal K, liede troch de ideeën fan radikale minimalisme. K-programma's lykje op in wirwar fan ynterpunksje en spesjale tekens, de betsjutting fan tekens en funksjes hinget ôf fan 'e kontekst, en elke operaasje hat folle mear betsjutting dan yn konvinsjonele programmeartalen. Hjirtroch nimt in K-programma minimale romte yn - in pear rigels kinne siden mei tekst ferfange yn in verbose taal lykas Java - en is in superkonsintrearre ymplemintaasje fan it algoritme.
 
In funksje yn K dy't it measte fan 'e LL1-parsergenerator ymplementearret neffens in opjûne grammatika:

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),"]";""]]}  

 Arthur ferbylde dizze filosofy fan ekstreme effisjinsje mei in minimum oan lichemsbewegingen yn KDB+, dy't ferskynde yn 2003 (ik tink dat it no dúdlik is wêr't de letter K yn 'e namme wei komt) en net mear is as in tolk fan 'e fjirde ferzje fan 'e K In mear brûkerfreonlike ferzje is tafoege boppe op K K neamd Q. Q hat ek stipe tafoege foar in spesifyk dialekt fan SQL - QSQL, en de tolk - stipe foar tabellen as systeemgegevenstype, ark foar wurkjen mei tabellen yn it ûnthâld en op skiif, ensfh.
 
Dat út it perspektyf fan in brûker is KDB+ gewoan in Q-taaltolk mei stipe foar tabellen en SQL-like LINQ-styl útdrukkingen fan C #. Dit is it wichtichste ferskil tusken KDB+ en oare databases en har wichtichste konkurrinsjefoardiel, dat faaks oersjoen wurdt. Dit is gjin databank + útskeakele helptaal, mar in folweardige krêftige programmeartaal + ynboude stipe foar databank funksjes. Dit ûnderskied sil in beslissende rol spylje by it listjen fan alle foardielen fan KDB+. Bygelyks…
 

grutte

By moderne noarmen is KDB + gewoan mikroskopysk yn grutte. It is letterlik ien sub-megabyte útfierber bestân en ien lyts tekstbestân mei guon systeemfunksjes. Yn werklikheid - minder as ien megabyte, en foar dit programma betelje bedriuwen tsientûzenen dollars yn 't jier foar ien prosessor op' e tsjinner.

  • Dizze grutte lit KDB+ geweldich fiele op elke hardware - fan in Pi-mikrokomputer oant servers mei terabytes oan ûnthâld. Dit hat gjin ynfloed op de funksjonaliteit, boppedat begjint Q daliks, wêrtroch it ûnder oare as skripttaal brûkt wurde kin.
  • Op dizze grutte past de Q-interpreter folslein yn 'e prosessor-cache, wat de útfiering fan programma's fersnelt.
  • Mei dizze grutte fan it útfierbere bestân nimt it Q-proses ferwaarleaze romte yn it ûnthâld yn; jo kinne hûnderten fan har útfiere. Boppedat, as it nedich is, kin Q operearje mei tsientallen of hûnderten gigabyte ûnthâld binnen ien proses.

Vielfalt

Q is geweldich foar in breed skala oan applikaasjes. Process Q kin fungearje as in histoaryske databank en biede flugge tagong ta terabytes oan ynformaasje. Wy hawwe bygelyks tsientallen histoaryske databases, yn guon wêrfan ien net-komprimeare dei fan gegevens mear as 100 gigabytes ynnimme. Under ridlike beheiningen sil in query nei de databank lykwols wurde foltôge yn tsientallen oant hûnderten millisekonden. Yn 't algemien hawwe wy in universele time-out foar brûkersoanfragen - 30 sekonden - en it wurket heul komselden.
 
Q koe like maklik in databank yn it ûnthâld wêze. Nije gegevens wurde sa fluch tafoege oan tabellen yn it ûnthâld dat brûkersoanfragen de beheinende faktor binne. Gegevens yn tabellen wurde opslein yn kolommen, wat betsjut dat elke operaasje op in kolom de prosessor-cache op folsleine kapasiteit sil brûke. Njonken dit, KX besocht te fieren alle basis operaasjes lykas arithmetic fia vector ynstruksjes fan de prosessor, maksimalisearjeknop harren snelheid. Q kin ek taken útfiere dy't net typysk binne foar databases - bygelyks streaminggegevens ferwurkje en yn "echte tiid" berekkenje (mei in fertraging fan tsientallen millisekonden oant ferskate sekonden ôfhinklik fan de taak) ferskate aggregaasjefunksjes foar finansjele ynstruminten foar ferskate tiid yntervallen of bouwe in model fan 'e ynfloed fan perfekte transaksjes op' e merk en fiere syn profilearring hast fuortendaliks nei syn foltôging. Yn sokke taken is de wichtichste tiidfertraging net Q, mar de needsaak om gegevens út ferskate boarnen te syngronisearjen. Hege snelheid wurdt berikt troch it feit dat de gegevens en de funksjes dy't ferwurkje se binne yn ien proses, en ferwurking wurdt fermindere ta in útfiere ferskate QSQL útdrukkings en joins, dy't net ynterpretearre, mar wurde útfierd troch binêre koade.
 
Uteinlik kinne jo alle tsjinstprosessen skriuwe yn Q. Bygelyks, Gateway-prosessen dy't automatysk fersiken fan brûkers ferspriede nei de nedige databases en servers. De programmeur hat folsleine frijheid om elk algoritme te ymplementearjen foar balânsjen, prioritearring, fouttolerânsje, tagongsrjochten, kwota's en yn prinsipe alles wat syn hert begeart. It wichtichste probleem hjir is dat jo dit alles sels moatte útfiere.
 
As foarbyld sil ik listje hokker soarten prosessen wy hawwe. Allegear wurde aktyf brûkt en wurkje gear, kombinearje tsientallen ferskillende databases yn ien, ferwurkjen fan gegevens út meardere boarnen en tsjinje hûnderten brûkers en applikaasjes.

  • Connectors (feedhandler) oan gegevens boarnen. Dizze prosessen brûke typysk eksterne biblioteken dy't laden wurde yn Q. De C-ynterface yn Q is ekstreem ienfâldich en kinne jo maklik proxyfunksjes meitsje foar elke C/C++-bibleteek. Q is fluch genôch om te behanneljen, bygelyks, it ferwurkjen fan in floed fan FIX-berjochten fan alle Europeeske oandielbeurzen tagelyk.
  • Gegevensdistributeurs (tickerplant), dy't tsjinje as in tuskenlizzende keppeling tusken Anschlüsse en konsuminten. Tagelyk skriuwe se ynkommende gegevens nei in spesjale binêre log, dy't robúste foar konsuminten leverje tsjin ferbiningferlies of opnij starte.
  • In-memory databank (rdb). Dizze databases jouwe de rapst mooglike tagong ta rau, farske gegevens troch it op te slaan yn it ûnthâld. Typysk sammelje se gegevens oerdeis yn tabellen en sette se nachts werom.
  • Persist databank (pdb). Dizze databanken soargje derfoar dat gegevens foar hjoed opslein wurde yn in histoaryske databank. Yn 'e regel, yn tsjinstelling ta rdb, bewarje se gjin gegevens yn it ûnthâld, mar brûke oerdeis in spesjale cache op skiif en kopiearje de gegevens om middernacht nei de histoaryske databank.
  • Histoaryske databanken (hdb). Dizze databases jouwe tagong ta gegevens foar foargeande dagen, moannen en jierren. Harren grutte (yn dagen) wurdt allinich beheind troch de grutte fan 'e hurde skiven. Gegevens kinne oeral lizze, benammen op ferskate skiven om tagong te fersnellen. It is mooglik om gegevens te komprimearjen mei ferskate algoritmen om út te kiezen. De struktuer fan 'e databank is goed dokumintearre en ienfâldich, de gegevens wurde kolom foar kolom opslein yn reguliere bestannen, sadat se kinne wurde ferwurke, ynklusyf troch middel fan it bestjoeringssysteem.
  • Databanken mei aggregearre ynformaasje. Se bewarje ferskate aggregations, meastal mei, groepearre troch ynstrumint namme en tiid ynterfal. Databanken yn it ûnthâld aktualisearje har steat mei elk ynkommend berjocht, en histoaryske databases bewarje foarberekende gegevens om tagong ta histoaryske gegevens te rapperjen.
  • Einlings gateway prosessentsjinst applikaasjes en brûkers. Q lit jo folslein asynchrone ferwurking fan ynkommende berjochten ymplementearje, se fersprieden oer databases, tagongsrjochten kontrolearje, ensfh. Tink derom dat berjochten net beheind binne en meastentiids gjin SQL-útdrukkingen binne, lykas it gefal is yn oare databases. Meastentiids is de SQL-ekspresje ferburgen yn in spesjale funksje en is konstruearre op basis fan de parameters dy't de brûker freget - tiid wurdt konvertearre, filtere, gegevens wurde normalisearre (bygelyks de oandielpriis wurdt lykmakke as dividenden wurde betelle), ensfh.

Typyske arsjitektuer foar ien gegevenstype:

KDB+ databank: fan finânsjes oant Formule 1

Speed

Hoewol Q in ynterpretearre taal is, is it ek in fektortaal. Dit betsjut dat in protte ynboude funksjes, benammen arithmetyske, arguminten fan elke foarm oannimme - nûmers, fektors, matriksen, listen - en de programmeur wurdt ferwachte dat it programma as array-operaasjes ymplementearret. As jo ​​yn sa'n taal twa vectoren fan in miljoen eleminten tafoegje, makket it net mear út dat de taal ynterpretearre wurdt; de tafoeging wurdt útfierd troch in superoptimisearre binêre funksje. Sûnt it diel fan 'e liuw fan' e tiid yn Q-programma's wurdt bestege oan operaasjes mei tabellen dy't dizze basisvektorisearre funksjes brûke, is de útfier in heul fatsoenlike operaasjesnelheid, wêrtroch wy in enoarme hoemannichte gegevens sels yn ien proses kinne ferwurkje. Dit is gelyk oan wiskundige biblioteken yn Python - hoewol Python sels in heul trage taal is, hat it in protte poerbêste biblioteken lykas numpy wêrmei jo numerike gegevens kinne ferwurkje mei de snelheid fan in gearstalde taal (trouwens, numpy is ideologysk tichtby Q ).
 
Derneist naam KX in heul foarsichtige oanpak foar it ûntwerpen fan tabellen en it optimalisearjen fan wurk mei har. As earste wurde ferskate soarten yndeksen stipe, dy't wurde stipe troch ynboude funksjes en kinne wurde tapast net allinich op tabelkolommen, mar ek op elke fektor - groepearjen, sortearjen, eigenskipsattributen en spesjale groepearring foar histoaryske databases. De yndeks wurdt gewoan tapast en wurdt automatysk oanpast by it tafoegjen fan eleminten oan 'e kolom / vektor. Yndeksen kinne likegoed mei súkses tapast wurde op tabelkolommen sawol yn it ûnthâld as op skiif. By it útfieren fan in QSQL-query, wurde yndeksen as mooglik automatysk brûkt. Twadder wurdt wurk mei histoaryske gegevens dien fia it meganisme foar it werjaan fan OS-bestannen (ûnthâldkaart). Grutte tabellen wurde nea yn it ûnthâld laden; Ynstee dêrfan wurde de nedige kolommen direkt yn it ûnthâld yn kaart brocht en allinich dat diel fan har wurdt eins laden (yndeksen helpe hjir ek) dat nedich is. It makket gjin ferskil foar de programmeur oft de gegevens yn it ûnthâld binne of net; it meganisme foar wurkjen mei mmap is folslein ferburgen yn 'e djipten fan Q.
 
KDB+ is gjin relasjonele databank; tabellen kinne willekeurige gegevens befetsje, wylst de folchoarder fan rigen yn 'e tabel net feroaret as nije eleminten wurde tafoege en kinne en moatte wurde brûkt by it skriuwen fan fragen. Dizze funksje is driuwend nedich foar it wurkjen mei tiidsearjes (gegevens fan útwikselingen, telemetry, evenemintelogs), om't as de gegevens op tiid sorteare binne, dan hoecht de brûker gjin SQL-tricks te brûken om de earste of lêste rige of N te finen rigen yn 'e tabel, bepale hokker rigel folget de Nde rigel, ensfh. Tabel joins wurde ferienfâldige noch fierder, Bygelyks, it finen fan de lêste sitaat foar 16000 VOD.L (Vodafone) transaksjes yn in tabel fan 500 miljoen eleminten duorret likernôch in sekonde op skiif en tsientallen millisekonden yn ûnthâld.
 
In foarbyld fan in tiid join - de sitaat tabel wurdt yn kaart brocht oan it ûnthâld, dus it is net nedich om te spesifisearjen VOD.L yn wêr, de yndeks op de sym kolom en it feit dat de gegevens wurdt sortearre troch tiid wurde ymplisyt brûkt. Hast alle joins yn Q binne reguliere funksjes, gjin diel fan in selekteare útdrukking:

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

Uteinlik is it de muoite wurdich op te merken dat de yngenieurs by KX, te begjinnen mei Arthur Whitney sels, wirklik obsedearre binne mei effisjinsje en dwaande binne om it measte út de standertfunksjes fan 'e Q te heljen en de meast foarkommende gebrûkspatroanen te optimalisearjen.
 

It resultaat

KDB+ is populêr ûnder bedriuwen foaral troch syn útsûnderlike veelzijdigheid - it tsjinnet likegoed as in databank yn it ûnthâld, as in databank foar it bewarjen fan terabytes fan histoaryske gegevens, en as in platfoarm foar data-analyze. Fanwegen it feit dat gegevensferwurking direkt yn 'e databank komt, wurde hege wurksnelheid en besparring fan boarnen berikt. In folweardige programmeartaal yntegreare mei databasefunksjes lit jo de heule stapel fan needsaaklike prosessen op ien platfoarm ymplementearje - fan it ûntfangen fan gegevens oant it ferwurkjen fan brûkersoanfragen.
 

Foar mear ynformaasje,

Nijsberjochten

In signifikant neidiel fan KDB +/Q is de hege yngongsdrompel. De taal hat in nuvere syntaksis, guon funksjes binne swier oerladen (wearde hat bygelyks sa'n 11 gebrûksgefallen). It wichtichste is dat it in radikale oare oanpak fereasket foar it skriuwen fan programma's. Yn in fektortaal moatte jo altyd tinke yn termen fan arraytransformaasjes, alle loops útfiere troch ferskate farianten fan 'e kaart-/ferminderingsfunksjes (dy't bywurden yn Q neamd wurde), en nea besykje jild te besparjen troch vectoroperaasjes te ferfangen mei atomyske. Bygelyks, om de yndeks te finen fan it N-de foarkommen fan in elemint yn in array, moatte jo skriuwe:

1. (where element=vector)[N]  

hoewol't dit liket ferskriklik inefficiënt troch C / Java noarmen (= makket in boolean vector, dêr't jout de wiere yndeksen fan de eleminten yn it). Mar dizze notaasje makket de betsjutting fan 'e útdrukking dúdliker en jo brûke rappe fektoroperaasjes ynstee fan trage atomêre. It konseptuele ferskil tusken in fektortaal en oaren is te fergelykjen mei it ferskil tusken ymperatyf en funksjonele oanpak fan programmearring, en jo moatte hjirfoar taret wurde.
 
Guon brûkers binne ek net tefreden mei QSQL. It punt is dat it allinich liket op echte SQL. Yn werklikheid is it gewoan in tolk fan SQL-like útdrukkingen dy't gjin query-optimisaasje stipet. De brûker moat skriuwe optimale queries sels, en yn Q, dêr't in protte binne net klear foar. Oan 'e oare kant kinne jo fansels altyd de optimale query sels skriuwe, ynstee fan te fertrouwen op in blackbox-optimizer.
 
As plus is in boek oer Q - Q For Mortals fergees te krijen by bedriuwswebside, dêr is ek in protte oare brûkbere materialen sammele.
 
In oar grut neidiel is de kosten fan de lisinsje. Dat binne tsientûzenen dollars per jier per CPU. Allinnich grutte bedriuwen kinne sokke útjeften betelje. Koartlyn hat KX har lisinsjebelied fleksibeler makke en biedt de kâns om allinich te beteljen foar de tiid fan gebrûk of KDB+ te hieren yn 'e Google- en Amazon-wolken. KX biedt ek foar download fergese ferzje foar net-kommersjele doelen (32-bit ferzje of 64 bit op oanfraach).
 

Competitors

D'r binne nochal wat spesjalisearre databases boud op ferlykbere prinsipes - kolom, yn-ûnthâld, rjochte op heul grutte hoemannichten gegevens. It probleem is dat dit spesjalisearre databases binne. In opfallend foarbyld is Clickhouse. Dizze databank hat in hiel ferlykber prinsipe as KDB+ foar it opslaan fan gegevens op skiif en it bouwen fan in yndeks; it docht guon fragen rapper as KDB+, hoewol net signifikant. Mar sels as in databank is Clickhouse mear spesjalisearre as KDB+ - web analytics vs willekeurich tiidrige (dit ferskil is tige wichtich - fanwege it, bygelyks, yn Clickhouse is it net mooglik om de oardering fan records te brûken). Mar, it wichtichste, Clickhouse hat net de veelzijdigheid fan KDB+, in taal dy't it ferwurkjen fan gegevens direkt yn 'e databank mooglik makket, ynstee fan it earst yn in aparte applikaasje te laden, willekeurige SQL-útdrukkingen te bouwen, willekeurige funksjes yn in query ta te passen, prosessen te meitsjen net relatearre oan de útfiering fan histoaryske databankfunksjes. Dêrom is it lestich om KDB+ te fergelykjen mei oare databases; se kinne better wêze yn bepaalde gebrûksgefallen of gewoan better as it giet om klassike databanktaken, mar ik wit net fan in oar like effektyf en alsidige ark foar it ferwurkjen fan tydlike gegevens.
 

Python yntegraasje

Om KDB+ makliker te brûken foar minsken dy't net bekend binne mei de technology, makke KX bibleteken om strak te yntegrearjen mei Python binnen ien proses. Jo kinne elke Python-funksje fan Q neame, of oarsom - elke Q-funksje fan Python neame (benammen QSQL-útdrukkingen). Biblioteken konvertearje, as it nedich is (net altyd omwille fan effisjinsje), gegevens fan it formaat fan ien taal nei it formaat fan in oare. Dêrtroch libje Q en Python yn sa'n nauwe symbioaze dat de grinzen dertusken wazig wurde. As gefolch hat de programmeur, oan 'e iene kant, folsleine tagong ta in protte nuttige Python-biblioteken, oan' e oare kant krijt hy in rappe basis foar wurkjen mei grutte data yntegrearre yn Python, wat foaral nuttich is foar dyjingen dy't belutsen binne by masine learen of modellering.
 
Wurkje mei Q yn 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')  

referinsjes

De side fan it bedriuw - https://kx.com/
Webside foar ûntwikkelders - https://code.kx.com/v2/
Boek Q foar mortals (yn it Ingelsk) - https://code.kx.com/q4m3/
Artikels oer KDB+/Q-applikaasjes fan kx-meiwurkers - https://code.kx.com/v2/wp/

Boarne: www.habr.com

Add a comment