Features designing a data exemplar pro NoSQL

introduction

Features designing a data exemplar pro NoSQL "Tu currere quantum potes tantum manere in loco,
et alicubi potiri, debes currere ad minimum duplo velocius!
(c) Alicia in Terra Mirabili

Dudum rogavi ut darem lectionem coniectoribus Societas nostra in argumento notitiarum designandi exemplorum est, quia in inceptis diu (interdum per plures annos sedentes) cernimus ea quae circa nos in mundo IT technologiarum eveniunt. In nostra societate (quod ita accidit) multis inceptis non utuntur databases NoSQL (saltem pro nunc), sic in mea lectione separatim operam operam dedi eis utens exemplo HBase et conatus sum ut materiam praebeat illis. qui numquam his functus est. Praesertim nonnullas linearum notitiarum exemplarium designationes illustravi utens exemplo ante aliquot annos lego in the article "Introduction to HB ase Schema Design" by Amandeep Khurana. Cum exempla resolvendo complura optiones comparavi ad eandem quaestionem solvendam quo melius notiones principales auditoribus afferrent.

Nuper "ex nihilo facere" me interrogavi (longus May volutpat in quarentenam maxime ad hoc conducit), quantum ad praxin theoricae calculi respondebunt? Nam sic dictum est, ut dictum est. Elit qui cum NoSQL per aliquot dies laboravit, aliquid novi ex eo discere potest (et ideo statim dimidium articulum omittitur). Sed quia analystaePro iis qui cum NoSQL nondum operati sunt, utile fore puto ad praecipuam intellegentiam notarum linearum destinandi exempla data pro HBase.

Exemplum analysis

Mea sententia, antequam NoSQL databases uti incipias, diligenter cogitare debes et pros et cons pensitare. Saepe problema maxime verisimile solvi potest utendo relationi relationis DBMSs. Ergo melius est nos non sine notis rationibus uti. Si nihilominus visum est database NoSQL uti, tunc considerare debes consilium quod hic appropinquat aliquantum diversum esse. Praesertim nonnulla ex iis inusitata esse possunt iis qui antea de DBMSs relativis tantum (secundum observationes meas) egimus. In mundo igitur "relative" nos plerumque exordium facimus quaestionis enucleando, et tunc solum, si opus est, exemplar denormamus. In NosQL sumus statim consideret expectata missionibus operandi data et denormalize initio data. Sunt praeterea plures aliae differentiae, de quibus infra dicetur.

Consideremus quaestionem hanc "syntheticam", quacum laborare continuabimus:

Necesse est ad designandum structuram repositam ad album amicorum utentium aliquarum retis socialis abstractae. Ad simpliciorem reddemus, omnes nexus nostros directos (ut supra Instagram, non Linkedin). Structura ut efficaciter permittat;

  • Responde quaestio utrum user A legit user B (lectio exemplaris)
  • Patitur addere / removere nexus si subscriptionis / A user unsubscription ab user B (notitia mutatio template)

Nimirum multae bene problema solvendae sunt. In regulari database relativo, maxime verisimile simpliciter faceremus tabulam relationum (fortasse significatam si, exempli gratia, necesse est condere coetus user: familiam, opus, etc., in quo hoc "amicum" comprehendit et ad optimize accessum celeritatem adderet indices / partitiones. Verisimile est mensa ultima spectare aliquid simile:

user_id
friend_id

Vasya
Petya

Vasya
Olya

In sequentibus, ad claritatem et intelligentiam aptius, nomina loco IDs indicabo

In HBase, scimus;

  • efficiens quaesitum quod non fit in plena mensa scan fieri potest solum per clavem
    • re vera, ob causam SQL scribere queries notas multis talibus databases malam esse opinionem; technice, utique, quaestionem SQL cum Joins et aliis logicis ad HBase ab eodem Impala mittere potes, sed quam efficax erit...

Ideo cogimur ID usore uti clavis. Et mea prima cogitatio de re "ubi et quomodo amicos condere" IDs?" forte in columnas ideam condere. Hoc manifestissimum et "optio rustica" aliquid simile spectabit (it' appellemus Option 1 (default)ad ulteriora referendum);

RowKey
loudspeakers

Vasya
1: Petya
2: Olya
3: Dasha

Petya
1: Masha
2: Vasya

Hic, linea quaeque uni retis usuario correspondet. Columnae nomina habent: 1, 2, ... - secundum numerum amicorum, et IDs amicorum in columnis reponuntur. Gravis est notare singulas ordines diversos numero columnas habere. In exemplo in figura supra, unus ordo habet tres columnas (1, 2 et 3), secundus tantum duas (1 et 2) habet.

  • facultas dynamice mutandi compositionem columnarum (amicum addere -> addere columnam, amicum removere -> columnam delere)
  • diversos ordines habeat diversae columnae compositiones

Reprimamus structuram nostram pro obsequio cum operis exigentiis:

  • Lectio notitia: ad intelligendum an Vasya Olya subscribatur, subtrahi debebimus totum per clavem RowKey = "Vasya" et dispone per valores columnae donec Olya in illis occurramus. Vel iterare per valores omnium columnarum, "non congredi" Olya et falsum responsum redde;
  • Recensere data: addens amicus: ad simile opus subtrahimus etiam totum usus clavem RowKey = "Vasya" numerum amicorum computare. Opus est hoc numero amicorum ad numerum columnae determinare in qua scribenda ID amici novi.
  • Mutantur notitia: delendo amicus:
    • Opus demere totum per clavem RowKey = "Vasya" et per columnas digerere ad inveniendum unum in quo amicus deleri memoratur;
    • Deinde, delendo amico, omnes notitias "transferre" in unam columnam necesse est, ne "rimas" in numerando accipiamus.

Nunc nunc expendamus quam fructuosae hae algorithms, quibus opus erit efficiendi in parte "conditionalis applicationis", futurum sit, utendo O-symbolismus. Magnitudinem retis socialis hypotheticae nostrae indicemus ut n. Tunc maximus numerus amicorum unus usor habere potest (n-1). Id porro ad propositum nostrum negligere possumus, cum intra ambitum usus o-symbolarum sit levis.

  • Lectio notitia: necesse est totam lineam subtrahere et per omnes suas columnas in termino iterari. Hoc modo superior aestimatio gratuita erit circiter O (n)
  • Recensere data: addens amicus: numerum amicorum determinare, per omnes columnas ordinis iterare debes, ac deinde novam columnam inserere => O(n)
  • Mutantur notitia: delendo amicus:
    • Similia addere - debes per omnes columnas in limite ire => O(n)
    • Sublatis columnis necesse est eas "movere". Si hoc "caput-on" efficies, in fine opus erit ad operationes (n-1). Sed hic et ulterius in parte practica diverso utemur accessu, quod "pseudo-maculum" pro certo numero operationum efficiet, id est, tempus perpetuum impendetur, cujuscumque n. Hoc perpetuum tempus (O (2) exigendum) neglegi potest cum O(n). Accessus illustratur in figura infra: simpliciter notitias ex "ultima" columna ad illam ex qua velimus notitias delere, et deinde delere columnam ultimam:
      Features designing a data exemplar pro NoSQL

Prorsus in omnibus missionibus asymptoticam computationis complexionem O (n).
Probabiliter iam animadverti, nos fere semper totum ordinem e datorum legere, et in duobus casibus ex tribus, modo per omnes columnas ire et amicorum numerum computare. Ergo, ut conamen optimiationi, "numerare" columnam potes addere, quae numerum amicorum retis utriusque retis addit. In hoc casu non possumus legere totum ordinem ad numerum amicorum computare, sed unam tantum "numerare" columnam legere. Summa res non est oblivisci renovationem "comitem" cum notitia abusionibus. Quod. nos adepto melius Optionem 2 (comitem);

RowKey
loudspeakers

Vasya
1: Petya
2: Olya
3: Dasha
numerare: 3

Petya
1: Masha
2: Vasya

numerare: 2

Ad primam optionem comparatum;

  • Lectio notitia: ut responsum quaestioni "An Vasya legit Olya?" nihil mutatum => O (n)
  • Recensere data: addens amicus: simpliciores amici novi insertionem, cum iam non opus sit totam lineam legere et per columnas iterare, sed solum valorem columnae "comitis", etc. statim determinet agmen numerum inserere novum amicum. Haec reductio in complexionem computationalem ad O(1).
  • Mutantur notitia: delendo amicus: Cum amico delendo, hac etiam columna uti possumus ad numerum I/O operationum reducere cum "transmigratio" data una cellula ad sinistram. Sed opus est per columnas iterari ut ea quae deleta sunt adhuc restet, sic => O(n) ;
  • Ex altera parte, nunc cum adaequationis notitiae "numerare" columnam omni tempore renovare necesse est, sed hoc fit perpetuum tempus, quod neglectum esse potest intra compagem o-symboli.

In genere, optio 2 paulo melioris videtur, sed magis similis "evolutionis loco rotundi". Facere "revolution" opus erit Option 3 (col).
Omnia vertamus "inversi": assignabimus columnae nomen user ID! Quod in ipsa columna scribetur, nihil amplius nobis interest, sit numerus 1 (in genere, utilia ibi condi possunt, exempli gratia, coetus "familia/amicorum/etc."). Hic aditus opprimi potest imparatus "laicus", qui nullam experientiam praecedens cum NoSQL databases operatur, sed hic quidem aditus permittit ut potentia HBase in hoc munere multo efficacius utatur:

RowKey
loudspeakers

Vasya
Petya: 1
Olya: 1
Dasha: 1

Petya
Masha: 1
Vasya: 1

Hic simul plura commoda consequimur. Ut eas comprehendas, novam structuram resolvere ac multiplicitatem computationalem aestimes:

  • Lectio notitia: ut ad quaestionem respondendam an Vasya Olya subscribatur, sufficit unam columnam "Olya" legere: si ibi est, respondetur vera, sin minus - Falsa => O (1)
  • Recensere data: addens amicus: Addens amicum: mox novam columnam adde "Amice ID" => O(1)
  • Mutantur notitia: delendo amicus: Amice ID columna remove modo => O(1)

Ut perspicis, insignis utilitas huius exemplaris tabularii est quod in omnibus missionibus, quae nobis necessariae sunt, una tantum columna operamur, vitando totum ordinem e database legendis et praeterea omnes columnas huius ordinis enumerando. Non potuimus prohibere, sed...

Obstupescere potes et paulo longius ire per viam optimizing perficiendi et minuendi I/O operationes cum datorum accessu. Quid si notitias relationes integras in ipso ordine clavis directe reposuimus? Hoc est, clavem compositam clavem fac sicut userID.friendID? In hoc casu ne columnas quidem lineae legere debemus.Optio 4(row)):

RowKey
loudspeakers

Vasya.Petya
Petya: 1

Vasya.Olya
Olya: 1

Vasya.Dasha
Dasha: 1

Petya.Masha
Masha: 1

Petya.Vasya
Vasya: 1

Videlicet taxatio omnium notitiarum manipulationum missionum in tali structura, sicut in priori versione, erit O (1). Differentia cum optionis 3 sola erit in efficientia I/O operationum in datorum datorum.

Ultimus bene "arcus". Facile perspicitur in optione 4, clavis remigandi longitudinis variam habiturum, quae efficiendi fortasse afficere possit (reminiscimur enim hBase thesauros notitias in tabulas per clavem dispositas esse). Plus separator habemus qui in aliquibus missionibus tractari potest. Ad hanc influentiam tollendam, hashes ab userID et friendID uti potes, et cum uterque hashes longitudinem constantem habebis, eas simpliciter concatenare potes, sine separatore. Tunc notitia in mensa spectabit sic (Optio 5(hash)):

RowKey
loudspeakers

dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994
Petya: 1

dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a
Olya: 1

dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a
Dasha: 1

1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1
Masha: 1

1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0
Vasya: 1

Patet, algorithmica multiplicitas operandi cum tali structura in missionibus de quibus agitur, eadem erit ac optio 4 β€” id est, O (1).
In summa, compendiose omnes aestimationes nostras complexionis computationis in una tabula:

Addit amicus
Reprehendo in amico
Removere amicus

Option 1 (default)
O (n)
O (n)
O (n)

Option 2 (count)
O (I)
O (n)
O (n)

Option 3 (column)
O (I)
O (I)
O (I)

Option 4 (row)
O (I)
O (I)
O (I)

Option 5 (hash)
O (I)
O (I)
O (I)

Ut perspicis, optiones 3-5 videntur potiores esse et theoretice exsecutionem omnium necessariarum notitiarum manipulationis missionum in tempore continuo fovere. In condicionibus officii nostri, nulla expressa exigentia est ut omnium amicorum utentis catalogum consequamur, sed in actionibus realibus propositi, bonum esset nobis, sicut analystae boni, "anticipare" ut tale munus oriretur ac "Patere paleas". Ideo meae sympathiae ex parte optionis sunt 3. Sed omnino verisimile est hanc petitionem in reali proposito iam aliis modis solvi potuisse, ergo sine visione generali totius quaestionis melius non est facere. ultimae conclusiones.

Praeparatio experimenti

Vellem argumenta supra theorica in praxi probare - haec fuit meta ideae quae per longum tempus orta est. Ad hoc faciendum, necessarium est aestimare celeritatem operativae nostrae "applicationis conditionalis" in omnibus missionibus descriptis ad utendum datorum datorum, tum in hoc tempore augendo augendo magnitudinem retis socialis (n). Scopus modulus qui nos adiuvat et quem in experimento metimur est tempus per "conditionalem applicationem" ad unum "negotium operandum" perficiendum. Per "res gestum" unum ex sequentibus intelligimus;

  • Addit unum novum amicum
  • Reprehendo si User A est amicus User B
  • Removere unum amicum

Ita, attentis requisitis in initio propositionis delineatis, emergit verificationis missionis ut sequitur:

  • Data memoria. Passim generant reticulum initialem magnitudinis n. Ut propius ad "mundum realem" accederet, numerus amicorum quisque usor etiam temere variabilis est. Metire tempus, quo nostra applicatio condicionalis omnia generata data ad HBase scribit. Tunc consequens tempus divide per summam amicorum numerum additorum - ita ut medium tempus unius "negotii operandi" consequamur.
  • Lectio notitia. Pro unoquoque usuario, elenchum "personalitatum" crea pro quibus respondere debes utrum usor eis subscribatur necne. Longitudo indice = proxime numerus amicorum utentis, et pro dimidia sedatus amicorum responderi debet "Ita", et pro altera dimidia - "Non". Perscriptio ita fit ut responsiones alternae "Est" et "Non" (id est secundo casu per omnes columnas lineae bene 1 et 2) ingredi debebimus. Totum tempus protegendo est divisum numero amicorum probatum ut mediocris protegatur tempus per subiectum.
  • Deletio notitia. Amove omnes amicos a user. Praeterea ordo deletionis temere est (hoc est, nos "misce" in indice originali utebamur notitias notare). Tota perscriptio temporis tunc divisa est per numerum amicorum remotorum ad obtinendum tempus medium per serium.

Missiones ad singulas optiones formarum datarum 5 currere debent et pro diversis magnitudinis retis socialis ad videndum quomodo tempus crescat mutationes. Intra unum n, nexus in retiaculis et indicem utentium ad reprimendum necesse est, utique omnes 5 bene idem esse.
Ad meliorem intellectum, infra est exemplum notitiae genitae pro n= 5. Generator scriptum tres ID dictionarios pro output producit;

  • primum est ad inserendum
  • secundum est ad tenendo
  • tertio - ad deletionem

{0: [1], 1: [4, 5, 3, 2, 1], 2: [1, 2], 3: [2, 4, 1, 5, 3], 4: [2, 1]} # всСго 15 Π΄Ρ€ΡƒΠ·Π΅ΠΉ

{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]} # всСго 18 провСряСмых ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]} # всСго 15 Π΄Ρ€ΡƒΠ·Π΅ΠΉ

Ut videre potes, omnes IDs maiores quam 10 in dictionario reprimendo sunt praecise ea quae falsum responsum reddent. Inserentes, annotando et delendo "amicos" exacte actae sunt in serie de quibus in dictionario.

Experimentum peractum est in fenestra 10 laptop currente, ubi HBase currebat in uno vase Docker, et Python cum Iuppiter Comentario in altero currebat. Docker partita est 2 CPU coros et 2 GB ipsius RAM. Omnis logica, sive aemulatio "adhibitionis conditionalis", et "aemulationis" ad tempus generandum notitias et mensuras, in Pythone scripta est. In bibliotheca opus est ad HBase happybase, computare hashes (MD5) pro optione V - hashlib

Inspecta potentia computandi cuiusdam laptop, immissio pro n = 10, 30, ... experimentaliter electa est. 170 – cum totum tempus operativum plenae probationis cycli (suasiones omnes pro omnibus bene pro omnibus n) vel plus minusve rationabilis et in una parte tea (in mediocris 15 minuta).

Hic notandum est nos in hoc experimento nos non prius ponderare absolutas effectus figuras. Etiam relativa duarum optionum diversorum collatio non omnino recte potest. Nunc quaeritur de ratione mutationis temporis secundum n, cum ratione habita praedictae conformationis "testis standi", difficillimum est tempus obtinere aestimationes "purgandi" de influxu passim et aliorum factorum. eoque munere non).

Experimentum eventum

Prima probatio est quomodo tempus explendi de amicis mutationibus album. Eventus est in lacinia purus.
Features designing a data exemplar pro NoSQL
Optiones 3-5, ut expectatur, prope constantem "negotium transactionis" tempus ostendunt, quae non pendet ab incremento retis magnitudine et indiscreta differentia in effectu.
Optio 2 etiam constantem ostendit, sed aliquantulum deteriorem effectum, fere 2 temporibus ad optiones 3-5 relativa. Et hoc non potest non gaudere, quia theoriam correlat - in hac versione numerus operationum I/O operationum ad HBase ad II exacte maior est. Hoc potest esse indirectae probationes quas probatio nostra in principio praebet accurationem bonam.
Optio 1 etiam, ut expectatur, evenit tardissimum esse et ostendit lineares incrementi tempore consumptos se ad retis magnitudinem addere.
Nunc videamus eventus secundi experimenti.
Features designing a data exemplar pro NoSQL
Optiones 3-5 iterum conversantur ut expectata - constans tempus, a magnitudine aenei independentis. Optiones 1 et 2 demonstrant lineares temporis incrementum, sicut magnitudo retis augetur et similis effectus. Optio praeterea 2 evadit paulo tardius - ut videtur propter necessitatem probationis et processus accessionis "numerationis" columnae, quae magis notabilis fit sicut n crescit. Sed supersedeo adhuc a conclusionibus, quoniam accuratio istius comparationis humilior est. Praeter has rationes (quae optio 1 vel 2, velocior est) mutatur ab curriculo ad currendum (salvata natura dependentiae et "transire collum et collum").

Bene, ultimum graph est ex remotione temptationis.

Features designing a data exemplar pro NoSQL

lam non miror hic. Optiones 3-5 remotionis in tempore constanti exercent.
Praeterea, interestingly optiones 4 et 5, dissimiles missionibus prioribus, notabiliter leviter deteriorem effectum quam optio ostendunt. 3. Videtur, ordo deletionis operandi carior est quam operatio columnae deletionis, quae plerumque logica est.

Optiones 1 et 2, ut expectata linearem temporis incrementa demonstrant. Eodem tempore, optio 2 constanter tardius quam optio 1 - ex additione I/O operationis ad "tenere" columnae comitem.

Conclusiones generales experimenti;

  • Optiones 3-5 maiorem efficaciam demonstrant prout HBase adsunt; Praeterea certa inter se constant et non dependet a magnitudine retiacula.
  • Discrimen optionum 4 et 5 non commemoratur. Sed hoc non significat optionem 5 adhibendam esse. Verisimile est missionem experimentalem adhibitam, ratione habita faciendi notae probationis scamni, eam deprehendi non permittere.
  • Natura crescentis temporis requiritur ad "negotiam operationes" cum notitia generaliter confirmatur, antea calculi theoretici omnes optiones consecuti.

epilogus,

Experimenta aspera peracta non pro veritate sumenda sunt absoluta. Multae res sunt quae eventus non considerantur et distortae sunt (haec ambigua praesertim in graphis cum parva retis magnitudine conspiciuntur). Exempli gratia, celeritas parsimonia, quae ab turpibus utitur, volumen et ratio exsequendi logicam, quam in Pythone scripsi, affirmare non possum codicem optime et efficaciter scriptum omnium partium facultatibus adhibitum esse, fortasse lineamenta HBase caching, background activitatis Windows 10 in laptop meo, etc. Fere supponere possumus omnes calculi theoretici eorum validitatem experimento demonstrasse. Bene, vel saltem non potuit eos refutare tali "oppugnante capite".

Demum, suasiones ad unumquemque mox incipiens ad exempla data exempla in HBase: abstrahe ab experientia praevia operandi cum databases relativis et memento "praecepta":

  • Cum cogitamus, proceditur ab officio et exemplaribus manipulationis notitiarum, et non ex exemplari regio
  • Aditum efficiens (sine mensa plena scan) - nisi per key
  • Denormalization
  • Diversi ordines continent diversarum columnarum
  • Dynamica compositio oratorum

Source: www.habr.com