Apache Spark - RDD

Ensembles de données distribués résilients

Les ensembles de données distribués résilients (RDD) sont une structure de données fondamentale de Spark. C'est une collection d'objets distribués immuable. Chaque ensemble de données dans RDD est divisé en partitions logiques, qui peuvent être calculées sur différents nœuds du cluster. Les RDD peuvent contenir tout type d'objets Python, Java ou Scala, y compris des classes définies par l'utilisateur.

Formellement, un RDD est une collection d'enregistrements partitionnés en lecture seule. Les RDD peuvent être créés par des opérations déterministes sur des données sur un stockage stable ou sur d'autres RDD. RDD est un ensemble d'éléments tolérants aux pannes pouvant être exploités en parallèle.

Il existe deux façons de créer des RDD - parallelizing une collection existante dans votre programme de pilote, ou referencing a dataset dans un système de stockage externe, tel qu'un système de fichiers partagé, HDFS, HBase ou toute source de données offrant un format d'entrée Hadoop.

Spark utilise le concept de RDD pour réaliser des opérations MapReduce plus rapides et efficaces. Voyons d'abord comment les opérations MapReduce se déroulent et pourquoi elles ne sont pas aussi efficaces.

Le partage de données est lent dans MapReduce

MapReduce est largement adopté pour traiter et générer de grands ensembles de données avec un algorithme parallèle et distribué sur un cluster. Il permet aux utilisateurs d'écrire des calculs parallèles, à l'aide d'un ensemble d'opérateurs de haut niveau, sans avoir à se soucier de la répartition du travail et de la tolérance aux pannes.

Malheureusement, dans la plupart des frameworks actuels, le seul moyen de réutiliser les données entre les calculs (Ex - entre deux travaux MapReduce) est de les écrire sur un système de stockage externe stable (Ex - HDFS). Bien que ce framework fournisse de nombreuses abstractions pour accéder aux ressources de calcul d'un cluster, les utilisateurs en veulent toujours plus.

Tous les deux Iterative et Interactiveles applications nécessitent un partage de données plus rapide entre les travaux parallèles. Le partage des données est lent dans MapReduce en raison dereplication, serialization, et disk IO. En ce qui concerne le système de stockage, la plupart des applications Hadoop passent plus de 90% du temps à effectuer des opérations de lecture-écriture HDFS.

Opérations itératives sur MapReduce

Réutilisez les résultats intermédiaires sur plusieurs calculs dans des applications en plusieurs étapes. L'illustration suivante explique le fonctionnement de l'infrastructure actuelle, tout en effectuant les opérations itératives sur MapReduce. Cela entraîne des frais généraux importants dus à la réplication des données, aux E / S de disque et à la sérialisation, ce qui ralentit le système.

Opérations interactives sur MapReduce

L'utilisateur exécute des requêtes ad hoc sur le même sous-ensemble de données. Chaque requête effectuera les E / S disque sur le stockage stable, ce qui peut dominer le temps d'exécution de l'application.

L'illustration suivante explique le fonctionnement de l'infrastructure actuelle lors des requêtes interactives sur MapReduce.

Partage de données à l'aide de Spark RDD

Le partage des données est lent dans MapReduce en raison de replication, serialization, et disk IO. La plupart des applications Hadoop passent plus de 90% du temps à effectuer des opérations de lecture-écriture HDFS.

Reconnaissant ce problème, les chercheurs ont développé un cadre spécialisé appelé Apache Spark. L'idée clé de l'étincelle estRinsilient Distribué Datasets (RDD); il prend en charge le calcul de traitement en mémoire. Cela signifie qu'il stocke l'état de la mémoire en tant qu'objet dans les tâches et que l'objet peut être partagé entre ces tâches. Le partage de données en mémoire est 10 à 100 fois plus rapide que le réseau et le disque.

Essayons maintenant de découvrir comment les opérations itératives et interactives se déroulent dans Spark RDD.

Opérations itératives sur Spark RDD

L'illustration ci-dessous montre les opérations itératives sur Spark RDD. Il stockera les résultats intermédiaires dans une mémoire distribuée au lieu d'un stockage stable (disque) et rendra le système plus rapide.

Note - Si la mémoire distribuée (RAM) n'est pas suffisante pour stocker les résultats intermédiaires (état du JOB), elle stockera ces résultats sur le disque.

Opérations interactives sur Spark RDD

Cette illustration montre les opérations interactives sur Spark RDD. Si différentes requêtes sont exécutées à plusieurs reprises sur le même ensemble de données, ces données particulières peuvent être conservées en mémoire pour de meilleurs temps d'exécution.

Par défaut, chaque RDD transformé peut être recalculé chaque fois que vous exécutez une action dessus. Cependant, vous pouvez égalementpersistun RDD en mémoire, auquel cas Spark conservera les éléments sur le cluster pour un accès beaucoup plus rapide, la prochaine fois que vous l'interrogerez. Il existe également une prise en charge des RDD persistants sur le disque ou répliqués sur plusieurs nœuds.