Основные понятия распределенных вычислений Hazelcast

1

Я прочитал документацию Hazelcast (http://hazelcast.org/docs/latest/manual/html) в разделе "Распределенные вычисления", но я не понимаю некоторых основных идей. Я хочу использовать IExecutorService для отправки нескольких экземпляров Runnable или Callable для обоих потоков на локальном компьютере и других вычислительных узлов в кластере. У меня есть несколько вопросов:

  1. Нужно ли создавать новые экземпляры Hazelcast внутри Runnables/Callables?
  2. Каков эффект создания экземпляров внутри Runnables/Callables или их создания в основном потоке?
  3. Будет ли IExecutorService делать все, что нужно для отправки узлов и потоков?
  4. мне нужно беспокоиться о том, как новые экземпляры Hazelcast, которые я создаю, будут привязываться к потокам и узлам, или это произойдет автоматически?

Благодарю!

Теги:
multithreading
hazelcast
cluster-computing

2 ответа

2
Лучший ответ

Я разговаривал с людьми из Hazelcast и обнаружил, что у меня были некоторые фундаментальные недоразумения о том, как это работает. Я не понял, что вам нужно развернуть Hazelcast как сервис или демон, запустив "com.hazelcast.examples.StartServer" на вычислительных узлах. Так узнают узлы и взаимодействуют друг с другом. Для этой цели Hazelcast zip включает в себя некоторые сценарии пакетной и командной оболочки. Возможно, это очевидно для других, но я не нашел ничего в документации, в которой это явно сказано. Все, что я получил от документов, было то, что я бросаю банку в свой путь к классам, что дает мне доступ ко всем классам и методам. Я не знал, как я должен готовить вычислительные узлы, чтобы знать друг друга.

Мои первые два вопроса были получены из документации Hazelcast, где в первом примере раздела Distributed Computing они создают новый экземпляр Hazelcast внутри Callable. Я не уверен, почему они это делают, но это было для меня очень заблуждением. Я думал, это означало, что мне нужно было создать и связать новый экземпляр Hazelcast с каждым потоком.

Pveentjer выше ответов вопрос 3. Ответ в основном, да, если вы этого хотите.

Вопрос 4 связан только с моей путаницей в том, как работает Hazelcast. В принципе, между экземплярами Hazelcast и потоками не существует сопоставления "один-к-одному", как я думал. Каждый экземпляр Hazelcast уже многопоточен, поэтому нет необходимости создавать более одного экземпляра на одном узле для параллельной обработки (но вы можете сделать это по другим причинам (ограничения пространства кучи и т.д.). Конечно, вы определенно необходимо развернуть Hazelcast на всех вычислительных узлах (для которых я использую StartServer, упомянутый выше).

В двух словах я мог легко создать вычислительный кластер просто

1) отбросить банку Hazelcast в мой путь к классам на главном узле (или включить его в мой проект Eclipse)

2) развертывание Hazelcast на вычислительных узлах с использованием командного файла с вызовом StartServer

3) Создание Runnable и создание его Serializable (вместе со всеми его зависимостями)

4) создание экземпляра Hazelcast в моем методе Main() и получение IExecutorService для выполнения экземпляров Runnable

Единственным важным шагом является удостовериться, что при развертывании StartServer на вычислительных узлах вы помещаете в свой путь к кластеру Hazelcast и все банки, содержащие определения вашего Runnable и всех классов, от которых оно зависит.

Ниже приведен простой пример:

public class myRunnable implements Runnable, Serializable {

myTestClass mclass;

public myRunnable(){
    mclass = new myTestClass();
}


@Override
public void run(){

    try {
        System.out.println("Putting thread to sleep for 5 seconds");
        Thread.sleep(5000);
    }
    catch(Exception e){
        e.printStackTrace();
    }

    System.out.println("\nTesting MyRunnable on Thread: " + Thread.currentThread().getName());

}

}

Затем определите класс, от которого зависит Runnable:

public class myTestClass implements Serializable{

List<Double> list = new ArrayList<Double>(10);

public void myTestClass(){

    for (int i = 0; i < 10; i++)
        list.add( (double) i);
}

}

Создайте экземпляр Hazelcast и IExecutorService для выполнения

public class TestHazelCast {

public static void main(String[] args) {

    Config cfg = new Config();
    HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
    IExecutorService exec = instance.getExecutorService("exec");

    for (int i = 0 ; i < 7; i++){
        exec.execute(new myRunnable());
    }

}

}

Затем разверните Hazelcast на вычислительном узле вместе с соответствующими банками, используя что-то вроде:

java -server -Xms1G -Xmx1G -cp "../lib/hazelcast-3.2.2.jar;../lib/AllMyClasses.jar" com.hazelcast.examples.StartServer
0

- Нужно ли создавать новые экземпляры Hazelcast внутри Runnables/Callables?

Почему вы хотите это сделать? Если вам нужен доступ к HazelcastInstance, который запускает runnable/callable, пусть он реализует HazelcastInstanceAware, и вы получаете атаку HazelcastInstance.

- Каков эффект создания экземпляров внутри Runnables/Callables или их создания в основном потоке?

Не понимаю ваш вопрос. Пожалуйста, дополните.

- Будет ли IExecutorService делать все, что нужно для отправки узлов и потоков?

Зависит от вашего звонка. Существуют разные методы выполнения, такие как выполнение в этом члене, выполнение в подмножестве (потенциально всех) членов, выполнение на членском разделе или выполнение на любом члене.

Таким образом, вы можете оставить его полностью до HZ, или вы можете взять полный контроль. Все что тебе нужно.

- Мне нужно беспокоиться о том, как новые экземпляры Hazelcast, которые я создаю, будут привязываться к потокам и узлам, или это произойдет автоматически?

Я не знаю, что вы имеете в виду.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню