Java 8 MapReduce pour l'informatique distribuée


Cela m'a rendu heureux quand j'ai entendu parler de parallelStream() en Java 8, qui traite sur plusieurs cœurs et rend finalement le résultat dans une seule JVM. Plus de lignes de code multithreading. Pour autant que je sache, cela n'est valable que pour une seule JVM.

Mais que faire si je veux distribuer le traitement sur différentes JVM sur un seul hôte ou même plusieurs hôtes? Java 8 inclut-il une abstraction pour le simplifier?

Dans un tutoriel à dreamsyssoft.com une liste de utilisateurs

private static List<User> 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 seul hôte.

Ma question est: 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:

average = (average1 + average2)  / 2

En utilisant l'architecture distribuée, il peut être résolu comme à distance. Java 8 a-t-il un moyen plus simple de résoudre le problème avec une abstraction pour cela?

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

Author: Palec, 2013-12-05

4 answers

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

Comme vous pouvez le voir, il n'y a pas de fonctionnalité dédiée à la standardisation du calcul distribué sur un cluster. Le plus proche est JEP 107, qui s'appuie sur le framework Fork/Join dans JDK 7 pour tirer parti des CPU multi-cœurs. Dans 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 est également prévu pour comporter JEP 103, qui sera également construit sur Java 7 Fork/Join pour trier les tableaux en parallèle. Pendant ce temps, puisque Fork/Join est clairement un gros problème, il évolue davantage avec JEP 155.

Il n'y a donc pas d'abstractions Java 8 de base pour le calcul distribué sur un cluster-uniquement sur plusieurs cœurs. Vous devrez concevoir votre propre solution pour le calcul distribué réel en utilisant les installations existantes.

Aussi décevant que cela puisse être, je voudrais souligner que il existe encore de merveilleuses abstractions tierces open-source sur Hadoop comme Cascalog et Apache Spark. Spark en particulier vous permet d'effectuer des opérations sur vos données de manière distribuée via l'abstraction RDD, ce qui donne l'impression que vos données sont juste dans un tableau de fantaisie.

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

 10
Author: Vidya, 2013-12-15 04:08:34

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

 0
Author: prmottajr, 2013-12-12 01:10:09

Ne vous attendez pas à une telle fonctionnalité dans le langage de base, car elle nécessite une sorte de serveur pour exécuter et gérer les différents processus. historiquement, je ne connais pas de solutions similaires qui faisaient partie de java core.

Il y a cependant des solutions qui sont similaires à ce que vous voulez. L'un d'eux est en cascade http://www.cascading.org / , qui est une infrastructure de style fonctionnel pour écrire des programmes de réduction de carte. signification - le code réel s'il est relativement léger (contrairement à la carte traditionnelle réduit les programmes) mais cela nécessite le maintien d'une infrastructure hadoop.

 0
Author: Ophir Yoktan, 2013-12-15 19:37:26

Je ne sais pas ce qui se passera avec Java 8 car il est trop tôt pour le dire, mais il y a quelques projets open source qui étendent la carte réduisent les capacités des langages de programmation fonctionnels antérieurs qui s'exécutent dans la JVM aux environnements informatiques distribués.

Récemment, j'ai pris un travail de réduction de carte Hadoop traditionnel mais non trivial (qui prend des données de performance brutes et les prépare pour le chargement dans un cube OLAP) et l'ai réécrit à la fois dans Clojure en cours d'exécution sur Cascalog et Scala en cours d'exécution sur la Spark. J'ai documenté mes conclusions dans un blog appelé Calcul Distribué et de la Programmation Fonctionnelle.

Ces projets open source sont matures et prêts pour les heures de grande écoute. Ils sont pris en charge par Cloudera et Hortonworks.

 0
Author: Glenn, 2014-11-05 08:06:40