블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 



Apache Spark Cluster 구조

스팍의 기본 구조는 다음과 같다.
스팍 프로그램은 일반적으로 “Driver Program”이라고 하는데, 이 Driver Program 은 여러개의 병렬적인 작업으로 나뉘어져사 Spark의 Worker Node(서버)에 있는  Executor(프로세스)에서 실행된다.



1. SparkContext가 SparkClusterManager에 접속한다. 이 클러스터 메니져는 스팍 자체의 클러스터 메니져가 될 수 도 있고 Mesos,YARN 등이 될 수 있다. 이 클러스터 메니저를 통해서 가용한 Excutor 들을 할당 받는다
2. Excutor를 할당 받으면, 각각의 Executor들에게 수행할 코드를 보낸다.
3. 다음으로 각 Excutor 안에서 Task에서 로직을 수행한다.


  • Executor : Process
  • Task : A Unit of work that will sent to one executor

cf. Storm 과 개념이 헷갈릴 수 있는데, 
Storm 은 Node가 하드웨어 서버, Worker가 프로세스,Executor가 쓰레드
Spark 은 Worker Node가 하드웨어 서버, Executor가 프로세스 이다.  


Vertx 개념 잡기 (instance,thread,classloader,standard verticle,worker verticle)

 

l  Verticle :Vert.x의 하나의 애플리케이션 일종의 Vertx Servlet이라고 이해하면 빠름

Ÿ   기본 특성 : 독립된 Class Loader에서 독립된 Oject로 존재함 > Multi threading 문제가 발생하지 않음.

Ÿ   ELP (Event Loop) Verticle : 일반 Verticle. 항상 같은 Thread에서만 돈다. 같은 Verticle은 여러개의 Verticle instance로 존재할 수 있으며, 동시에 각각의 Thread에서 수행하는 것이 가능함.

Ÿ   Worker Verticle – ( Q에서 subscribe 받아서 뒤에서 비동기로 처리하는 Verticle. Q 대신 Hazelcast를 큐로 사용함. Long running 작업을 수행하는 용도로 사용한다.

자신의 Class Loader에 의해서 로딩된 Worker Object Worker Instance라고 한다.
 
하나의 Worker는 여러개의 Thread에서 수행될 수 있으나, 여러 쓰레드에서 수행되는 Worker가 코드는 같을 수 있으나, 실제 ObjectClassLoader는 다르기 때문에(테스트 통해서 확인함) Isolation이 되는 특성은 똑같음. 그래서 결과적으로, Verticle은 하나의 Thread에서만 동시 수행된다는 특성을 유지할 수 있음

Worker의 경우 Worker Verticle Instance Thread Pool에 의해서 수행되기 때문에, 동일한 같은 Worker Instance라도, 다른 Thread에서 수행될 수 있으나, 동시에 여러 쓰레드에서는 수행되지 않는다.

Worker Instance의 개수는 해당 Worker의 객체의 개수이며, 이는 Thread수와는 다르다. Thread Pool 10개이고, Worker Instance 5개 이면, 동시 수행되는 Worker Instance 5개가 된다..

l  Vertx instance : 하나의 Vertx Server로 하나의 JVM Process와 맵핑 된다고 보면됨. WebLogic instance (서버) 개념과 맵핑됨. 당연히 하나의 물리적인 서버에서 여러개의 Vertx instance를 실행할 수 있음

l  Verticle instance: 하나의 Verticle 객체. Verticle은 항상 자신만의 Thread를 가지고 있고 다른 Verticle과는 해당 Thread를 공유하지 않는다



쉽게 생각하면. 

Verticle은 Servlet

Verticle Instance는 같은 소스의 Servlet을 가지고 있는 war

정도로 생각하면 대충 개념이 맞음.


Vert.x 기본 개념 잡기


1. Verticle

- The package of coe that Vert.x executes

(Java,JavaScript,Python,Groovy 등 여러가지 언어로 작성될 수 있음)

- Verticle은 기본적으로 Non Blocking으로 작동함

- Blocking으로 작동하는 Verticle은 Worker Verticle을 사용함. 


2. Module

- Set of Verticla

- Application 은 1개 이상의 Module로 구성되고, Module은 1개 이상의 Verticle로 구성됨


Vertx의 실행단위는 Verticle 또는 Module



3. Vert.x instance

- Verticle은 instance 내에서 동작하는데, 하나의 instance 내에서는 여러개의 Verticle을 수행할 수 있다.

- instance 간에는 Event Bus를 이용해서 통신 한다.  마치 RPC 와 유사한 개념인데. Tuxedo의 BBL과 컨셉이 비슷하다. 구현체는  HazleCast를 이용한ㄷ.



Golden Rule

- 이벤트 루프 방식을 이용한다.

- 절대 Event Loop를 Blcok 하면 안된다.

그래서 오래 걸리는 작업 등은 Worker Verticle을 사용한다.



전체적인 개념을 보면 Event Loop에서 들어오는 메세지를 빨리빨리 처리하고, DB나 Q작업 등은 뒷단의 Worker Verticle등에서 비동기로 처리 하는 식을 사용한다.

Like standard verticles, worker verticles are never executed concurrently by more than one thread, but unlike standard verticles they can be executed by different threads at different times - whereas a standard verticle is always executed by the exact same thread.




Thread.sleep()

Object.wait()

CountDownLatch.await() or any other blocking operating from java.util.concurrent.

Spinning in a loop

Executing a long-lived computationally intensive operation - number crunching.

Calling a blocking third party library operation that might take some time to complete (e.g. executing a JDBC query)



Vertx내부의 Thread Model

- main thread (1개)

- vert.x-eventloop-thread (N개:Core 수에 따라 자동 생성됨)

- vert.x-worker-thread (Blocking call 수행)


※ 1개의 Verticle 인스턴스가 생성될 때 Event Loops에서 하나의 eventloop-thread 가 할당됨.


예) 

vertx-eventloop-thread-0

 Verticle-0

 Verticle-1

 Verticle-3

vertx-eventloop-thread-1

 Verticle-4

 Verticle-5

 Verticle-9


 Verticle 인스턴스당  쓰레드 한개 사용 (그 순간에만) 나머지는 큐잉됨.

Veticle이 100개라도 하나의 event-loop에서 수행 가능



※ 동기 Blocking call은 안된다. Single Thread이다. 

즉 Single Thread이기 때문에, 하나의 요청이 blocking이면 다른 Request를 처리못한다. 

Read tx나 long running tx가 어떻게 처리되는지 알아볼 필요 있음

--> 다른 Thread (worker)등에 bus로 call해서 넘기고, 끝나면 call-back으로 리턴한다.

예제 코드 " vertx.eventBus().send("mongodb-persistor", json, new ReplyHandler(req, data));"


http://www.smartjava.org/content/create-simpe-restful-service-vertx-20-rxjava-and-mongodb


동기형 read call에는 별로 안맞는듯. Worker verticlle을 이용해서 구현은 가능. 이 경우는 그냥 tomcat이 났겠다.

Q에 쓰는 async write  시나리오는 딱인듯.