Sunteți pe pagina 1din 72

Big Data

Curs 1
Paradigma de calcul
MapReduce. Platforma
Hadoop

2
Analiza de date large-scale

 Paradigma de calcul MapReduce (e.g., Hadoop) vs. Sistemele tradiționale


de baze de date

Database
vs.

 Multe întreprinderi au ales trecerea la Hadoop


 Mai ales în cazul aplicațiilor generatoare de big data
 Aplicații Web, rețele sociale, aplicații științifice

3
Comparație
Baze de date

vs.

Performanța (foarte multe operații


Scalabilitate (petabytes de de indexare, optimizare (tuning),
date, mii de mașini) organizare de date
Flexibilitate în acceptarea Procesare interactivă
oricărui format de date (fără
schemă) Tranzacții și garanția consistenței
Mecanism eficient și simplu (ACID)
tolerant la erori
Caracteristici:
Produse hardware ieftine - Urmărirea provenienței
datelor
- Managementul adnotărilor
- ….
4
Ce este MapReduce?
• MapReduce este o paradigmă de calcul
• Un mecanism specific de procesare a datelor
Diferite implementări / Sisteme

• MapReduce BD Relaționale

5
Ce este Hadoop?
• Hadoop este un framework pentru procesarea distribuită a seturilor
mari de date în cadrul unor cluster-e mari de calculatoare
• Seturi de date mari → Terabytes sau petabytes de date
• Cluster-e mari → sute sau mii de noduri

• Hadoop este o implementare open-source a lui MapReduce de la


Google

• Hadoop se bazează pe un model simplu de programare denumit


MapReduce

• Hadoop se bazează pe un model de date simplu, în care orice date


se vor potrivi (any data will fit)

6
Cluster de calcul
Un rack de N mașini

O mașină ➔ Un nod

7
Cluster de calcul
• Cluster ➔ Set de mașini conectate între ele
• Cu memorie partajată (Shared-memory)
• Cu disc partajat (Shared-disk)
• Fără partajare (Shared-nothing)

Shared-memory Shared-disk
Shared-nothing

8
Ce este Hadoop? (Continuare)

• Framework-ul Hadoop constă în 2 niveluri principale


• Sistemul distribuit de fișiere (Hadoop Distributed File System - HDFS)
• Motorul de execuție (MapReduce)

9
Diferența față
de RDBMS

Componentele unui sistem de gestiune a


bazelor de date

10
Arhitectura Master/Slave a lui
Hadoop
• Arhitectura sistemului Hadoop este de tip master-slave shared-nothing

Nod Master (unul singur)

Mai multe noduri slave

11
Principiile de proiectare ale lui
Hadoop
• Permite procesarea big data

• Necesită paralelizarea operațiilor peste mii de noduri

• Produse hardware
• Un număr mare de mașini low-end (ieftine) ce lucrează în paralel
pentru a rezolva o problemă de calcul

• Acest fapt este în contrast cu Bazele de date paralele (distribuite)


• Număr mic de mașini high-end (scumpe)

12
Principiile de proiectare ale
lui Hadoop
• Paralelizare și distribuire automată
• Ascunse de utilizatorul final

• Toleranță la erori și recuperare automată


• Nodurile/task-urile vor eșua și se vor recupera automat

• Abstractizare simplă din punct de vedere al programării


• Utilizatorii vor furniza doar 2 funcții: “map” și “reduce”

13
Cine utilizează MapReduce/Hadoop?

• Google: Inventatorii paradigmei de calcul MapReduce

• Yahoo: Au dezvoltat Hadoop – implementare open-


source a lui MapReduce

• IBM, Microsoft, Oracle

• Facebook, Amazon, AOL, NetFlix

• Multe alte companii + universități și laboratoare de


cercetare

14
Hadoop: Cum funcționează?

15
Arhitectura Hadoop
• Sistem distribuit de fișiere (Distributed file system – HDFS)
• Motor de execuție (MapReduce)

Nod Master (unul singur)

Mai multe noduri slave

16
Hadoop Distributed File System
(HDFS)

Namenode centralizat
- Menține metadatele despre fișiere

Fișier F
Blocuri (64 MB)

Mai multe datanodes (de ordinul


miilor)
- Stochează efectiv datele
- Fișierele sunt divizate în blocuri
- Fiecare bloc este replicat de N ori
(implicit, N = 3)

17
Proprietățile principale ale
HDFS
• Dimensiune: O instanță HDFS poate consta din mii de mașini server,
fiecare stocând o parte a datelor sistemului de fișiere

• Replicare: Fiecare bloc de date este replicat de mai multe ori


(implicit, de 3 ori)

• Defecte (Erori/eșecuri): Acestea sunt mai degrabă norma decât


excepția

• Toleranța la defecte: Detectarea acestora și recuperarea rapidă și


automată reprezintă un obiectiv arhitectural de bază al HDFS
• Namenode-ul verifică în mod constant Datanode-urile

18
Motorul de execuție Map-Reduce
(Exemplu: Numărarea culorilor)
Blocuri de Se produc Shuffle & Sorting Se consumă (k, [v])
intrare în HDFS perechi (k, v) pe baza cheilor k ( , [1,1,1,1,1,1..])
( , 1)
Produce (k’, v’)
Map Parse-hash ( , 100)
Reduce

Map Parse-hash
Reduce

Map Parse-hash
Reduce

Map Parse-hash

Utilizatorii furnizează doar funcțiile “Map” și “Reduce”


19
Proprietăți ale motorului MapReduce
• Job Tracker este nodul master (rulează împreună cu namenode-ul)
• Primește job-ul utilizatorului
• Decide câte task-uri va rula (numărul de mapper-e)
• Decide unde va rula fiecare mapper (conceptul de localizare)

Nod 1 Nod 2 Nod 3

• Acest fișier are 5 blocuri → rulează 5 task-


uri de tip map

• Unde va rula task-ul ce citește blocul “1”?


• Încearcă să îl ruleze pe nodul 1 sau
nodul 3

20
Proprietăți ale motorului
MapReduce (Continuare)
• Task Tracker este nodul slave (rulează pe fiecare datanode)
• Primește task-ul de la Job Tracker
• Rulează task-ul până la finalizare (fie că este task de tip map, fie reduce)
• Se află întotdeauna în comunicare cu Job Tracker (în privința progresului raportat)

Map Parse-hash
Reduce

Map Parse-hash În acest exemplu, un job map-


Reduce
reduce constă din 4 task-uri de tip
map și 3 task-uri de tip reduce
Map Parse-hash
Reduce

Map Parse-hash

21
Perechi cheie-valoare
• Codul funcțiilor Mapper și Reducer este furnizat de utilizator

• Este necesară doar respectarea interfeței perechilor cheie-valoare (Key-Value)

• Funcțiile mapper:
• Consumă perechile <key, value>
• Produc perechi <key, value>

• Funcțiile reducer:
• Consumă <key, <list of values>>
• Produc <key, value>

• Amestecare și sortare (Shuffling and Sorting):


• Etapă ascunsă între funcțiile mapper și cele reducer
• Grupează toate cheile similare din toate funcțiile mapper, le sortează și le transmite unui anumit
reducer sub forma <key, <list of values>>

22
Etapele MapReduce

Decizia cu privire la elementul care va reprezenta cheia și cel care va


reprezenta valoarea ➔ responsabilitatea dezvoltatorului

23
Exemplul 1: Numărarea
cuvintelor
• Job: Numărarea aparițiilor fiecărui cuvânt într-un set de date

Task-uri Task-uri
Map Reduce

24
Exemplul 2: Numărarea culorilor
Job: Numărarea fiecărei culori într-un set de date
Blocuri de
intrare în Se produc (k, v) Shuffle & Sorting Se consumă (k, [v])
HDFS ( , 1) bazat pe k ( , [1,1,1,1,1,1..])

Se produc (k’, v’)


Map Parse-hash ( , 100)
Reduce Part0001

Map Parse-hash
Reduce Part0002

Map Parse-hash
Reduce Part0003

Map Parse-hash
Acesta este fișierul de ieșire –
are 3 părți, probabil pe 3 mașini
25 diferite
Exemplul 3: Filtrarea culorilor
Job: Să se selecteze doar culorile albastru și verde
Blocurile de Se produc (k, v) • Fiecare task de tip map va
intrare în HDFS ( , 1)
selecta doar culorile verde și
albastru
Scriere pe HDFS
Map Part0001
• Nu este necesară etapa reduce
Scriere pe HDFS
Map Part0002
Acesta este fișierul de
ieșire; are 4 părți pe
Scriere pe HDFS
Map Part0003 (probabil) 4 mașini
diferite

Scriere pe HDFS
Map Part0004

26
Etapele MapReduce

Decizia cu privire la elementul care va reprezenta cheia și cel care va


reprezenta valoarea ➔ responsabilitatea dezvoltatorului

27
Granularitatea procesării

• Mapper-e
• Rulează înregistrare cu înregistrare
• Codul procesează înregistrarea respectivă și poate
produce:
• Zero, una sau mai multe ieșiri

• Reducer-e
• Rulează pe bază de grup de înregistrări (având aceeași
cheie)
• Codul procesează grupul respectiv și poate produce:
• Zero, una sau mai multe ieșiri

28
Implementare în Java Extindere a clasei Mapper din Hadoop

Funcție Map

Extindere a clasei Reducer din Hadoop

Funcție Reduce

Configurare Job

Numărarea cuvintelor în Java (https://hadoop.apache.org/docs/stable/hadoop-


mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)
Optimizare 1

• În exemplul referitor la numărarea culorilor, presupunem că știm că numărul de culori


este mic → putem utiliza partea de map

• Fiecare funcție map poate avea un hash table mic în 10


memoria principală (color, count) 5
• Cu fiecare linie, se actualizează tabelul hash și nu se
produce nimic 7
• Când se încheie, se raportează fiecare culoare și numărul 20
asociat ei

30
Optimizarea 1: Are loc în cadrul mapper-elor

Sunt reduse mesajele în rețea (Etapă foarte costisitoare, de obicei)


Blocuri de
eintrare în Se produc (k, v) Shuffle & Sorting Se consumă (k, [v])
HDFS ( , 100) bazat pe k ( , [1,1,1,1,1,1..])

Se produc (k’, v’)


Map Parse-hash ( , 100)
Reduce Part0001

Map Parse-hash
Reduce Part0002

Map Parse-hash
Reduce Part0003

Map Parse-hash
Acesta este fișierul de
ieșire; are 3 părți, probabil
31 pe 3 mașini diferite
Clasa Mapper
Se apelează o dată după procesarea
tuturor înregistrărilor (Aici se poate
produce output-ul)

Este apelată pentru


fiecare înregistrare

Se apelează o dată înaintea


procesării înregistrărilor (Aici poate
fi construit tabelul hash)

https://hadoop.apache.org/docs/stable/api/org/
apache/hadoop/mapreduce/Mapper.html
32
Optimizare 2: Map-Combine-Reduce
• Idee: agregarea parțială a rezultatelor obținute de mapper-e pe
fiecare mașină

Mappers 1…3 Mappers 4…6 Mappers 7…9

• Un combiner este un reducer care rulează pe fiecare mașină pentru a


agrega parțial (tot prin cod scris de utilizator) rezultatele mapper-elor de pe
mașina respectivă
• Apoi, ieșirile combiner-elor sunt amestecate / sortate pentru reducer-e.
33
Optimizare 2: În afara Mapper-elor, dar pe
fiecare mașină
Combiner-ul rulează pe fiecare nod pentru a agrega parțial rezultatele (ieșirile)
mapper-elor locale Amestecare și
Blocuri de Se produc (k, v) sortare (Shuffle & Se consumă (k, [v])
intrare pe HDFS ( , 1) Sorting) bazată pe k ( , [1,1,1,1,1,1..])

Se produc (k’, v’)


Map Parse-hash ( , 100)
Reduce Part0001

Map Parse-hash
Reduce Part0002

Map Parse-hash
Reduce Part0003

Map Parse-hash
Acesta este fișierul de
ieșire; are 3 părți, probabil
34 pe 3 mașini diferite
Configurarea Hadoop pentru a folosi un
Combiner

Folosește un combiner

35
Optimizare 3: Execuție speculativă

• Dacă un nod este încet, va încetini întregul job

• Execuție speculativă: Hadoop rulează automat fiecare task de mai


multe ori în paralel pe noduri diferite
• Atunci când se încheie primul, celelalte vor fi oprite forțat

36
Optimizare 4: Localizare
• Localizare: încearcă să ruleze codul funcției map pe mașina pe care
se află datele relevante
• Dacă nu este posibil, atunci încearcă pe o mașină din același rack
• Eforturi mari, fără nicio garanție

37
Transformarea operațiilor din
bazele de date în job-uri
Hadoop

38
Operații pe bazele de date
• Selecție (Filtrare)

• Proiecție

• Grupare și agregare

• Eliminarea duplicatelor

• Join

39
Selecție: σ
• Operatorul Select: σc (R):
• c este o condiție pe atributele relației R
• Selectează o submulțime de tupluri din R care satisfac condiția de selecție c

Select *
From R
Where R.A = R.B
And R.D > 5;

40
Revenire la filtrarea culorilor...
Job: Să se selecteze doar culorile albastru și verde
Blocuri de intrare Se produc (k, v) • Fiecare task de tip map va
pe HDFS ( , 1)
selecta doar culorile albastru și
verde
Scriere în HDFS
Map Part0001
• Nu este necesară etapa reduce
Scriere în HDFS
Map Part0002
Acesta este fișierul de
ieșire; are 4 părți, probabil
Scriere în HDFS
Map Part0003 pe 4 mașini

Scriere în HDFS
Map Part0004

41
Proiecție: π
• πA1, A2, …, An (R), unde A1, A2, …, An  mulțimii de atribute AR
• Returnează toate tuplurile din R, dar doar coloanele A1, A2, …, An

• A1, A2, …, An alcătuiesc Lista de Proiecție

Compute this expression


Rename column A to V and call it X
Select C, A as V, C*3+B as X
From R;
π C, VßA, Xß C*3+B (R)

R
A B C
C V X
1 2 5
5 1 17
3 4 6
6 3 22
1 2 7
7 1 23
1 2 8
8 1 26

42
Grupare și agregare
• Funcția de agregare ia o colecție de valori și returnează o valoare
singulară ca rezultat
• avg: valoarea medie
• min: valoarea minimă
• max: valoarea maximă
• sum: sumă de valori
• count: număr de valori

• Operația de grupare și agregare în algebra relațională


• g1,g2, …gm, F1(A1), F2(A2), …Fn(An) (R)
• R este o relație sau o expresie din algebra relațională
• g1, g2, …gm alcătuiesc o listă de atribute pe baza cărora grupăm (lista poate fi vidă)
• Fiecare Fi este o funcție agregat aplicată asupra atributului Ai în cadrul fiecărui grup

43
Operatorul de Groupare &
Agregare : Exemplu

Select sum(C) Select sum(balance)


From R; From S
Group By branch_name;

44
Revenim la numărarea
cuvintelor...
• Job: Să se numere aparițiile fiecărui cuvânt dintr-un set de date

Task-uri Map Task-uri Reduce

45
Eliminarea duplicatelor:  (R)

• Șterge toate înregistrările duplicat

• Convertește un bag la un set


Select Distinct *
From R;
R
d (R)
A B
1 2 A B
3 4 1 2
1 2 3 4
1 2

46
Join: R ⋈C S
• Operația θ-Join este produsul cartezian asupra căruia se
aplică o condiție C

• Este definit ca: R ⋈C S = (σC (R X S))

47
Compunerea (join) a două seturi mari de date:
Re-Partiționarea Join-ului
Dataset A Dataset B Different join keys

Reducer-ele realizează join-


ul efectiv

Amestecare și sortare
(Shuffling & sorting) prin
Etapa “Shuffling and Sorting”
rețea

- Fiecare mapper procesează


un bloc (split)

- Fiecare mapper produce


cheia pentru join și perechile
de înregistrări

HDFS stochează blocurile


de date
(Replicile nu sunt afișate)
48
Compunerea (join) a unui set mare de date (A) cu un set de
date mic (B): Broadcast/Replication Join
Dataset A Dataset B Different join keys

• Fiecare task de tip map procesează un bloc din A și întregul B

• Fiecare task de tip map efectuează join-ul (job Map-Only)

• Evită amestecarea și reduce etapele costisitoare

HDFS stochează blocurile


de date
(Replicile nu sunt afișate)
49
Transformarea operațiilor din bazele de date în
job-uri Hadoop
(Rezumat)
• Selecția (Filtrarea) → Job Map-only

• Proiecția → Job Map-only

• Gruparea și agregarea → Job Map-Reduce

• Eliminarea duplicatelor → Job Map-Reduce


• Map (Cheia= codul hash al tuplului, Valoarea= tuplul însuși)

• Join → Job Map-Reduce

50
Modelul Black-Box al lui
Hadoop
• SGBD-urile au un model Open-Box
• Datele (structura) sunt cunoscute (Schema BD)
• Cererile sunt cunoscute (scrise în SQL)

• Hadoop are un model Black-Box


• Datele (structura) nu sunt cunoscute (fișiere cu structură
necunoscută)
• Job-urile sunt, de asemenea, necunoscute (scrise în Java)

51
Toleranța la erori în Hadoop
• Datele intermediare între mapper-e și reducer-e sunt materializate spre a realiza
o toleranță la erori simplă și directă

• Ce se întâmplă dacă eșuează un task (map sau reduce)?


• TaskTracker detectează eroarea (căderea)
• Trimite mesaj către JobTracker
• JobTracker-ul re-planifică task-ul

• Ce se întâmplă dacă eșuează un datanode?


• Atât NameNode cât și JobTracker detectează eroarea
• Toate task-urile din nodul eșuat sunt re-planificate
• NameNode replică datele utilizatorului într-un alt nod Date intermediare
(materializate)
• Ce se întâmplă dacă eșuează un NameNode sau JobTracker?
• Întregul cluster este down

52
Simplitatea provine din…
• Job-urile sunt read-only (nu modifică date)

• Datele intermediare dintre mapper-e și reducer-e sunt


materializate până când se încheie job-ul

53
Mai multe despre etapele de
execuție

54
Etapele de execuție
• InputFormat
• Funcția Map
• Partitioner
• Sorting & Merging
• Combiner
• Shuffling
• Merging
• Funcția Reduce
• OutputFormat
Etapele întâlnite
Job: Să se numere de câte ori apare fiecare culoare dintr-un set de date
Blocuri de Se produc (k, v) Shuffle & Sorting Se consumă(k, [v])
intrare în HDFS ( , 1) bazat pe k ( , [1,1,1,1,1,1..])

Se produc (k’, v’)


Map Parse-hash ( , 100)
Reduce Part0001

Map Parse-hash
Reduce Part0002

Map Parse-hash
Reduce Part0003

Map Parse-hash
Acesta este fișierul de ieșire; are
3 părți, probabil pe 3 mașini
56 diferite
Funcții de partiționare
• Ieșirea mapper-elor trebuie să fie partiționată
• Numărul de partiții = numărul de reducer-e
• O aceeași cheie (din toate mapper-ele) trebuie să meargă într-o aceeași
partiție (și, prin urmare, la același reducer)

• Partiționarea implicită este bazată pe hash (clasa HashPartitioner)


• Utilizează metoda hashCode() a cheii modulo numărul total de partiții
pentru a determina partiția în care trimite o pereche (cheie, valoare)
dată.

• Utilizatorii pot interveni și modifica modalitatea de partiționare


• Prin implementarea metodei getPartition() a clasei abstracte Partitioner

57
Partitioner modificat

Returnează un Id de partiție

Custom Partitioner
(https://github.com/adrianfdzm/HadoopExamples/blob/master/HadoopExamples/src/main/java/es/
afm/hadoop/examples/partitioner/totalorderv1/TotalOrderV1Partitioner.java)

58
Optimizare: Echilibrare (load balancing)
între reducer-e
• Presupunem că avem N reducer-e

• Mai multe chei {K1, K2, …, Km}

• Distribuția este asimetrică Reduce


• K1 și K2 au multe înregistrări

Trimite K1 la Reducer 1 Reduce

Trimite K2 la Reducer 2
K3, K5 Reduce

K7, K10, K20 Reduce

Restul sunt partiționate


pe bază de hash ….. Reduce

….. Reduce

59
Formate de Intrare/Ieșire
• Modelul de date din Hadoop  Orice date, în orice format, se vor potrivi (“Any
data will fit”)
• Text, format binar, cu o anumită structură etc.

• Cum înțelege și citește datele sistemul Hadoop?

• Formatul de intrare (InputFormat) este fragmentul de cod care înțelege datele


și modul în care vor fi citite
• Hadoop are câteva formate predefinite ce pot fi utilizate
• Fișiere text, fișiere de secvențe binare

60
Formate de intrare
Cititorul de înregistrări citește octeți și îi
convertește în înregistrări

Map

Map

Map

Map

Map

61
Configurarea formatelor de intrare / ieșire în
Hadoop

Definirea formatelor

62
Etapele de execuție - ok
• InputFormat
• Map function
• Partitioner
• Sorting & Merging
• Combiner
• Shuffling
• Merging
• Reduce function
• OutputFormat
Mai multe despre HDFS

64
HDFS și politica de plasare
(Placement Policy)
Politica de plasare implicită
• Prima copie este scrisă în nodul care a creat
fișierul (write affinity)

• A doua copie este scrisă într-un data node


din cadrul aceluiași rack

• A treia copie este scrisă într-un data node


dintr-un rack diferit

• Obiectiv: load balancing & toleranța la erori

Plasarea replicilor în funcție de rack

65
Pornire în Safemode
 La pornire Namenode-ul intră în modul Safemode (câteva secunde).

 Fiecare DataNode se înregistrează cu Heartbeat și BlockReport.

 Namenode verifică dacă fiecare bloc are un număr acceptabil de


replici

 Dacă lucrurile sunt corecte ➔ Namenode părăsește starea Safemode

 Dacă unele blocuri nu au suficiente replici


 Aceste blocuri sunt replicate în alte datanode-uri
 Apoi, iese din safemode

02/20/2023 66
Protocolul de comunicare

 Toate protocoalele de comunicare HDFS sunt definite peste protocolul TCP/IP

 Un client stabilește o conexiune la un port TCP configurabil de pe mașina


Namenode. Utilizează ClientProtocol în comunicarea cu Namenode

 Datanode-urile comunică cu Namenode folosind DatanodeProtocol.

 Transferurile de fișiere se fac direct între datanode-uri


 Nu trec prin namenode

02/20/2023 67
Configurare
• Există câteva fișiere care controlează configurările cluster-elor Hadoop
• Mapred-site.xml: parametrii map-reduce
• Hdfs-site.xml: parametrii HDFS
• Masters: Care sunt nodurile master?
• Slaves: Care sunt nodurile slave?

• Hadoop are în jur de 190 parametri


• Cei mai folosiți sunt în jur de 10-20

68
Interfață Web
• Există o interfață de monitorizare a cluster-ului HDFS, accesibilă la
portul 50070
• Pe lângă aceasta, există utilitare speciale de monitorizare pentru
Hadoop: Datadog, LogicMonitor, Dynatrace

69
Concluzie: Hadoop vs. Alte sisteme
Baze de date distribuite Hadoop
Modelul de calcul - Noțiunea de tranzacție - Noțiunea de job
- Tranzacția este unitatea de - Job-ul este unitatea de lucru
lucru - Fără control al concurenței
- Proprietățile ACID, controlul
concurenței
Modelul de date - Date structurate având schema - Orice date, având orice format, se vor
cunoscută potrivi
- Mod Read/Write - Date (ne)(semi)structurate
- Mod ReadOnly
Modelul de cost - Server-e scumpe - Mașini ieftine
Toleranța la erori - Eșecurile sunt rare - Eșecurile sunt destul de comune în cazul
- Mecanisme de recuperare miilor de mașini
(recovery) - Toleranță la erori simplă, dar eficientă
Caracteristici cheie - Eficiență, optimizare, fine-tuning - Scalabilitate, flexibilitate, toleranță la erori
• Cloud Computing
• Un model de calcul în care orice infrastructură de calcul poate
rula în cloud
• Hardware & Software sunt furnizate ca servicii distante
• Elasticitate: se mărește sau scade pe baza cererilor utilizatorilor
• Exemplu: Amazon EC2 70
Caracteristici SGBD

• Datele sunt structurate (structura cunoscută în


avans)

• Datele sunt corecte și sigure

• Datele sunt relativ statice și de dimensiune mică


spre medie

• Modelul de acces: Mix Read/Write

• Noțiunea de tranzacții

În Big Data: modelul este read


only, nu există noțiunea de
tranzacție 71
Caracteristici Hadoop

• Orice structură se va potrivi

• Datele sunt corecte și sigure

• Datele sunt statice, dar pot scala până la


petabytes

• Modelul de acces: Read-Only

• Noțiunea de job

În Big Data: modelul este


read only. Nu există
noțiunea de tranzacție.
72

S-ar putea să vă placă și