Les trois mousquetaires de Spark Machine Learning: RDD, DataFrame et API Dataset

Les trois principaux outils permettant à Spark de traiter efficacement les données à grande échelle sont RDD, DataFrame et l'API Dataset. Bien que chaque API ait ses propres avantages, le nouveau changement de paradigme prend en charge Dataset en tant qu'API de données unifiée pour répondre à toutes les exigences de traitement des données dans une seule interface.

La nouvelle API de jeu de données Spark 2.0 est une collection d'objets de domaine de type sécurisé qui peut être convertie en parallèle à l'aide d'opérations fonctionnelles ou d'opérations relationnelles (similaires au filtre, à la carte et au flatMap de RDD (), etc.). Pour des raisons de compatibilité descendante, Dataset a une vue appelée DataFrame, qui est une collection non typée de lignes. Dans ce chapitre, nous présenterons 3 ensembles d'API. La figure 3-1 résume les avantages et les inconvénients des composants clés de Spark pour le traitement des données.

 

Figure 3-1

En raison de l'expansion des algorithmes ou pour des raisons historiques, les développeurs avancés de machine learning doivent comprendre et pouvoir utiliser les 3 API sans aucun problème. Bien que nous recommandons à chaque développeur de migrer vers l'API Dataset avancée, vous devez toujours savoir comment utiliser la programmation RDD pour le système principal Spark. Par exemple, les banques d'investissement et les hedge funds lisent souvent des journaux de premier plan tels que l'apprentissage automatique, la planification mathématique, la finance, les statistiques ou l'intelligence artificielle, puis écrivent du code dans des API de bas niveau pour obtenir un avantage concurrentiel.

3.1.1 RDD - où tout commence

L'API RDD est une boîte à outils clé que les développeurs Spark doivent utiliser. Elle fournit également un contrôle de bas niveau des données et un paradigme de programmation fonctionnel. La puissance du RDD rend également son utilisation difficile pour de nombreux nouveaux programmeurs. Bien que l'API RDD et les techniques d'optimisation manuelle soient relativement faciles à comprendre, l'écriture de code de haute qualité nécessite toujours une pratique à long terme.

Lorsque des fichiers de données, des blocs ou des structures de données sont convertis en RDD, les données sont divisées en plusieurs unités plus petites appelées «partitions» (similaires aux divisions dans Hadoop) et distribuées sur un grand nombre de nœuds, de sorte qu'elles puissent être parallélisées en même temps en fonctionnement. Pour les données à grande échelle, Spark fournit actuellement de nombreuses fonctions et les développeurs n'ont pas besoin de codage supplémentaire. Le framework gérera tous les détails et les développeurs peuvent se concentrer sur l'écriture de code sans se soucier des données.

Si vous voulez mieux comprendre l'ingéniosité et la beauté du RDD sous-jacent, vous devez consulter les articles originaux de RDD, c'est la meilleure façon de maîtriser ce contenu.

Il existe de nombreux types RDD disponibles dans Spark pour simplifier la programmation. La figure 3-2 décrit une partie de la classification des RDD. Il est recommandé aux programmeurs Spark de connaître au moins les types de RDD existants, même les RDD moins connus tels que RandomRDD, VertexRDD, HadoopRDD, JdbcRDD et UnionRDD pour éviter des problèmes de codage inutiles.

 

Figure 3-2

3.1.2 DataFrame - l'évolution naturelle de l'API unificatrice et de SQL en utilisant une API de haut niveau

Depuis l'ère du laboratoire AMPlab de Berkeley, la communauté de développeurs Spark s'est engagée à fournir à la communauté des API de haut niveau faciles à utiliser. Lorsque Michael Armbrust a fourni l'optimiseur SparkSQL et Catalyst à la communauté, la prochaine évolution de l'API de données a commencé à se matérialiser. L'optimiseur utilise une interface SQL simple et facile à comprendre pour permettre à Spark de réaliser la visualisation des données. L'API DataFrame est une évolution naturelle qui utilise SparkSQL en organisant les données en colonnes (telles que des tables relationnelles).

L'API DataFrame utilise SQL pour le traitement des données et peut être utilisée par de nombreux data scientists et développeurs familiarisés avec DataFrame in R (data.frame) ou Python / Pandas (pandas.DataFrame).

3.1.3 Dataset - une API de données unifiée avancée

Dataset est une collection immuable d'objets, modélisés / mappés sur des modèles relationnels traditionnels. En tant que méthode préférée à l'avenir, il y a 4 attributs à distinguer. En particulier, nous avons trouvé l'API Dataset très attractive car son utilisation est similaire aux opérateurs de conversion couramment utilisés dans RDD (tels que filter (), map (), flatMap (), etc.). L'ensemble de données suivra un paradigme d'exécution paresseux similaire à RDD. L'un des meilleurs moyens d'unifier DataFrame et Dataset consiste à traiter DataFrame comme un alias pour Dataset [Row].

1. Sécurité de type fort

L'API unifiée de l'ensemble de données possède à la fois des fonctionnalités de sécurité au moment de la compilation (erreur de syntaxe) et d'exécution, qui non seulement fournissent une assistance aux développeurs d'apprentissage automatique pendant le développement, mais préviennent également les accidents lors de l'exécution. Les développeurs qui utilisent DataFrame ou RDD Lambda dans Scala ou Python comprendront et apprécieront mieux cette nouvelle contribution de la communauté Spark et de Databricks lorsqu'ils rencontrent des erreurs d'exécution inattendues (les données sont défectueuses).

2. Gestion de la mémoire Tungstène

Tungsten permet à Spark de réduire les performances matérielles à la limite (c'est-à-dire d'utiliser l'interface sun.misc.Unsafe). L'encodeur mappe les objets JVM à un format de table (voir Figure 3-3). Si vous utilisez l'API de jeu de données, Spark mappera les objets JVM au format binaire interne Tungsten hors tas, ce qui est plus efficace. Bien que les détails des composants internes de Tungsten sortent du cadre du manuel d'apprentissage automatique, des tests de référence montrent que l'utilisation de la gestion de la mémoire hors tas est plus efficace que les objets JVM. Il est à noter que le concept de gestion de la mémoire hors tas a toujours été inhérent à Apache Flink avant d'être utilisé dans Spark. De Spark 1.4, 1.5, 1.6 à l'actuel Spark 2.0, les développeurs de Spark ont ​​réalisé l'importance du projet Tungsten. Bien que nous soulignions que DataFrame sera pris en charge au moment de la rédaction et a été présenté en détail (la plupart des systèmes de production sont toujours des versions antérieures à Spark 2.0), nous vous encourageons à commencer à explorer et à réfléchir au paradigme de l'ensemble de données. La Figure 3-3 montre la feuille de route de l'évolution de RDD, DataFrame et Dataset avec le projet Tungsten.

3. Encodeur

L'encodeur est le cadre de la sérialisation et de la désérialisation (c'est-à-dire SerDe) dans Spark 2.0. L'encodeur peut traiter de manière transparente le mappage des objets JVM au format de table. L'encodeur peut obtenir les informations sous-jacentes et les modifier selon les besoins (niveau expert).

Contrairement à la sérialisation Java standard et à d'autres solutions de sérialisation (telles que Kryo), l'encodeur Spark n'utilise pas la réflexion d'exécution pour détecter les objets internes pour la sérialisation en temps réel. En revanche, le code du compilateur de Spark est généré lors de la compilation et compilé dans le bytecode de l'objet spécifié, ce qui accélère l'opération de sérialisation et de désérialisation de l'objet. Le mécanisme de réflexion d'exécution des objets internes (comme la recherche de champs et de formats) entraînera une surcharge supplémentaire. Ce mécanisme n'existe pas dans Spark 2.0. Mais si nécessaire, Kryo, la sérialisation Java standard ou toute autre technologie de sérialisation peut toujours être utilisée comme option de configuration (exemples extrêmes et compatibilité descendante).

 

Figure 3-3

Les encodeurs pour les types de données standard et les objets (composés de types de données standard) sont actuellement disponibles dans Tungsten. En utilisant un benchmark de programme rapide et informel, par rapport aux encodeurs, l'utilisation du mécanisme de sérialisation de Kryo pour sérialiser des objets dans les deux sens (une pratique courante des développeurs Hadoop MapReduce) a une amélioration de l'efficacité de 4 à 8 fois. Lorsque j'ai examiné plus en détail le code source, j'ai trouvé que l'encodeur utilise en fait la génération de code d'exécution (au niveau du bytecode) pour emballer et décompresser les objets. Par souci d'exhaustivité, il vous suffit de savoir que la taille des objets générés par l'encodeur Spark semble être plus petite, mais plus de détails et d'explications sur les raisons dépassent le cadre de ce livre.

L'encodeur [T] est un composant interne de l'ensemble de données [T], qui n'est qu'un mode d'enregistrement. Si nécessaire, vous pouvez personnaliser l'encodeur à l'aide de tuples de données de base (tels que Long, Double et Int). Avant de commencer à personnaliser l'encodeur (comme le stockage d'objets personnalisés dans le jeu de données [T]), assurez-vous d'avoir vérifié les fichiers Encoders.scala et SQLImplicits.scala dans le répertoire de code source Spark. Dans le plan et l'orientation stratégique de Spark, des API publiques seront fournies dans les futures versions.

4. Optimiseur de catalyseur convivial

L'utilisation de Catalyst peut convertir les actions d'API en plans de requête logiques représentés par catalogue (fonctions définies par l'utilisateur) et les plans de requête logiques en plans physiques. Cette méthode est plus efficace que l'utilisation du mode d'origine (même si groupBy () est placé avant filter (), Catalyst peut être assez intelligent pour permuter les deux premières fonctions). Pour une explication plus claire, veuillez vous référer à la Figure 3-4.

 

Figure 3-4

Pour les utilisateurs qui utilisent Spark 2.0 ou des versions antérieures, veuillez noter les points suivants.

  • SparkSession est désormais le point d'entrée unique du système, SQLContext et HiveContext ont été remplacés par SparkSession.
  • Pour les utilisateurs Java, assurez-vous de remplacer DataFrame par Dataset <Row>.
  • Utilisez la nouvelle interface de catalogue via SparkSession pour exécuter cacheTable (), dropTempView (), createExternalTable (), ListTable (), etc.
  • Pour les API DataFrame et Dataset: unionALL () a été abandonné et union () doit être utilisé maintenant; explode () doit être remplacé par functions.explode () et select () ou flatMap (); registerTempTable a été déconseillé et remplacé par createOrReplaceTempView ().

Cet article est extrait de "Spark machine learning combat"

Fournit une solution complète pour les API d'apprentissage automatique Apache et Spark, avec des étapes claires et des explications détaillées, aidant les lecteurs à apprendre des algorithmes d'apprentissage automatique pratiques et à utiliser Spark pour s'entraîner rapidement

Ce livre fournit une solution complète à l'API de machine learning Apache Spark. Il présente non seulement les connaissances de base nécessaires pour effectuer des tâches de machine learning avec Spark, mais implique également des compétences avancées en machine learning Spark. Le livre comprend 13 chapitres. À partir de la configuration de l'environnement, il présente successivement des bibliothèques d'algèbre linéaire, des mécanismes de traitement des données, des stratégies communes pour la construction de systèmes d'apprentissage automatique, la régression et la classification, en utilisant Spark pour implémenter des moteurs de recommandation, un apprentissage non supervisé, des algorithmes de descente de gradient et des arbres de décision. Et l'utilisation de modèles intégrés, la réduction de la dimensionnalité des données, l'analyse de texte et Spark Steaming.

Ce livre est préparé pour les développeurs Scala qui maîtrisent la technologie d'apprentissage automatique et convient particulièrement aux lecteurs qui manquent d'expérience pratique de Spark. Ce livre suppose que le lecteur maîtrise les bases des algorithmes d'apprentissage automatique et possède une certaine expérience pratique de la mise en œuvre d'algorithmes d'apprentissage automatique à l'aide de Scala. Mais les lecteurs ne sont pas obligés de comprendre à l'avance la bibliothèque Spark ML et son écosystème.

Je suppose que tu aimes

Origine blog.csdn.net/epubit17/article/details/108383636
conseillé
Classement