Java 8 MapReduce pour l’informatique dissortingbuée

Cela m’a fait plaisir lorsque j’ai entendu parler de parallelStream() dans Java 8, qui traite sur plusieurs cœurs et rend finalement le résultat au sein d’une seule JVM. Plus de lignes de code multithreading. Autant que je sache, cela n’est valable que pour une seule machine virtuelle Java.

Mais que se passe-t-il si je souhaite répartir le traitement sur différentes machines virtuelles sur un hôte unique ou même sur plusieurs hôtes? Java 8 inclut-il une abstraction pour la simplifier?

Dans un tutoriel sur dreamsyssoft.com, une liste d’utilisateurs

 private static List users = Arrays.asList( new User(1, "Steve", "Vai", 40), new User(4, "Joe", "Smith", 32), new User(3, "Steve", "Johnson", 57), new User(9, "Mike", "Stevens", 18), new User(10, "George", "Armstrong", 24), new User(2, "Jim", "Smith", 40), new User(8, "Chuck", "Schneider", 34), new User(5, "Jorje", "Gonzales", 22), new User(6, "Jane", "Michaels", 47), new User(7, "Kim", "Berlie", 60) ); 

est traité pour obtenir leur âge moyen comme ceci:

 double average = users.parallelStream().map(u -> u.age).average().getAsDouble(); 

Dans ce cas, il est traité sur un hôte unique.

Ma question est la suivante : peut-il être traité en utilisant plusieurs hôtes?

Par exemple, Host1 traite la liste ci-dessous et renvoie average1 pour cinq utilisateurs:

 new User(1, "Steve", "Vai", 40), new User(4, "Joe", "Smith", 32), new User(3, "Steve", "Johnson", 57), new User(9, "Mike", "Stevens", 18), new User(10, "George", "Armstrong", 24), 

De même, Host2 traite la liste ci-dessous et renvoie average2 pour les cinq utilisateurs restants:

 new User(2, "Jim", "Smith", 40), new User(8, "Chuck", "Schneider", 34), new User(5, "Jorje", "Gonzales", 22), new User(6, "Jane", "Michaels", 47), new User(7, "Kim", "Berlie", 60) 

Enfin, Host3 calcule le résultat final comme Host3 :

 average = (average1 + average2) / 2 

En utilisant une architecture dissortingbuée, il peut être résolu comme une communication à distance. Java 8 propose-t-il un moyen plus simple de résoudre le problème avec une abstraction?

Je sais que des frameworks tels que Hadoop, Akka et Promises le résolvent. Je parle de Java 8 pur. Puis-je obtenir de la documentation et des exemples pour parallelStream() pour plusieurs hôtes?

Voici la liste des fonctionnalités prévues pour Java 8 à partir de septembre 2013.

Comme vous pouvez le constater, aucune fonctionnalité n’est dédiée à la normalisation de l’informatique répartie sur un cluster. Le plus proche de vous est le PEC 107 , qui s’appuie sur le cadre Fork / Join de JDK 7 pour exploiter les processeurs multicœurs. En Java 8, vous pourrez utiliser des expressions lambda pour effectuer des opérations en bloc sur des collections en parallèle en divisant la tâche entre plusieurs processeurs.

Java 8 devrait également intégrer JEP 103 , qui s’appuiera également sur Java 7 Fork / Join pour sortinger les baies en parallèle. Pendant ce temps, Fork / Join étant clairement un gros problème, il évolue plus avant avec JEP 155 .

Il n’existe donc pas d’abstractions Java 8 de base pour l’informatique dissortingbuée sur un cluster, mais uniquement sur plusieurs cœurs. Vous devrez concevoir votre propre solution pour une véritable informatique dissortingbuée en utilisant les installations existantes.

Aussi décevant que cela puisse être, je tiens à souligner qu’il existe encore de magnifiques abstractions tierces à source ouverte sur Hadoop, telles que Cascalog et Apache Spark . Spark en particulier vous permet d’effectuer des opérations sur vos données de manière dissortingbuée via l’abstraction RDD , ce qui donne l’impression que vos données se trouvent juste dans un tableau de fantaisie.

Mais vous devrez attendre de telles choses dans le kernel Java.

Il n’y a rien dans les documentations / spécifications qui indique qu’il y aura une telle fonctionnalité. Mais si nous pensons un instant que RMI est la solution Java pour la dissortingbution et qu’elle est assez simple, vous pouvez l’utiliser comme base de dissortingbution et sur les nœuds, utiliser le parallélisme principal comme vous l’avez montré.

Ne vous attendez pas à une telle fonctionnalité dans le langage principal, car elle nécessite un type de serveur pour exécuter et gérer les différents processus. Historiquement, je ne connais pas de solutions similaires faisant partie de Java Core.

Il existe cependant des solutions similaires à celles que vous souhaitez. L’un d’eux est la cascade http://www.cascading.org/ , qui est une infrastructure de style fonctionnel permettant d’écrire des programmes de réduction de mappage. Cela signifie que le code actuel est relativement léger (contrairement aux programmes de réduction de carte traditionnels), mais qu’il nécessite la maintenance d’une infrastructure hadoop.

Je ne suis pas sûr de ce qui se passera avec Java 8 car il est trop tôt pour le dire, mais quelques projets Open Source étendent les capacités de réduction de la carte des langages de programmation fonctionnels antérieurs exécutés dans la JVM dans des environnements informatiques dissortingbués.

Récemment, j’ai pris une tâche de réduction de carte Hadoop, traditionnelle mais non sortingviale (qui prend des données de performance brutes et la prépare pour le chargement dans un cube OLAP), puis je l’ai réécrite dans Clojure sous Cascalog et Scala sous Spark. J’ai documenté mes découvertes dans un blog intitulé Calcul dissortingbué et functional programming .

Ces projets open source sont mûrs et prêts pour le prime time. Ils sont pris en charge par Cloudera et Hortonworks.