3.1 Historie om fremkomsten af ​​udtrykket BigData

Begrebet Big Data dukkede op for relativt nylig. Google Trends viser begyndelsen på en aktiv vækst i brugen af ​​sætningen siden 2011:

Samtidig er det kun den dovne, der ikke bruger udtrykket nu. Især ofte bruges udtrykket uhensigtsmæssigt af marketingfolk. Så hvad er Big Data egentlig? Da jeg besluttede mig for systematisk at angive og fremhæve problemstillingen, er det nødvendigt at definere begrebet.

I min praksis mødte jeg forskellige definitioner:

  • Big Data er, når der er mere end 100 GB data (500 GB, 1 TB, hvad end du vil).
  • Big Data er data, der ikke kan behandles i Excel.
  • Big Data er data, der ikke kan behandles på en enkelt computer.

Og endda disse:

  • Big Data er generelt enhver data.
  • Big Data findes ikke, det er opfundet af marketingfolk.

Jeg vil holde mig til definitionen fra wikipedia:

Big data er en række tilgange, værktøjer og metoder til behandling af strukturerede og ustrukturerede data af enorme mængder og betydelig mangfoldighed for at opnå menneskeopfattelige resultater, der er effektive under forhold med kontinuerlig vækst, distribution over adskillige knudepunkter i et computernetværk, dannet i slutningen af ​​2000'erne, alternativ til traditionelle databasestyringssystemer og business intelligence-klasseløsninger.

Med Big Data vil jeg således ikke forstå en bestemt mængde data og ikke engang selve dataene, men metoder til at behandle dem, som tillader distribueret behandling af information. Disse metoder kan anvendes på store datasæt (såsom indholdet af alle sider på internettet) såvel som små datasæt (såsom indholdet af denne forelæsning).

Her er nogle eksempler på, hvad der kan være en datakilde, der kræver big data-teknikker:

  • Logfiler over brugeradfærd på internettet
  • GPS-signaler fra biler til et transportfirma
  • Data taget fra sensorer i Large Hadron Collider
  • Digitaliserede bøger i det russiske statsbibliotek
  • Oplysninger om transaktioner for alle bankkunder
  • Oplysninger om alle indkøb i en stor detailkæde mv.

Antallet af datakilder vokser hurtigt, hvilket betyder, at databehandlingsteknologier bliver mere og mere efterspurgte.

3.2 Big data principper

Baseret på definitionen af ​​Big Data kan vi formulere de grundlæggende principper for at arbejde med sådanne data:

1. Horisontal skalerbarhed. Da der kan være en vilkårlig stor mængde data, skal ethvert system, der involverer behandling af store data, kunne udvides. Mængden af ​​data steg med 2 gange - mængden af ​​jern i klyngen blev øget med 2 gange, og alt fortsatte med at fungere.

2. Fejltolerance. Princippet om horisontal skalerbarhed indebærer, at der kan være mange maskiner i en klynge. For eksempel har Yahoos Hadoop-klynge over 42.000 maskiner (du kan se klyngestørrelser på tværs af organisationer på dette link). Det betyder, at nogle af disse maskiner med garanti vil fejle. Big data-praksis skal være opmærksom på disse forstyrrelser og overleve dem uden væsentlige konsekvenser.

3. Datalokalitet. I store distribuerede systemer er data fordelt på et stort antal maskiner. Hvis dataene fysisk er placeret på én server og behandles på en anden, kan omkostningerne ved dataoverførsel overstige omkostningerne ved selve behandlingen. Derfor er et af de vigtigste principper for design af BigData-løsninger princippet om datalokalitet – hvis muligt behandler vi data på den samme maskine, som vi gemmer dem på.

Alle moderne big data-værktøjer følger disse tre principper på en eller anden måde. For at følge dem er det nødvendigt at komme med nogle metoder, metoder og paradigmer til udvikling af dataudviklingsværktøjer. En af de mest klassiske metoder vil jeg analysere i dagens foredrag.

3.3 MapReduce

MapReduce er en distribueret databehandlingsmodel foreslået af Google til behandling af store mængder data på computerklynger. MapReduce er godt illustreret af følgende billede:

MapReduce antager, at dataene er organiseret i nogle poster. Databehandling foregår i 3 trin:

1. Kortstadie . På dette trin forbehandles dataene ved hjælp af map()-funktionen, som er defineret af brugeren. Arbejdet i denne fase er at forbehandle og filtrere dataene. Operationen ligner meget kortoperationen i funktionelle programmeringssprog - en brugerdefineret funktion anvendes på hver inputpost.

Map()-funktionen anvendt på en enkelt inputpost producerer mange nøgleværdi-par. Set - det vil sige, den kan kun returnere én post, den returnerer muligvis intet, eller den kan returnere flere nøgleværdi-par. Hvad der vil være i nøglen og i værdien, er op til brugeren, men nøglen er en meget vigtig ting, da data med én nøgle i fremtiden vil falde ind i én forekomst af reduktionsfunktionen.

2. Stage Shuffle. Det forbliver ubemærket af brugeren. I dette trin er udgangen af ​​kortfunktionen "binned" - hver bin svarer til en outputtast på korttrinnet. I fremtiden vil disse kurve tjene som input til reduktion.

3. Stage Reducer. Hver "kurv" med værdier genereret i blandingsstadiet kommer til input til reduce()-funktionen.

Reduceringsfunktionen gives af brugeren og beregner det endelige resultat for en enkelt "kurv" . Sættet af alle værdier, der returneres af reduce()-funktionen er det endelige resultat af MapReduce-opgaven.

Nogle yderligere fakta om MapReduce:

  1. Alle kørsler af kortfunktionen fungerer uafhængigt og kan køre parallelt, også på forskellige klyngemaskiner.
  2. Alle kørsler af reduceringsfunktionen fungerer uafhængigt og kan køre parallelt, også på forskellige klyngemaskiner.
  3. Shuffle repræsenterer internt en parallel sortering, så den kan også fungere på forskellige klyngemaskiner. Punkt 1-3 giver dig mulighed for at implementere princippet om horisontal skalerbarhed .
  4. Kortfunktionen bruges normalt på den samme maskine, hvor dataene er lagret - dette reducerer transmissionen af ​​data over netværket (princippet om datalokalitet).
  5. MapReduce er altid en fuld datascanning, der er ingen indekser. Det betyder, at MapReduce er dårligt anvendelig, når der kræves et svar meget hurtigt.

3.4 Eksempler på opgaver løst effektivt med MapReduce

Ordtælling

Lad os starte med den klassiske opgave - Ordtælling. Opgaven er formuleret således: Der er et stort korpus af dokumenter. Opgaven er at beregne det samlede antal gange, det forekommer i korpuset for hvert ord, der forekommer mindst én gang i korpuset.

Løsning:

Da vi har et stort korpus af dokumenter, lad ét dokument være én inputpost til MapRreduce-opgaven. I MapReduce kan vi kun definere brugerdefinerede funktioner, hvilket vi vil gøre (vi vil bruge python-lignende pseudokode):

def map(doc): 
for word in doc: 
yield word, 1 
def reduce(word, values): 
yield word, sum(values) 

Kortfunktionen forvandler inputdokumentet til et sæt par (ord, 1), blander gennemsigtigt for os omdanner det til par (ord, [1,1,1,1,1,1]), reducerer summer af disse, returnerer det endelige svar på ordet.

Behandling af annoncesystemlogfiler

Det andet eksempel er taget fra den virkelige praksis i Data-Centric Alliance.

Opgave: der er en csv-log over reklamesystemet for formularen:

<user_id>,<country>,<city>,<campaign_id>,<creative_id>,<payment></p> 
 
11111,RU,Moscow,2,4,0.3 
22222,RU,Voronezh,2,3,0.2 
13413,UA,Kyiv,4,11,0.7 
… 

Det er nødvendigt at beregne de gennemsnitlige omkostninger ved at vise reklamer i byerne i Rusland.

Løsning:

def map(record): 
user_id, country, city, campaign_id, creative_id, payment = record.split(",") 
payment=float(payment) 
if country == "RU": 
yield city, payment 
def reduce(city, payments): 
yield city, sum(payments)/len(payments) 

Kortfunktionen tjekker, om vi har brug for denne post - og hvis vi har, efterlader den kun de nødvendige oplysninger ( by og betalingsbeløb). Reducer -funktionen beregner det endelige svar for en by givet en liste over alle betalinger i den by.