Introduction à Apache Spark

Introduction à Apache Spark

1. introduction

Apache Spark is an open-source cluster-computing framework. Il fournit des API de développement élégantes pour Scala, Java, Python et R, qui permettent aux développeurs d’exécuter diverses charges de travail intensives en données sur diverses sources de données, notamment HDFS, Cassandra, HBase, S3, etc.

Historiquement, MapReduce de Hadoop s'est avéré inefficace pour certains travaux informatiques itératifs et interactifs, ce qui a finalement conduit au développement de Spark. With Spark, we can run logic up to two orders of magnitude faster than with Hadoop in memory, or one order of magnitude faster on disk.

2. Architecture Spark

Les applications Spark s'exécutent en tant qu'ensembles indépendants de processus sur un cluster, comme décrit dans lesdiagram ci-dessous:

image

 

Ces ensembles de processus sont coordonnés par l'objetSparkContext de votre programme principal (appelé programme pilote). SparkContext se connecte à plusieurs types de gestionnaires de cluster (soit le propre gestionnaire de cluster autonome de Spark, Mesos ou YARN), qui allouent des ressources entre les applications.

Une fois connecté, Spark acquiert les exécuteurs sur les nœuds du cluster, processus qui exécutent des calculs et stockent des données pour votre application.

Ensuite, il envoie le code de votre application (défini par des fichiers JAR ou Python passés àSparkContext) aux exécuteurs. Enfin,SparkContext sends tasks to the executors to run.

3. Composants principaux

Lesdiagram suivants donnent une image claire des différents composants de Spark:

image

 

3.1. Spark Core

Le composant Spark Core est responsable de toutes les fonctionnalités d'E / S de base, de la planification et de la surveillance des travaux sur les clusters d'étincelles, de la répartition des tâches, de la mise en réseau avec différents systèmes de stockage, de la récupération après incident et de la gestion efficace de la mémoire.

Contrairement à Hadoop, Spark évite que les données partagées soient stockées dans des magasins intermédiaires tels qu'Amazon S3 ou HDFS en utilisant une structure de données spéciale appelée RDD (Resilient Distributed Datasets).

Resilient Distributed Datasets are immutable, a partitioned collection of records that can be operated on – in parallel and allows – fault-tolerant ‘in-memory’ computations.

Les RDD prennent en charge deux types d'opérations:

  • Transformation - La transformation Spark RDD est une fonction qui produit un nouveau RDD à partir des RDD existants. The transformer takes RDD as input and produces one or more RDD as output. Les transformations sont de nature paresseuse, c’est-à-dire qu’elles sont exécutées lorsque nous appelons une action

  • Les transformations de l'action créent des RDD les uns des autres, mais lorsque nous voulons travailler avec l'ensemble de données réel, à ce stade, l'action est effectuée. Ainsi,Actions are Spark RDD operations that give non-RDD values. Les valeurs d'action sont stockées dans les pilotes ou dans le système de stockage externe

Une action est l’un des moyens d’envoyer des données de l’exécuteur au pilote.

Les exécuteurs sont des agents chargés d'exécuter une tâche. Alors que le pilote est un processus JVM qui coordonne les travailleurs et l'exécution de la tâche. Certaines des actions de Spark sont compter et collecter.

3.2. Spark SQL

Spark SQL est un module Spark pour le traitement de données structurées. Il est principalement utilisé pour exécuter des requêtes SQL. DataFrame constitue l'abstraction principale de Spark SQL. La collecte distribuée de données classées dans des colonnes nommées est connue sous le nom deDataFrame dans Spark.

Spark SQL prend en charge l'extraction de données provenant de différentes sources telles que Hive, Avro, Parquet, ORC, JSON et JDBC. Il utilise également le moteur Spark pour traiter des milliers de nœuds et des requêtes de plusieurs heures. Ce moteur offre une tolérance de panne maximale à mi-interrogation.

3.3. Spark Streaming

Spark Streaming est une extension de l'API Spark principale qui permet le traitement de flux évolutif, à haut débit et tolérant aux pannes de flux de données en direct. Les données peuvent être ingérées à partir d'un certain nombre de sources, telles que les sockets Kafka, Flume, Kinesis ou TCP.

Enfin, les données traitées peuvent être transférées vers des systèmes de fichiers, des bases de données et des tableaux de bord dynamiques.

3.4. Spark Mlib

MLlib est la bibliothèque de machine learning (ML) de Spark. Son objectif est de rendre l'apprentissage pratique pratique évolutif et facile. À un niveau élevé, il fournit des outils tels que:

  • ML Algorithms - Algorithmes d'apprentissage courants tels que la classification, la régression, la classification et le filtrage collaboratif

  • Fonctions - extraction, transformation, réduction de la dimensionnalité et sélection

  • Pipelines - outils pour la construction, l'évaluation et le réglage de pipelines ML

  • Persistance - algorithmes, modèles et pipelines de sauvegarde et de chargement

  • Utilitaires - algèbre linéaire, statistiques, traitement des données, etc.

3.5. Spark GraphX

GraphX is a component for graphs and graph-parallel computations. À un niveau élevé, GraphX ​​étend le Spark RDD en introduisant une nouvelle abstraction de Graph: un multigraphe dirigé avec des propriétés attachées à chaque sommet et arête.

Pour prendre en charge le calcul de graphes, GraphX ​​expose un ensemble d'opérateurs fondamentaux (par exemple,subgraph,joinVertices etaggregateMessages).

En outre, GraphX ​​inclut une collection croissante d'algorithmes de graphes et de générateurs pour simplifier les tâches d'analyse de graphes.

4. "Hello World" dans Spark

Maintenant que nous comprenons les composants de base, nous pouvons passer à un simple projet Spark basé sur Maven -for calculating word counts.

Nous allons montrer que Spark s’exécute en mode local où tous les composants s’exécutent localement sur la même machine que celle où il s’agit du nœud maître, des nœuds exécuteurs ou du gestionnaire de cluster autonome de Spark.

4.1. Maven Setup

Configurons un projet Java Maven avecSpark-related dependencies dans le fichierpom.xml:


    
        org.apache.spark
    spark-core_2.10
    1.6.0
    

4.2. Nombre de mots - Travail Spark

Écrivons maintenant la tâche Spark pour traiter un fichier contenant des phrases et afficher des mots distincts et leur nombre dans le fichier:

public static void main(String[] args) throws Exception {
    if (args.length < 1) {
        System.err.println("Usage: JavaWordCount ");
        System.exit(1);
    }
    SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");
    JavaSparkContext ctx = new JavaSparkContext(sparkConf);
    JavaRDD lines = ctx.textFile(args[0], 1);

    JavaRDD words
      = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
    JavaPairRDD ones
      = words.mapToPair(word -> new Tuple2<>(word, 1));
    JavaPairRDD counts
      = ones.reduceByKey((Integer i1, Integer i2) -> i1 + i2);

    List> output = counts.collect();
    for (Tuple2 tuple : output) {
        System.out.println(tuple._1() + ": " + tuple._2());
    }
    ctx.stop();
}

Notez que nous transmettons le chemin du fichier texte local en tant qu'argument à un travail Spark.

Un objetSparkContext est le point d'entrée principal de Spark et représente la connexion à un cluster Spark déjà en cours d'exécution. Il utilise l'objetSparkConf pour décrire la configuration de l'application. SparkContext est utilisé pour lire un fichier texte en mémoire en tant qu'objetJavaRDD.

Ensuite, nous transformons l'objet lignesJavaRDD en objets motsJavaRDD en utilisant la méthodeflatmap pour d'abord convertir chaque ligne en mots séparés par des espaces, puis aplatir la sortie de chaque traitement de ligne.

Nous appliquons à nouveau l'opération de transformationmapToPair qui mappe fondamentalement chaque occurrence du mot au tuple de mots et compte de 1.

Ensuite, nous appliquons l'opérationreduceByKey pour regrouper plusieurs occurrences de n'importe quel mot avec le compte 1 à un tuple de mots et additionner le compte.

Enfin, nous exécutons l'action RDD de collect pour obtenir les résultats finaux.

4.3. Exécution - Job Spark

Créons maintenant le projet à l'aide de Maven pour générer desapache-spark-1.0-SNAPSHOT.jar dans le dossier cible.

Ensuite, nous devons soumettre ce travail WordCount à Spark:

${spark-install-dir}/bin/spark-submit --class com.example.WordCount
  --master local ${WordCount-MavenProject}/target/apache-spark-1.0-SNAPSHOT.jar
  ${WordCount-MavenProject}/src/main/resources/spark_example.txt

Le répertoire d'installation de Spark et le répertoire du projet WordCount Maven doivent être mis à jour avant l'exécution de la commande ci-dessus.

Lors de la soumission, quelques étapes se passent dans les coulisses:

  1. À partir du code du pilote,SparkContext se connecte au gestionnaire de cluster (dans notre cas, le gestionnaire de cluster autonome est exécuté localement)

  2. Le gestionnaire de cluster alloue des ressources aux autres applications

  3. Spark acquiert des exécuteurs sur des nœuds du cluster. Ici, notre application de comptage de mots obtiendra ses propres processus d'exécuteur

  4. Le code de l'application (fichiers jar) est envoyé aux exécuteurs

  5. Les tâches sont envoyées par lesSparkContext aux exécuteurs.

Enfin, le résultat du travail d'étincelle est renvoyé au pilote et nous verrons le nombre de mots dans le fichier comme sortie:

Hello 1
from 2
Baledung 2
Keep 1
Learning 1
Spark 1
Bye 1

5. Conclusion

Dans cet article, nous avons abordé l'architecture et les différents composants d'Apache Spark. Nous avons également présenté un exemple de travail d'un travail Spark donnant le nombre de mots d'un fichier.

Comme toujours, le code source complet est disponibleover on GitHub.