3.1 Storia dell'emergere del termine BigData

Il termine Big Data è apparso relativamente di recente. Google Trends mostra l'inizio di una crescita attiva nell'uso della frase dal 2011:

Allo stesso tempo, solo il pigro non usa il termine adesso. Soprattutto spesso, il termine viene utilizzato in modo inappropriato dai professionisti del marketing. Quindi cosa sono veramente i Big Data? Poiché ho deciso di enunciare ed evidenziare sistematicamente il problema, è necessario definire il concetto.

Nella mia pratica, ho incontrato diverse definizioni:

  • Big Data è quando ci sono più di 100 GB di dati (500 GB, 1 TB, qualunque cosa tu voglia).
  • I Big Data sono dati che non possono essere elaborati in Excel.
  • I Big Data sono dati che non possono essere elaborati su un singolo computer.

E anche questi:

  • I Big Data sono generalmente qualsiasi dato.
  • I Big Data non esistono, sono stati inventati dai marketer.

Mi atterrò alla definizione da wikipedia:

I big data sono una serie di approcci, strumenti e metodi per elaborare dati strutturati e non strutturati di enormi volumi e diversità significative al fine di ottenere risultati percepibili dall'uomo che siano efficaci in condizioni di crescita continua, distribuzione su numerosi nodi di una rete di computer, formata alla fine degli anni 2000, alternativa ai tradizionali sistemi di gestione di database e soluzioni di classe di business intelligence.

Pertanto, per Big Data non intenderò una quantità specifica di dati e nemmeno i dati stessi, ma i metodi di elaborazione degli stessi, che consentono l'elaborazione distribuita delle informazioni. Questi metodi possono essere applicati a set di dati di grandi dimensioni (come il contenuto di tutte le pagine su Internet) e piccoli set di dati (come il contenuto di questa lezione).

Ecco alcuni esempi di quella che potrebbe essere un'origine dati che richiede tecniche di big data:

  • Registri del comportamento degli utenti su Internet
  • Segnali GPS da auto per un'azienda di trasporti
  • Dati presi dai sensori del Large Hadron Collider
  • Libri digitalizzati nella Biblioteca di Stato russa
  • Informazioni sulle transazioni di tutti i clienti della banca
  • Informazioni su tutti gli acquisti in una grande catena di vendita al dettaglio, ecc.

Il numero di fonti di dati sta crescendo rapidamente, il che significa che le tecnologie di elaborazione dei dati stanno diventando sempre più richieste.

3.2 Principi dei big data

Sulla base della definizione di Big Data, possiamo formulare i principi di base per lavorare con tali dati:

1. Scalabilità orizzontale. Poiché può esserci una quantità di dati arbitrariamente grande, qualsiasi sistema che implichi l'elaborazione di dati di grandi dimensioni deve essere estensibile. Il volume dei dati è aumentato di 2 volte: la quantità di ferro nell'ammasso è stata aumentata di 2 volte e tutto ha continuato a funzionare.

2. Tolleranza ai guasti. Il principio della scalabilità orizzontale implica che possono esserci molte macchine in un cluster. Ad esempio, il cluster Hadoop di Yahoo ha oltre 42.000 macchine (puoi vedere le dimensioni dei cluster tra le organizzazioni a questo link). Ciò significa che alcune di queste macchine avranno sicuramente un guasto. Le pratiche relative ai big data devono essere consapevoli di queste interruzioni e sopravvivere senza conseguenze significative.

3. Località dei dati. Nei grandi sistemi distribuiti, i dati vengono distribuiti su un gran numero di macchine. Se i dati si trovano fisicamente su un server ed elaborati su un altro, i costi del trasferimento dei dati possono superare i costi del trattamento stesso. Pertanto, uno dei principi più importanti per la progettazione di soluzioni BigData è il principio della località dei dati: se possibile, elaboriamo i dati sulla stessa macchina su cui li archiviamo.

Tutti i moderni strumenti per i big data seguono questi tre principi in un modo o nell'altro. Per seguirli, è necessario elaborare alcuni metodi, metodi e paradigmi per lo sviluppo di strumenti di sviluppo dei dati. Uno dei metodi più classici che analizzerò nella lezione di oggi.

3.3 MappaRiduci

MapReduce è un modello di elaborazione dati distribuito proposto da Google per l'elaborazione di grandi quantità di dati su cluster di computer. MapReduce è ben illustrato dalla seguente immagine:

MapReduce presuppone che i dati siano organizzati in alcuni record. Il trattamento dei dati avviene in 3 fasi:

1. Fase della mappa . In questa fase, i dati vengono preelaborati utilizzando la funzione map(), definita dall'utente. Il lavoro di questa fase consiste nel pre-elaborare e filtrare i dati. L'operazione è molto simile all'operazione della mappa nei linguaggi di programmazione funzionale: a ciascun record di input viene applicata una funzione personalizzata.

La funzione map() applicata a un singolo record di input produce molte coppie chiave-valore. Set, ovvero può restituire un solo record, potrebbe non restituire nulla o potrebbe restituire diverse coppie chiave-valore. Ciò che sarà nella chiave e nel valore dipende dall'utente, ma la chiave è una cosa molto importante, poiché i dati con una chiave in futuro rientreranno in un'istanza della funzione reduce.

2. Palco casuale. Passa inosservato all'utente. In questa fase, l'output della funzione map è "binned" - ogni bin corrisponde a una chiave di output della fase map. In futuro, questi panieri serviranno come input per ridurre.

3. Fase Ridurre. Ogni "carrello" con valori generati nella fase di shuffle arriva all'input della funzione reduce().

La funzione di riduzione è data dall'utente e calcola il risultato finale per un singolo "paniere" . L'insieme di tutti i valori restituiti dalla funzione reduce() è il risultato finale dell'attività MapReduce.

Alcuni fatti aggiuntivi su MapReduce:

  1. Tutte le esecuzioni della funzione map funzionano in modo indipendente e possono essere eseguite in parallelo, anche su diverse macchine cluster.
  2. Tutte le esecuzioni della funzione reduce funzionano in modo indipendente e possono essere eseguite in parallelo, anche su diverse macchine cluster.
  3. Shuffle rappresenta internamente un ordinamento parallelo, quindi può funzionare anche su diverse macchine cluster. I punti 1-3 consentono di implementare il principio della scalabilità orizzontale .
  4. La funzione mappa viene solitamente utilizzata sulla stessa macchina in cui sono archiviati i dati: ciò riduce la trasmissione dei dati sulla rete (principio della località dei dati).
  5. MapReduce è sempre una scansione completa dei dati, non ci sono indici. Ciò significa che MapReduce è scarsamente applicabile quando è richiesta una risposta molto rapidamente.

3.4 Esempi di compiti effettivamente risolti con MapReduce

Conteggio parole

Iniziamo con l'attività classica: il conteggio delle parole. Il compito è così formulato: c'è un ampio corpus di documenti. Il compito è calcolare il numero totale di volte che ricorre nel corpus per ogni parola che ricorre almeno una volta nel corpus.

Soluzione:

Poiché disponiamo di un ampio corpus di documenti, lascia che un documento sia un record di input per l'attività MapRreduce. In MapReduce, possiamo definire solo funzioni definite dall'utente, cosa che faremo (useremo uno pseudocodice simile a Python):

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

La funzione map trasforma il documento di input in un insieme di coppie (parola, 1), mescola in modo trasparente per noi lo trasforma in coppie (parola, [1,1,1,1,1,1]), riduce le somme di queste, restituendo la risposta finale per la parola .

Elaborazione dei log del sistema pubblicitario

Il secondo esempio è tratto dalla pratica reale della Data-Centric Alliance.

Compito: c'è un registro csv del sistema pubblicitario del modulo:

<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 
… 

È necessario calcolare il costo medio di visualizzazione della pubblicità nelle città della Russia.

Soluzione:

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) 

La funzione mappa verifica se abbiamo bisogno di questa voce e, in tal caso, lascia solo le informazioni necessarie (città e importo del pagamento). La funzione reduce calcola la risposta finale per una città dato un elenco di tutti i pagamenti in quella città.