Подтвердить что ты не робот

Java 8 MapReduce для распределенных вычислений

Это сделало меня счастливым, когда я услышал о parallelStream() в Java 8, который обрабатывает несколько ядер и, наконец, возвращает результат в одном JVM. Больше строк многопоточного кода. Насколько я понимаю, это справедливо только для одного JVM.

Но что, если я хочу распространять обработку через разные JVM на одном хосте или даже на нескольких хостах? Включает ли Java 8 любую абстракцию для ее упрощения?

В учебнике на dreamyssoft.com список пользователей

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)
);

обрабатывается, чтобы получить средний возраст:

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

В этом случае он обрабатывается на одном хосте.

Мой вопрос: Может ли он обрабатываться с использованием нескольких хостов?

например. Host1 обрабатывает список ниже и возвращает average1 для пяти пользователей:

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),

Аналогично Host2 обрабатывает список ниже и возвращает average2 для остальных пяти пользователей:

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)

Наконец Host3 вычисляет конечный результат, например:

average = (average1 + average2)  / 2

Используя распределенную архитектуру, он может быть решен как удаленный. Есть ли у Java 8 более простой способ решить проблему с некоторой абстракцией?

Я знаю такие фреймворки, как Hadoop, Akka и Promises. Я говорю о чистой Java 8. Могу ли я получить какую-либо документацию и примеры для parallelStream() для нескольких хостов?

4b9b3361

Ответ 1

Ниже представлен список функций, запланированный для Java 8 по состоянию на сентябрь 2013 г.

Как вы можете видеть, нет функции, посвященной стандартизации распределенных вычислений по кластеру. Ближайший у вас есть JEP 107, который основывается на структуре Fork/Join в JDK 7 для использования многоядерных процессоров. В Java 8 вы сможете использовать лямбда-выражения для параллельного выполнения массовых операций над коллекциями, разделив задачу между несколькими процессорами.

В Java 8 также будет представлен JEP 103, который также будет построен на Java 7 Fork/Join для параллельной сортировки массивов. Между тем, поскольку Fork/Join явно имеет большое значение, он развивается далее с JEP 155.

Таким образом, нет явных абстракций Java 8 для распределенных вычислений по кластеру - только через несколько ядер. Вам необходимо будет разработать собственное решение для реальных распределенных вычислений с использованием существующих возможностей.

Как бы ни было разочаровывающе, я хотел бы отметить, что есть еще прекрасные абстракции сторонних разработчиков с открытым исходным кодом над Hadoop, например Cascalog и Apache Spark. Spark, в частности, позволяет выполнять операции с вашими данными распределенным способом через абстракцию RDD, что заставляет чувствовать, что ваши данные просто в причудливом массиве.

Но вам придется ждать таких вещей в основной Java.

Ответ 2

В документах/спецификациях нет ничего, что показывает, что такая функция будет. Но если мы подумаем, что RMI - это решение Java для распространения, и это довольно просто, вы можете использовать его в качестве базы для распространения, а на узлах использовать ядро ​​ parallelism, как вы показали.

Ответ 3

Не ожидайте такой функции на основном языке, поскольку для запуска и управления различными процессами требуется какой-то сервер. исторически, я не знаю подобных решений, которые были частью ядра Java.

Однако существуют некоторые решения, похожие на то, что вы хотите. Один из них является каскадным http://www.cascading.org/, который является инфраструктурой функционального стиля для написания программ сокращения карты. значение - фактический код, если относительно легкий (в отличие от традиционных программ сокращения карты), но он требует поддержки инфраструктуры хаопов.

Ответ 4

Я не уверен, что произойдет с Java 8, так как пока еще слишком рано говорить, но есть несколько проектов с открытым исходным кодом, которые расширяют возможности сокращения карт на более ранних языках функционального программирования, которые запускаются в JVM для распределенных вычислительных сред.

В последнее время я взял традиционную, но нетривиальную карту Hadoop, уменьшающую работу (которая берет необработанные данные о производительности и готовит ее для загрузки в куб OLAP) и переписала ее как в Clojure, запущенной на Cascalog, так и в Scala, запущенной на Спарк. Я задокументировал свои результаты в блоге под названием "Распределенные вычисления и функциональное программирование" .

Эти проекты с открытым исходным кодом являются зрелыми и готовы к прайм-тайму. Они поддерживаются как Cloudera, так и Hortonworks.