Comment mettre à jour un RDD?
nous sommes en train d'élaborer le cadre Spark dans lequel nous transférons les données historiques dans des ensembles de données de RDD.
fondamentalement, RDD est immuable, lire seulement ensemble de données sur lesquelles nous faisons des opérations. Sur cette base, nous avons transféré Les données historiques dans RDD et nous effectuons des calculs comme le filtrage/cartographie, etc. sur ces RDDs.
il y a maintenant un cas d'utilisation où un sous-ensemble des données de la DRD est mis à jour et nous devons recalculer les valeurs.
HistoricalData est en forme de RDD. J'ai créer une autre RDD basée sur la portée de la requête et sauvegardez la référence de cette RDD dans un ScopeCollection
jusqu'à présent, j'ai été en mesure de penser au-dessous des approches -
Approach1: diffusion le changement:
- pour chaque requête de modification, mon serveur récupère le RDD spécifique au scope et lance un travail
- dans un emploi, Appliquer une phase map sur ce RDD -
2.A. pour chaque noeud de la DRD faites une recherche sur la diffusion et la création d'une nouvelle Valeur qui est maintenant mis à jour, créant ainsi un nouveau RDD
2.B. maintenant je fais tous les calculs à nouveau sur ce nouveau RDD à step2.A. comme la multiplication, la réduction etc
2.c. J'ai Enregistrer ce RDDs de référence de retour dans mon ScopeCollection
Bookshare 2: créer un EDR pour les mises à jour
- pour chaque requête de modification, mon serveur récupère le RDD spécifique au scope et lance un emploi
- à chaque RDD, faire une jointure avec le nouveau RDD ayant des changements
- maintenant je fais tous les calculs à nouveau sur ce nouveau RDD à l'étape 2 comme multiplication, réduction etc
approche 3:
j'avais pensé à créer des RDD en continu où je continuais à mettre à jour les mêmes RDD et à faire des recalculs. Mais d'après ce que j'ai compris, ça peut prendre des ruisseaux de Flume ou de Kafka. Alors que dans mon cas, les valeurs sont générées dans l'application elle est basée sur l'interaction des utilisateurs. Je ne vois donc aucun point d'intégration de la diffusion en continu de RDD dans mon contexte.
toute suggestion sur la meilleure approche ou toute autre approche convenant à ce scénario.
TIA!
2 réponses
l'usecase présentée ici correspond bien à Spark Streaming. Les deux autres options portent la question suivante: "Comment soumettre un nouveau calcul de la DRD?"
Spark Streaming offre un cadre pour soumettre en continu des travaux à Spark en se basant sur un flux de données entrantes et conserver ces données sous forme de RDD. Kafka et Flume ne sont que deux sources possibles.
vous pouvez utiliser la communication Socket avec le SocketInputDStream, lire des fichiers dans un répertoire utilisant FileInputDStream ou même en utilisant la file d'attente partagée avec le QueueInputDStream. Si aucune de ces options s'adapter à votre application, vous pouvez écrire votre propre InputDStream.
dans cette usecase, en utilisant Spark Streaming, vous lirez votre base RDD et utiliserez le dstream entrant pour transformer progressivement les données existantes et maintenir un État évolutif en mémoire. dstream.transform
vous permettra de combiner la base RDD avec les données collectées pendant un intervalle de fournée donné, alors que le updateStateByKey
l'opération pourrait vous aider à construire un État de mémoire adressé par des clés. Voir le documentation pour plus d'informations.
sans plus de détails sur l'application est difficile de monter au niveau du code sur ce qui est possible en utilisant la diffusion en continu par étincelles. Je vous suggère d'explorer cette voie et de poser de nouvelles questions sur des sujets précis.
je suggère de prendre un coup d'oeil à IndexedRDD mise en œuvre, qui fournit des RDD actualisables des paires de valeurs clés. Qui peut vous donner quelques idées.
l'idée est basée sur la connaissance de la clé et cela vous permet de zip votre chunk mis à jour de données avec les mêmes clés de RDD déjà créé. Pendant la mise à jour il est possible de filtrer la version précédente des données.
ayant des données historiques, je dirais que vous devez avoir une sorte d'identité d'un événement.
en ce qui concerne la diffusion et la consommation, il est possible d'utiliser le port TCP. De cette façon, le pilote peut ouvrir une étincelle de connexion TCP et s'attendre à y lire et y envoyer des mises à jour.