최근에 Disco 0.1버전을 살펴보고 있다.
이유는 내가 관심을 가지고 있었던 분산처리를 하기 위한 프로젝트이고, 더군다나 Erlang으로 만들어져 있는 몇 안되는 오픈소스 프로젝트중에 하나이기 때문이다.
Disco를 가지고 몇몇 map/reduce 프로그램을 돌려봤는데 꽤 괜찮아 보인다. 물론 같은 기능을 하는 Hadoop이라는 걸출한 프로젝트가 있지만 Hadoop이 소잡는 칼이라면 Disco는 닭잡는 칼 정도라고 보면 될거 같다.
분석하면서 내가 여태 간과하다 시피 한 분산 프레임웍 구현 아키텍트를 살짝 엿볼 수 있어서 좋았던거 같다. 물론 처음에는 얼랭을 가지고 어떻게 구현했나 궁금했지만 차차 Python으로 구현된 부분 뿐만 아니라 자바스크립트, 그리고 lighttpd, JSON같은 것들이 어떻게 연동이 되고 있는지 찾아보는 좋은 기회가 되었던것 같다.
특히나 이곳에 쓰인 OTP 프레임웍은 백미중에 백미였다.
위에서 얼랭이 쓰인 부분이 disco master와 worker supervisor 정도이다. 더 세밀하게 설명하자면 Python의 Job오브젝트의 메서드와 1:1 매칭이 되는 event_server와 이를 연결해 주는 scgi_server, 그리고 disco_server, job_queue 서버정도로 볼수 있다. 물론 disco_worker가 있지만 이건 OTP supervisor의 관리를 받지 않는다.
OTP에서 supervisor와 worker의 관계는 OTP에서 가장 중요한 개념이다. Disco에서는 disco_main 모듈이 supervisor의 역할을 수행하고 나머지가 worker다. supervisor는 이런 worker들이 잘 작동하고 있는지 감시하고 에러가 나서 각각 프로세스가 파괴되었을때 적절한 명령을 수행하게 된다.
이런 OTP덕분에 얼랭을 사용해 2000라인 정도로 구현이 가능했던거 같다.
그리고 궁금했던 분산된 노드에 임시데이터를 뭘로 저장하는지에 대해서는 그냥 일정한 텍스트 포멧형식의 파일로 저장하는것 같다. 그리고 각 CPU에 worker를 어떻게 할당하는지도 대강 감을 잡았는데 이것도 그저 worker를 생성하는것을 CPU코어 숫자만큼으로 한정해 버리는 방법을 쓰고 있었다.
그리고 저장된 임시 파일을 merge하기 위해서 각 노드에 http daemon을 둬 http 프로토콜을 기반으로 파일에 접근하고 있었다.
Disco는 다양한 언어를 쓰고 있었는데, 이 언어들 중에 Javascript가 가장 어려워서 일단 front end단의 기능들은 무시하고 보고 있다.
Disco 0.1 분석하기 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.