Hadoop의 기본 개념은 부분 최적화 보다는 전체 최적화에 맟추어져 있다보니 원하는 성능이 나오지 않으면 더 많은 서버로 클러스터를 구성하는 것이 정답일 것이다.

하지만 아무리 분산컴퓨팅을 한다고 해도 하나의 Node에서 실행되는 Task가 최적화가 되지 않으면 클러스터의 전체 성능이 저하되기 마련이다.

클러스터를 100대 구성했으면 100배의 속도 향상은 아니더라도 최소한 60 ~ 70배 정도의 성능 향상은 있어야 한다. 아니면 로컬에서 메모리를 최대한 활용할 수 있기 때문에 200 ~ 300배 정도의 성능 향상이 있어야 한다.
Hadoop의 core는 Map, Reduce는 Task를 각 Node에서 실행시키고 이를 관리하는 기본 기능을 가지고 있으면 Map,Reduce를 쉽게 구현하기 위한 다양한 부가 기능을 제공하고 있다. 대표적인 클래스가 Map의 입력 파일에서 한줄씩 읽어서 Map으로 전달하는 TextInputFormat이다.
하지만 이 클래스의 내부 구현을 보면 속도가 많이 떨어지게 구현되어 있다. 텍스트 파일에서 한 라인을 처리하기 위해 readLine() 메소드를 자체 구현하고 있는데 파일 또는 Socket으로부터 1 byte씩 읽어 처리하게 되어 있다.
이 부분을 BufferedReader나 BufferedInputStream으로 처리하여 1024/4096 단위로 처리하면 더 좋은 성능을 기대할 수 있다. 왜 이렇게 구현했는지는 메일링 리스트에 올려 물어봐야 겠지만... 다른 이유가 있어서 인가????

또 다른 이슈는 아주 빨리 실행되는 Task의 경우 각 Node의 CPU를 100% 활용하지 못한다는 점이다. 하나의 Task가 10초 이내에 종료될 경우 각 Node에서 동시에 실행되는 Task는 2개 정도이다. Task2개면 보통 2CPU, Dual Core에서는 CPU 활용이 거의 40% 수준밖에 안된다. CPU 상황을 봐서는 2개 정도 더 실행할 수 있을 것 같은데 Hadoop은 무조건 2개만 실행된다. 물론 10초 이상 실행되는 Task가 있는 경우 4 ~ 10개 사이에서 실행되고 CPU도 충분히 활용하고 있다.
각 Node에서 현재 수행되고 있는 Task의 수를 확인하는 것은 다음 URL로 확인할 수 있다.
http://JobTrackerIp:50030/machines.jsp
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/147

Comments List

  1. alping 2007/03/20 11:30 # M/D Reply Permalink

    Machine당 Task수 조절하는 옵션이 고정되어 있다는 것도 좀 아쉽습니다. (꼭 그 옵션만큼 100% 지키는 것도 아닌것 같지만...) 수행시키는 Job마다 성격이 다를텐데 말이죠.
    또, Hadoop에서 아쉬웠던 점이, 예를들어 3대로 구성되어 있고, Machine당 Task가 2개로 설정되어 있을 때, Reduce task 가 6개고 Map task가 많다면, 진행 중간에 3대 machine 모두 reduce를 두개씩 맡고, 한 machine만 reduce 두개, map 한개해서 혼자 map task를 다 처리해버리더군요........ 물론 다른 두대는 신나게 놀고있구요...
    task를 배정하는 것에 있어 좀 더 개선되었으면 하는 생각이 듭니다~

    1. 김형준 2007/03/20 12:19 # M/D Permalink

      Task 관리 부분에서는 많이 개선되야 하고 또 운영하면서 노하우를 쌓아야 하지 않을까 생각합니다.

Leave a comment
« Previous : 1 : ... 273 : 274 : 275 : 276 : 277 : 278 : 279 : 280 : 281 : ... 388 : Next »