3.1 Historie om fremveksten av begrepet BigData

Begrepet Big Data dukket opp relativt nylig. Google Trender viser begynnelsen på en aktiv vekst i bruken av uttrykket siden 2011:

Samtidig er det bare den late som ikke bruker begrepet nå. Spesielt ofte brukes begrepet upassende av markedsførere. Så hva er egentlig Big Data? Siden jeg bestemte meg for systematisk å angi og fremheve problemstillingen, er det nødvendig å definere konseptet.

I min praksis møtte jeg forskjellige definisjoner:

  • Big Data er når det er mer enn 100 GB med data (500 GB, 1 TB, hva du måtte ønske).
  • Big Data er data som ikke kan behandles i Excel.
  • Big Data er data som ikke kan behandles på en enkelt datamaskin.

Og til og med disse:

  • Big Data er generelt all data.
  • Big Data finnes ikke, det ble oppfunnet av markedsførere.

Jeg vil holde meg til definisjonen fra wikipedia:

Big data er en rekke tilnærminger, verktøy og metoder for å behandle strukturerte og ustrukturerte data av enorme volumer og betydelig mangfold for å oppnå menneskeskjønne resultater som er effektive under forhold med kontinuerlig vekst, distribusjon over tallrike noder i et datanettverk, dannet på slutten av 2000-tallet, alternativ til tradisjonelle databasestyringssystemer og løsninger for business intelligence-klasse.

Med Big Data vil jeg derfor ikke forstå en bestemt mengde data og ikke engang selve dataene, men metoder for å behandle dem, som tillater distribuert behandling av informasjon. Disse metodene kan brukes på store datasett (som innholdet på alle sider på Internett) så vel som små datasett (som innholdet i denne forelesningen).

Her er noen eksempler på hva som kan være en datakilde som krever big data-teknikker:

  • Logger over brukeratferd på Internett
  • GPS-signaler fra biler for et transportfirma
  • Data hentet fra sensorer i Large Hadron Collider
  • Digitaliserte bøker i det russiske statsbiblioteket
  • Informasjon om transaksjoner til alle bankkunder
  • Informasjon om alle kjøp i en stor butikkjede mv.

Antallet datakilder vokser raskt, noe som betyr at databehandlingsteknologier blir mer og mer etterspurt.

3.2 Big data-prinsipper

Basert på definisjonen av Big Data kan vi formulere de grunnleggende prinsippene for å arbeide med slike data:

1. Horisontal skalerbarhet. Siden det kan være en vilkårlig stor mengde data, må ethvert system som involverer behandling av store data være utvidbart. Datavolumet økte med 2 ganger - mengden jern i klyngen ble økt med 2 ganger og alt fortsatte å fungere.

2. Feiltoleranse. Prinsippet om horisontal skalerbarhet innebærer at det kan være mange maskiner i en klynge. For eksempel har Yahoos Hadoop-klynge over 42 000 maskiner (du kan se klyngestørrelser på tvers av organisasjoner på denne lenken). Dette betyr at noen av disse maskinene garantert vil feile. Big data-praksis må være klar over disse forstyrrelsene og overleve dem uten vesentlige konsekvenser.

3. Datalokalitet. I store distribuerte systemer er data fordelt på et stort antall maskiner. Dersom dataene er fysisk plassert på en server og behandlet på en annen, kan kostnadene ved dataoverføring overstige kostnadene ved selve behandlingen. Derfor er et av de viktigste prinsippene for å designe BigData-løsninger prinsippet om datalokalitet – hvis mulig behandler vi data på samme maskin som vi lagrer dem på.

Alle moderne stordataverktøy følger disse tre prinsippene på en eller annen måte. For å følge dem er det nødvendig å komme med noen metoder, metoder og paradigmer for å utvikle datautviklingsverktøy. En av de mest klassiske metodene jeg skal analysere i dagens forelesning.

3.3 MapReduce

MapReduce er en distribuert databehandlingsmodell foreslått av Google for å behandle store mengder data på dataklynger. MapReduce er godt illustrert av følgende bilde:

MapReduce antar at dataene er organisert i noen poster. Databehandling skjer i 3 trinn:

1. Kartetappe . På dette stadiet blir dataene forhåndsbehandlet ved hjelp av map()-funksjonen, som er definert av brukeren. Arbeidet på dette stadiet er å forhåndsbehandle og filtrere dataene. Operasjonen er veldig lik kartoperasjonen i funksjonelle programmeringsspråk - en tilpasset funksjon brukes på hver inngangspost.

Map()-funksjonen brukt på en enkelt inngangspost produserer mange nøkkelverdi-par. Sett - det vil si at den bare kan returnere én post, den kan ikke returnere noe, eller den kan returnere flere nøkkelverdi-par. Hva som vil være i nøkkelen og i verdien er opp til brukeren, men nøkkelen er en veldig viktig ting, siden data med én nøkkel i fremtiden vil falle inn i én forekomst av reduksjonsfunksjonen.

2. Stage Shuffle. Det går ubemerket av brukeren. I dette stadiet blir utgangen fra kartfunksjonen "binned" - hver bin tilsvarer én utdatanøkkel for kartetrinnet. I fremtiden vil disse kurvene tjene som et input for reduksjon.

3. Stage Reduser. Hver "kurv" med verdier generert på shuffle-stadiet kommer til inngangen til reduce()-funksjonen.

Reduseringsfunksjonen er gitt av brukeren og beregner det endelige resultatet for en enkelt "kurv" . Settet med alle verdier returnert av reduce()-funksjonen er det endelige resultatet av MapReduce-oppgaven.

Noen tilleggsfakta om MapReduce:

  1. Alle kjøringer av kartfunksjonen fungerer uavhengig og kan kjøres parallelt, inkludert på forskjellige klyngemaskiner.
  2. Alle kjøringer av reduksjonsfunksjonen fungerer uavhengig og kan kjøres parallelt, inkludert på forskjellige klyngemaskiner.
  3. Shuffle internt representerer en parallell sortering, så den kan også fungere på forskjellige klyngemaskiner. Punktene 1-3 lar deg implementere prinsippet om horisontal skalerbarhet .
  4. Kartfunksjonen brukes vanligvis på samme maskin hvor dataene er lagret - dette reduserer overføringen av data over nettverket (prinsippet om datalokalitet).
  5. MapReduce er alltid en fullstendig dataskanning, det er ingen indekser. Dette betyr at MapReduce er dårlig anvendelig når det kreves respons veldig raskt.

3.4 Eksempler på oppgaver løst effektivt med MapReduce

Ordtelling

La oss starte med den klassiske oppgaven - Ordtelling. Oppgaven er formulert slik: det er et stort korpus av dokumenter. Oppgaven er å beregne det totale antallet ganger det forekommer i korpuset for hvert ord som forekommer minst én gang i korpuset.

Løsning:

Siden vi har et stort korpus av dokumenter, la ett dokument være én inngangspost for MapRreduce-oppgaven. I MapReduce kan vi bare definere brukerdefinerte funksjoner, som vi vil gjøre (vi vil bruke python-lignende pseudokode):

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

Kartfunksjonen gjør inndatadokumentet til et sett med par (ord, 1), bland gjennomsiktig for oss gjør det til par (ord, [1,1,1,1,1,1]), reduser summer av disse, returnerer det endelige svaret for ordet.

Behandling av annonsesystemlogger

Det andre eksemplet er hentet fra den virkelige praksisen til Data-Centric Alliance.

Oppgave: det er en csv-logg for reklamesystemet til skjemaet:

<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ødvendig å beregne den gjennomsnittlige kostnaden for å vise reklame i byene i Russland.

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) 

Kartfunksjonen sjekker om vi trenger denne oppføringen - og hvis vi gjør det, etterlater den kun nødvendig informasjon (by og betalingsbeløp). Reduseringsfunksjonen beregner det endelige svaret for en by gitt en liste over alle betalinger i den byen .