3.1 Historique de l'émergence du terme BigData

Le terme Big Data est apparu relativement récemment. Google Trends montre le début d'une croissance active de l'utilisation de la phrase depuis 2011 :

En même temps, seul le paresseux n'utilise pas le terme maintenant. Surtout souvent, le terme est utilisé de manière inappropriée par les spécialistes du marketing. Alors, qu'est-ce que le Big Data ? Puisque j'ai décidé d'énoncer et de souligner systématiquement la question, il est nécessaire de définir le concept.

Dans ma pratique, j'ai rencontré différentes définitions :

  • Le Big Data, c'est quand il y a plus de 100 Go de données (500 Go, 1 To, ce que vous voulez).
  • Les Big Data sont des données qui ne peuvent pas être traitées dans Excel.
  • Les Big Data sont des données qui ne peuvent pas être traitées sur un seul ordinateur.

Et même celles-ci :

  • Le Big Data est généralement n'importe quelles données.
  • Le Big Data n'existe pas, il a été inventé par les marketeurs.

Je m'en tiendrai à la définition de wikipedia :

Le big data est un ensemble d'approches, d'outils et de méthodes de traitement de données structurées et non structurées d'énormes volumes et d'une diversité importante afin d'obtenir des résultats perceptibles par l'homme efficaces dans des conditions de croissance continue, de répartition sur de nombreux nœuds d'un réseau informatique, formés à la fin des années 2000, alternative aux systèmes traditionnels de gestion de bases de données et aux solutions de classe d'intelligence d'affaires.

Ainsi, par Big Data, j'entendrai non pas une quantité spécifique de données et même pas les données elles-mêmes, mais des méthodes de traitement de celles-ci, qui permettent un traitement distribué de l'information. Ces méthodes peuvent être appliquées à de grands ensembles de données (tels que le contenu de toutes les pages sur Internet) ainsi qu'à de petits ensembles de données (tels que le contenu de cette conférence).

Voici quelques exemples de ce que pourrait être une source de données nécessitant des techniques de Big Data :

  • Journaux du comportement des utilisateurs sur Internet
  • Signaux GPS des voitures pour une entreprise de transport
  • Données extraites des capteurs du Large Hadron Collider
  • Livres numérisés à la Bibliothèque d'État de Russie
  • Informations sur les transactions de tous les clients de la banque
  • Informations sur tous les achats dans une grande chaîne de distribution, etc.

Le nombre de sources de données augmente rapidement, ce qui signifie que les technologies de traitement des données sont de plus en plus demandées.

3.2 Principes des mégadonnées

Sur la base de la définition du Big Data, nous pouvons formuler les principes de base du travail avec de telles données :

1. Évolutivité horizontale. Puisqu'il peut y avoir une quantité arbitrairement grande de données, tout système impliquant le traitement de données volumineuses doit être extensible. Le volume de données a été multiplié par 2 - la quantité de fer dans le cluster a été multipliée par 2 et tout a continué à fonctionner.

2. Tolérance aux pannes. Le principe d'évolutivité horizontale implique qu'il peut y avoir plusieurs machines dans un cluster. Par exemple, le cluster Hadoop de Yahoo compte plus de 42 000 machines (vous pouvez voir la taille des clusters dans toutes les organisations sur ce lien). Cela signifie que certaines de ces machines seront garanties de tomber en panne. Les pratiques du Big Data doivent être conscientes de ces perturbations et y survivre sans conséquences significatives.

3. Localité des données. Dans les grands systèmes distribués, les données sont réparties sur un grand nombre de machines. Si les données sont physiquement situées sur un serveur et traitées sur un autre, les coûts de transfert des données peuvent dépasser les coûts du traitement lui-même. Par conséquent, l'un des principes les plus importants pour concevoir des solutions BigData est le principe de localité des données - si possible, nous traitons les données sur la même machine sur laquelle nous les stockons.

Tous les outils de big data modernes suivent ces trois principes d'une manière ou d'une autre. Afin de les suivre, il est nécessaire de proposer des méthodes, des méthodes et des paradigmes pour développer des outils de développement de données. L'une des méthodes les plus classiques que j'analyserai dans la conférence d'aujourd'hui.

3.3 MapReduce

MapReduce est un modèle de traitement de données distribué proposé par Google pour traiter de grandes quantités de données sur des grappes d'ordinateurs. MapReduce est bien illustré par l'image suivante :

MapReduce suppose que les données sont organisées en certains enregistrements. Le traitement des données se déroule en 3 étapes :

1. Étape de la carte . A ce stade, les données sont prétraitées à l'aide de la fonction map(), qui est définie par l'utilisateur. Le travail de cette étape consiste à prétraiter et filtrer les données. L'opération est très similaire à l'opération de carte dans les langages de programmation fonctionnels - une fonction personnalisée est appliquée à chaque enregistrement d'entrée.

La fonction map() appliquée à un seul enregistrement d'entrée produit de nombreuses paires clé-valeur. Set - c'est-à-dire qu'il ne peut renvoyer qu'un seul enregistrement, qu'il ne peut rien renvoyer ou qu'il peut renvoyer plusieurs paires clé-valeur. Ce qui sera dans la clé et dans la valeur dépend de l'utilisateur, mais la clé est une chose très importante, car les données avec une clé à l'avenir tomberont dans une instance de la fonction reduce.

2. Mélanger les scènes. Il passe inaperçu pour l'utilisateur. Dans cette étape, la sortie de la fonction map est "binnée" - chaque bin correspond à une clé de sortie de l'étape map. À l'avenir, ces paniers serviront d'intrant pour réduire.

3. Étape Réduire. Chaque "panier" avec des valeurs générées à l'étape de mélange arrive à l'entrée de la fonction reduce().

La fonction de réduction est donnée par l'utilisateur et calcule le résultat final pour un seul "panier" . L'ensemble de toutes les valeurs renvoyées par la fonction reduce() est le résultat final de la tâche MapReduce.

Quelques faits supplémentaires sur MapReduce :

  1. Toutes les exécutions de la fonction de carte fonctionnent indépendamment et peuvent s'exécuter en parallèle, y compris sur différentes machines du cluster.
  2. Toutes les exécutions de la fonction reduce fonctionnent indépendamment et peuvent s'exécuter en parallèle, y compris sur différentes machines du cluster.
  3. Shuffle représente en interne un tri parallèle, il peut donc également fonctionner sur différentes machines de cluster. Les points 1 à 3 vous permettent de mettre en œuvre le principe d'évolutivité horizontale .
  4. La fonction de carte est généralement utilisée sur la même machine où les données sont stockées - cela réduit la transmission des données sur le réseau (principe de localité des données).
  5. MapReduce est toujours une analyse complète des données, il n'y a pas d'index. Cela signifie que MapReduce est peu applicable lorsqu'une réponse est requise très rapidement.

3.4 Exemples de tâches résolues efficacement avec MapReduce

Nombre de mots

Commençons par la tâche classique - Word Count. La tâche est formulée comme suit : il existe un grand corpus de documents. La tâche consiste à calculer le nombre total de fois qu'il apparaît dans le corpus pour chaque mot qui apparaît au moins une fois dans le corpus.

Solution:

Puisque nous avons un grand corpus de documents, laissez un document être un enregistrement d'entrée pour la tâche MapRreduce. Dans MapReduce, nous ne pouvons définir que des fonctions définies par l'utilisateur, ce que nous ferons (nous utiliserons un pseudocode de type python) :

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

La fonction map transforme le document d'entrée en un ensemble de paires (mot, 1), shuffle de manière transparente pour nous le transforme en paires (mot, [1,1,1,1,1,1]), réduit les sommes de ceux-ci, retournant la réponse finale pour le mot.

Traitement des journaux du système publicitaire

Le second exemple est tiré de la pratique réelle de la Data-Centric Alliance.

Tâche : il existe un csv-log du système de publicité du formulaire :

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

Il est nécessaire de calculer le coût moyen de l'affichage de la publicité dans les villes de Russie.

Solution:

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 fonction de carte vérifie si nous avons besoin de cette entrée - et si c'est le cas, elle ne laisse que les informations nécessaires (ville et montant du paiement). La fonction de réduction calcule la réponse finale pour une ville à partir d'une liste de tous les paiements dans cette ville.