하둡(hadoop) 의 옛버젼이 필요할 때가 있습니다. 예를 들면 최근 하둡(hadoop) 은 2.6.0 버젼대로 올렸지만 스파크(Spark) 는 1.2.0 버젼이 최신인데 하둡(hadoop)은 2.4.1 버젼과 맞춰줘야 하는 문제가 있습니다.

따라서 옛날 버젼의 하둡(hadoop)을 원하신다면 아래의 링크에 가서 원하는 버젼을 고르시면 됩니다.

http://archive.apache.org/dist/hadoop/core/

매번 버젼이 바뀔때 마다 쓰는 것이 지겨워서 한동안 안쓰고 있었는데 예전에 설치하던 시절하고 너무 많이 바껴서 정리를 할 필요가 있겠더군요.

http://rocksea.tistory.com/282

위의 링크는 제자가 열심히 정리한 버젼입니다. 이번 포스트는 저 포스트에서 부족한 부분을 채우는 식으로 정리할려고 합니다.

1 준비 사항

  • HOST OS: OSX Yosemite
  • 가상 컴퓨터 소프트웨어: VMWare 7.0 (아니면 Virtual Box)
  • Linux Ubuntu 14.04 LTS (Server Version)

1.1 버추얼 박스(Virtual Box)

굳이 버추얼 박스가 아니라도 괜찮습니다. VMWare 나 Parallel 도 괜찮습니다. 버추얼 박스는 공짜기 때문에 제목으로 달아논 것이고 저는 실제로 VMWare Fusion 을 썼습니다.

  • Guest OS 를 우분투로 세개 설치해줍니다. 저는 14.04 LTS 를 이용했습니다. 그리고 세개를 다 깔아주면 불편하기 때문에 한개를 깔고 기본적인 설정을 해주고 그 Guest OS 파일을 복사해주고 Mac Address 를 바꿔주는 식으로 설치해줬습니다.

1.2 네트워크를 고정 아이피로 설정해주기

고정 아이피로 만들면 이후에 세팅에서 엄청나게 편해집니다.

m/s hostname id
master cloud0 cloud
slave cloud1 cloud
slave cloud2 cloud


위와 같은 형태로 서버들을 구성할 예정입니다. 따라서 다음 부분은 각각의 Guest OS 에 전부 적용해 주어야 합니다.

1.2.1 DHCP 로 받아오는 부분을 static 으로 변경해서 파일을 변경해준다. /etc/network/inteface 를 열어서 다음 부분을 바꾸어 준다.

auto etho0
iface eth0 inet dhcp

이 부분을 커멘트 처리해주고 ('#' 을 맨 앞 라인에 써준다)

auto eth0
iface eth0 inet static 
address 172.16.242.100
netmask 255.255.255.0
gateway 172.16.242.2

와 같은 식으로 적어준다. dhcp 가 static 으로 바뀌고 address , netmask , gateway 를 상황에 맞게 써주는 것을 잊지 않는다. 위의 것은 어디까지 나의 경우에 예에 해당하는 것입니다.

1.2.2 /etc/resolvconf/resolv.conf.d/base 의 수정

예전에는 /etc/resolv.conf 를 수정했으나 이 파일이 이제 서버가 리스타트 될 때마다 리셋이 된다. /etc/resolvconf/resolv.conf.d/base 를 열어서

nameserver 8.8.8.8

를 추가해주고

$ sudo resolvconf -u

로 새로 만들어 주면 된다. 이 작업은 cloud0 , cloud1, cloud2 각각의 상황에 맞게 작성해줘야 합니다.

그리고 /etc/hosts 파일에

172.16.242.100 cloud0
172.16.242.101 cloud1
172.16.242.102 cloud2

와 같이 추가해 줍니다. 역시나 각각의 cloud0, cloud1, cloud2 에서 작업해줘야 합니다. 주어진 ip 는 제 경우입니다.

1.3 password 없이 각각의 서버에 접속할 수 있게 만들기

master 에서 slave 들에만 접속할 수 있게 만들면 됩니다. 즉 cloud0 -> cloud1 , cloud2 로 연결되어야 하니 cloud0 에서 다음과 같은 작업을 해 줍니다.

$ ssh-kegen -t rsa 

$ ssh cloud@cloud1 mkdir -p .ssh
$ ssh cloud@cloud2 mkdir -p .ssh

$ cat ~/.ssh/id_rsa.pub | ssh cloud@cloud1 'cat >> ~/.ssh/authorized_keys'
$ cat ~/.ssh/id_rsa.pub | ssh cloud@cloud2 'cat >> ~/.ssh/authorized_keys'

1.4 add-apt-repository 을 사용할 수 있게 만들어 주기

우분투(Ubuntu) 를 쓰면서 한번도 add-apt-repository 가 동작 안하는 것을 상상해 본적이 없어서 당황스러웠습니다. 우분투 server 로 설치하면 add-apt-repository 를 사용하기 위해서 필요한 패키지가 있습니다.

$ sudo apt-get install software-properties-common

이것을 설치해 줘야 합니다.

1.5 Java 설치

Java 의 버젼은 상관 없다고들 합니다. 그런데 계속해서 테스트 했던 버젼이 oracle java 이기 때문에 그것을 설치하기로 합니다. 이래저래 귀찮으니까 apt-get 을 이용해서 설치해 주기로 합니다. 뭐니 뭐니 해도 쉬운게 최고입지요.

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer

질문 나오는 것에 모두 YES 해서 설치해주면 됩니다. 참고로 이건 cloud0, cloud1, cloud2 에서 다 설치해줘야 합니다.

2 하둡 (Hadoop) 설치

Guest OS 세대에 전부 Ubuntu Server 를 설치해주고 네트워크 까지 설치했다면 본격적으로 설치를 시작할 시간입니다. master 로 설정할 cloud0 에서 작업을 시작합니다.

2.1 하둡 다운로드

http://ftp.daum.net/apache/hadoop/core/stable2/hadoop-2.6.0.tar.gz

위의 파일을 다운 로드 받아서 게스트 (Guest) 에 밀어 넣던지 아니면 게스트에서 (인터넷이 된다는 가정하에)

$ cd ~/
$ wget http://ftp.daum.net/apache/hadoop/core/stable2/hadoop-2.6.0.tar.gz

같은 방식으로 다운 받으시면 됩니다. 그리고 rsync 를 이용할 것이기 때문에 master 인 cloud0 에서 작업을 진행하면 됩니다. 최근의 spark 는 2.4.1 대의 하둡을 지원합니다. 그러나 어느날 갑자기 옛날 버젼의 하둡이 사라졌습니다. 현재의 stable2 는 바로 hadoop 2.6.0 버젼입니다. 나중에 spark 는 따로 컴파일을 해줘야 할 것입니다. 아니면 2.6.0 대로 맞춘 버젼이 나오길 기다립시다.

적당한 곳에 풀어줍니다.

$ cd ~/
$ tar xvzf hadoop-2.6.0.tar.gz

$HADOOP_HOME = ~/hadoop-2.6.0 이라고 가정합니다.

2.1.1 실제 데이타 저장 디렉토리 생성

실제로 데이타가 저장될 디렉토리를 만들어 줍니다. cloud0, cloud1, cloud2 에서 모두 만들어줘야 합니다.

$ sudo mkdir -p /data/hadoop/tmp $ sudo mkdir -p /data/hadoop/dfs/name $ sudo mkdir -p /data/hadoop/dfs/data $ sudo chown -R cloud:cloud /data/hadoop

/data/hadoop 의 owner 를 cloud 로 바꿔주는 것을 잊으면 안됩니다. 이 작업을 안해주면 나중에 hadoop 이 포맷하고 실제로 네임노드 , 데이터노드가 실행시 에러가 발생합니다.

2.1.2 $HADOOP_HOME/etc/hadoop/core-site.xml 수정

다음과 같이 수정해줍니다.

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://cloud0:9000</value>
  </property>
  <property>
   <name>hadoop.tmp.dir</name>
   <value>/data/hadoop/tmp</value>
  </property>
</configuration>

fs.defaultFS 는 하둡 파일시스템의 진입점을 보통 지정합니다. master 를 가르키는게 일반적입니다.

2.1.3 $HADOOP_HOME/etc/hadoop/hdfs-site.xml 수정

다음과 같이 수정합니다.

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/data/hadoop/dfs/name</value>
        <final>true</final>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/data/hadoop/dfs/data</value>
        <final>true</final>
    </property>

    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

dfs.replication 은 HDFS 내에서 몇개의 블록을 복사해서 유지할 것인가 하는 것입니다. 숫자가 커질수록 안정도는 올라가지만 속도는 저하됩니다. 우리는 그냥 2로 정합니다. dfs.namenode.name.dirdfs.datanode.data.dir 은 위에서 지정해 준 디렉토리를 지정해줍니다.

2.1.4 $HADOOP_HOME/etc/hadoop/mapred-site.xml 수정

아마 파일이 없으면 만들어 주시면 됩니다.

<configuration>
  <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
  </property>
  <property>
    <name>mapred.local.dir</name>
    <value>/data/hadoop/hdfs/mapred</value>
  </property>
  <property>
    <name>mapred.system.dir</name>
    <value>/data/hadoop/hdfs/mapred</value>
  </property>
</configuration>

mapreduce.framework.name 이 중요합니다. 최근 하둡은 맵리듀스 관리를 얀(YARN) 으로 합니다. 꼭 지정해 줘야 합니다.

2.1.5 $HADOOP_HOME/etc/hadoop/yarn-site.xml 수정

<configuration>
<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>cloud0:8025</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>cloud0:8030</value>
  </property>
  <property>
    <name>yarn.resourcemanager.address</name>
    <value>cloud0:8035</value>
  </property>
</configuration>

cloud0 로 쓰여진 부분은 각자 자신의 환경에 맞춰주면 됩니다.

2.1.6 $HADOOP_HOME/etc/hadoop/masters

마스터 (master) 서버가 어떤건지 지정해주는 파일입니다.

cloud0

cloud0 로 지정해주면 됩니다.

2.1.7 $HADOOP_HOME/etc/hadoop/slaves

datanode 로 사용할 서버들을 적어주면 됩니다.

cloud1
cloud2

전체 3대를 사용할 꺼기 때문에 master 를 제외한 나머지를 적어주면 됩니다.

2.1.8 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 수정

export JAVA_HOME=/usr/lib/jvm/java-7-oracle

와 같은 식으로 자바 위치만 정해주면 됩니다.

2.1.9 rsync 를 이용한 복사

cloud0 에서 다음과 같이 실행해 줍니다.

$ rsync -avz ~/hadoop-2.6.0 cloud@cloud1:/home/cloud/
$ rsync -avz ~/hadoop-2.6.0 cloud@cloud2:/home/cloud/

이러면 모든 노드(Node) 의 설정이 동일해집니다. 나중에 따로 생각해 내서 하기 힘들기 때문에 이 부분을 스크립트(script)로 만들어서 노드가 추가되면 스크립트에 추가된 노드분만 추가해 주는 식으로 관리해 주는것이 편할것 같습니다.

2.2 하둡(Hadoop) 실행

사용하기 전에 HDFS 를 포맷해줄 필요가 있습니다.

$ hadoop namenode -format

그리고 분산파일 시스템과 맵리듀스 시스템을 구동시켜주면 됩니다. $HADOOP_HOME 에서

$ sbin/start-dfs.sh
$ sbin/start-yarh.sh

를 실행시켜주면 됩니다. 제대로 동작하고 있는지 확인을 위해서는 cloud0 (즉 마스터) 에서

$ jps

를 입력해서 namenode (dfs 관련 서버) 와 resourcemanager (yarn 관련) 가 구동되어 있는지 확인하면 되고 cloud1 와 cloud2 에서도 마찬가지로

$ jps

를 입력해서 datanode(dfs 관련 서버) 와 nodemanager (yarn 관련)이 구동되어 있는지 확인하면 됩니다.


조금 광오한 제목을 썼지만 제자들과 같이 일하는 동료들에게 설명하기 위해서 만든 자료라 조금 거창하게 만들었습니다. 사진이나 그림들도 돌아다니는 것을 그냥 썼기에 저작권 이슈가 있을 수도 있습니다. 고발이 들어오면 바로 내리겠으니 양해해 주세요. 자료는 지금까지 제가 만들어 온 것과 마찬가지로 KeyNote 로 작성됐습니다. 원본이 필요하시면 메일 남겨주시면 보내드립니다. 



IT 쪽과 산업군과 심지어 경영쪽에서도 말이 많은 BigData 입니다. 최근의 핫한 이슈라서 어디서나 BigData를 말하고 있습니다. 저는 실제로 이 기술을 접한지는 오래됐습니다. 선배 (저에게 기술을 알려주신 사부님 되십니다.)의 회사에 놀러가서 최근에 나온 기술중에 BigData 란 것에 관심 있다고 하니 말  없이 책을 한권 주시더군요. 그러면서 하시는 말씀이 '벌써 적용해서 사용하고 있다' 라는 말이였습니다. 괴물 같으니라고.. 

그래서 어느정도 공부하고 실전에 적용해보면서 느낀 소감은 아직 멀었다는 것이였습니다. 이 기술을 준비한다는 업체는 절대 데이타가  Big 하게 많지가 않더군요. 그래서 잠시 다른일을 하느라 1년정도 손을 놨더니만 세상이 바꼈더군요. 제가 알던 시절하고 인프라도 많이 바뀌고 그 당시는 준비 단계의 프로젝트가 상위 프로젝트로 많이 올라왔더군요. 이번에 다른곳에 적용하기 위해서 POC 를 준비하면서 느끼게 된 것을 교육차원 으로 정리하는 것입니다. 

빅 데이타 입니다. 워드 클라우드 형태로 표현되고 있는데 사실은 저 표현되고 있는 말들의 대부분이 연관되는 것입니다. 일단은 Storage 라는 말과 Analytics 라는 글이 눈에 들어오는 군요. 뗄레야 뗄 수 없는 관계라고 볼 수 있습니다. 쉽게 생각해도 빅데이타라는 말은 일반적으로 많은 데이타를 처리하는 것이지.. 라고 막연하게들 생각하고 있습니다. 그러면 어떤 일을 하는 것일까요? 빅데이타란? 


이게 과연 완전히 새로운 기술이냐? 하는 것입니다. 인프라적으로 봐도 적용 형태로도 봐도 완전히 새로운 기술이라고 볼 수가 없습니다. 아니 세상에 완전히 새로운 기술이 있기는 한가? 라고 묻고 싶기도 합니다. 그렇다면 이 기술은 어떤 기술과 유사한 것인지? 


넵 바로 Business Intelligence 입니다. 바로 빅데이타 기술은 본인이 생각하기에 이 분야와 아주 유사합니다. 그렇다면 어떤점이 유사한 것인가? 라고 묻기 전에 과연 이 Business Intelligence 가 무엇인지 아주 아주 간단하게 살펴볼 필요가 있겠습니다. 


보통 Business Intelligenc 는 BI 라고 줄여서들 많이 이야기 합니다. BI 는 무엇을 지칭하는 것일까요?


한 BI 업체의 BI 가 할수 있는 일들 입니다. 여러가지를 할 수 있다고 자랑스럽게 이야기 하고 있습니다. 물론 저러한 일들을 할 수가 있겠죠. 나가는 돈은 별도로 하고 말이죠. 그렇다면 BI 가 하는 가장 본질적인 일이 무엇이냐? 이것만 이해하면 저런 것들은 그런 일의 연장이라고 볼 수가 있습니다. 


이게 바로 핵심이라고 볼 수가 있겠습니다. 뭐 속된말로 데이터 분석입니다. 이게 돈이 되느냐고 묻는 분들은 BI 업체의 존립 이유를 부정하시는 거라고 볼 수가 있습니다 ㅋㅋ. 게다가 생각보다 쉽지도 않습니다. 머리만 가지고 되는 일도 아닙니다. 저런 유의미한 데이터를 이끌어 내기 위해서 무지 많은 준비 작업을 거쳐야 하며 왜 그게 유의미한 데이타가 되는지 설명도 해야 합니다. 비싼 돈을 주기에 충분한 행위입니다. 


그러면 BigData 는 BI 네? 라고 이야기 할수도 있겠지만, 거기에 나아가서 만약 그렇다면 현존하는 BI 업체는 거의 다 BigData 로 진화를 했겠네? 라고 생각도 할 수 있습니다. 그러나 모든 업체가 그렇지는 않습니다. (진화하는 업체도 있습니다) 그러면 무엇이 다른 것인가? 


바로 이 3V에서 차이점이 존재합니다. 이것에 관한 자세한 내용은 예전에 제가 쓴 HBR 관련 포스트 (Big Data Management Revolution ) 에서 언급한 적이 있습니다. 


기존 데이타베이스로는 감당이 안되는 수준으로 용량들이 큽니다. 기가단위를 넘어선 페타단위의 데이타도 다룰 수 있습니다. 데이타가 커지면 지금의 기법으로는 당연히 호환이 안됩니다. 큰 데이타 단위에 맞춰서 동작하는 방식을 배워야 합니다. 


속도 입니다. 제 예전 글에서는 실시간에 근접해야 한다고 썼지만, 절대 실시간에 근접할 수가 없습니다. 많은 사람들의 예상과는 다르게 하둡베이스는 절대 시간이 실시간에 가깝지는 않습니다. 맵 리듀스에 올리고 잡(Job)을 분배하는 시간까지 포함한다면 실시간은 되지 않습니다. 그렇다면 무엇이 속도냐? 라고 질문을 던질 수가 있을 것입니다. 3박4일 걸리는 것이 8시간으로 줄수가 있고 , 8주 걸리는 것이 1주로 줄 수가 있습니다. 즉 단위가 큰 시간대를 줄이는 것이지 실시간에 근접하는 것은 아니라고 할 수가 있겠습니다. 


정말 다양한 데이터를 처리할 수가 있습니다. 예전과는 다르게 최근에 추가된 데이터 타입이라면 gps 를 들 수가있습니다. 다양한 자료들 다양한 데이타베이스들 다양한 D/W 들과 전부 연관되서 다루는 분야기 때문에 정말 다양성이 핵심입니다. 그리고 이미지, 동영상.. 등등 여러가지 데이터 타입들이 있습니다. 


그렇다면 왜 이리 BigData 는 화두가 되는 것인가? 하는 것입니다. 경영인들이 즐겨보는 HBR 이라는 잡지가 있습니다. 여기에는 경영잡지 답게 최신 IT 기술중 경영에 도움이 되는 기술은 종종 소개하고는 합니다. 대표적인 예로 지금 주제인 BigData 와 클라우드(Cloud) 가 있습니다. 


클라우드는 HBR 에 실리기까지 5년이 걸렸습니다. 사실 비용절감 과 서비스의 인구 밀도가 급격하게 변하는 경우 말고는 딱히 경영자들한테 매력적인 포인트는 아니였다고 저는 개인적으로 생각합니다. 그러나 빅데이터(BigData)는 마케팅에 활용이 될수도 있고 기업에서 새로운 방향의 통찰력(insight) 를 얻을 수가 있습니다. 그래서인지 이례적으로 3년이라는 시간안에 실릴 수 있었을 것이라고 봅니다. 


그래서 HBR 에서 나왔던 사례를 소개합니다.  시어스 홀딩스(Sears Holdings) 에서 했던 프로젝트입니다. 보시다 시피 자회사가 많은 시어스 홀딩스는 마트계열의 회사들을 여러개 소유한 회사입니다. 개별 개별 데이타가 얼마나 쌓이는지 상상하기도 힘들 정도입니다. 


그래서 시어스 홀딩스는 자사의 데이타들을 이용해서 고객 맞춤 프로모션을 진행하고 싶어합니다. 그런데 현행 시스템으로는 아무리 빨라도 8주가 걸린다고 보고가 올라왔다고 합니다. 그래서 왜 그리 오래 걸리나 조사를 하니 각각의 자회사들이 소유한 정말 방대한 데이타와 그 데이타가 저장되어 있는 데이타베이스 그리고 구성되어 있는 D/W 가 형태들이 다른게 문제였습니다. 그런데 이러한 맞춤 프로모션이 8주가 걸린다면 그것은 이미 현행화에 뒤진다는 것이 경영진의 생각이였고 이것을 적어도 1주정도로 줄여야 겠다고 결심했습니다. 


그래서 오라클에게 자문을 구했습니다. 이러 이러한 시스템을 구축해서 빠르게 고객 맞춤 프로모션을 진행하고 싶다. 오라클의 대답은 '가능하다' 였습니다. 다만 이 정도의 돈이 든다고 말을 했다고 합니다. 그 금액의 규모가 얼마인지는 전해지지 않지만 '천문학적인 돈이였다' 라던지 '그 돈이면 목적에 맞는 새로운 데이타베이스 시스템을 만들겠다' 라는 말로 보아 장난이 아닌 수준이였다는 것만 짐작할 수가 있습니다. 


그래서 시어스 홀딩스의 CTO 였던 필 쉘리(Phill Shelley) 는 2010년에 그 당시 거의 초창기 수준이던 하둡(Hadoop)을 이용해서 이 문제를 해결했습니다. 처음에는 이 일을 할 수 있는 사람을 찾을 수가 없어서 외주를 줬지만 그 다음에는 자사의 인력들이 배워서 충분히 해결할 수 있는 수준이 됐으며, 점점 더 분석 시간이 짧아지고 있다고 합니다. 게다가 오픈소스이기 때문에 시스템 구축비용은 거의 들지 않았으며 , 하둡은 로그(Log) 기반이기 때문에 데이타베이스의 포맷이 맞지 않는 것은 의미가 없었습니다. 모든 데이타를 로그로 변환해서 분석하면 그만이기 때문입니다. 


시어스 홀딩스 사례에서 잠깐 언급됐던 하둡(Hadoop)! 요즘 빅데이타 하면 빠지지 않고 등장하는 이름입니다. 그 이름에 대해서 언급하기 전에 구글이 빅데이타에 끼친 영향에 대해서 이야기를 하고 넘어가야 할 것입니다. 


바로 이 논문입니다. 구글에서 자신들이 쓰고 있는 검색 엔진의 인덱스를 저장하고 있는 시스템에 관한 논문을 발표했습니다. 2006년으로 알고 있는데요. 여기에는 정말 방대한 인덱스를 저장하기 위해서 어떻게 분산을 써서 내용을 나누고 그것을 어떻게 관리하는지 어떤 방식으로 구조화 시켜서 저장하는지에 관한 설명이 되어 있는 논문입니다. 여기에서 바로 모든 빅데이타(BigData) 플랫폼들이 시작됐습니다. 


구글의 논문을 보고 야후의 개발자가 생각해낸 개념이 바로 하둡입니다. 분산 저장방식에 관심을 가졌을 거라고 추측합니다. 그래서 야후에서 오픈소스 프로젝트로 시작하고 바로 아파치 재단으로 이동했습니다. 그리고 하둡은 2010년부터 꾸준히 빅데이타(BigData)를 논할 때 빠지지 않는 구성요소가 됐습니다. 그렇다면 대체 하둡의 핵심은 무엇일까? 


저는 그 핵심요소를 '분산'이라고 봅니다. 하둡은 핵심에 분산을 깔아놓구 있습니다. 데이타를 저장하는 방식에 분산을 적용한 것이 HDFS 고, 계산을 하는 방식에 분산을 적용한 것이 맵리듀스(Map Reduce) 입니다. 즉 다시 말하지만 '분산' 입니다. 핵심은 '분산' 


HDFS 는 하둡에서 데이타가 저장되는 핵심입니다. 자세한 부분에 관한 설명은 나중에 따로 할 예정이니 전체적인 레이아웃만 살펴보시면 됩니다. 한개의 네임노드(NameNode)와 그 네임노드가 다운됐을 때를 대비한 세컨드리 네임노드(Secondary Namenode) 가 존재하고 실제로 파일들이 일정 크기(Chunk)로 나뉘어서 저장되는 데이타노드(Datanode)가 다수개가 존재합니다. 이 데이타노드가 작게는 3개에서 많게는 수천개까지 늘어날 수가 있습니다. 어딘가에서 봤는데 (정확한 정보는 아닙니다) 페북은 4000여개의 노드를 사용하고 있다고 합니다. 


일반적인 파일시스템(FS:File Systems)에서 파일을 저장하는 방식과 너무 유사합니다. 파일이 저장되면 그 파일의 존재하는 OS 상의 위치와 실제로 하드디스크에 저장되는 물리적 위치로 나뉩니다. 그림에서 보이는 네임노드(Namenode) 가 OS 상의 위치에 해당한다고 보시면 편하고, 데이타노드(Datanode)에 쪼개서 저장되는 방식이 마치 하드디스크에서 물리적으로 데이타가 저장되는 모습에 해당한다고 보시면 됩니다. 안정성을 위해서 레플리케이션(Replication)을 둬서 물리적으로 2개 이상의 사본이 저장되서 비상상황 발생시 대응을 쉽게 할 수 있게 하지만 그 부분은 자세한 설명은 안하기로 하겠습니다. 


맵리듀스 입니다. 맵 리듀스는 분산 계산 플랫폼이라고 보시는게 가장 유력할 것입니다. HDFS 내에 존재하는 데이터를 맵-리듀스 어플리케이션을 만들어서 빠르게 계산하는 것이 그 목적입니다. 원래는 잡트래커(Job tracker) 와 태스크 트래커(Task Tracker) 였으나 YARN 에 들어오면서 그림과 같이 리소스 매니져 (Resource Manager)와 노드메니져(Nodemanager) 로 바꼈습니다.  


맵리듀스 프레임워크에 맞춰서 작성한 어플리케이션을 올리면 리소스 매니져가 몇개 노드에서 작업을 수행할지 나눠서 배포하고 노드매니져가 작업을 해서 그 결과가 출력되는 형식을 취합니다. 사실 더 자세하게 보자면 복잡하지만 핵심만을 설명한 것입니다. 결국 여기서도 알아야 할 것은 어플리케이션 = 잡 (Job) 을 '분산' 시켜서 처리한다는 것입니다.


그러면 빅데이타 계의 다른 이슈거리인 노에스큐엘(NoSQL) 입니다. SQL 과는 다르다는 정도로 받아들이면 될 것입니다. 일반적인 Row 기준적인 RDBMS 와는 다르게 대부분의 NoSQL 은 key-value 나 Column 베이스 입니다. 이런것의 차이는 추후에 설명하기로 하고요. 일반적인 RDBMS 와의 가장 큰 차이를 보이는 부분이 Relation 이 없기 때문에 NoRel (No Relation)으로 바꿔야 한다는 소리도 있습니다. 


대표적인 컨셉이자 제일 유명한 것인 하베(HBASE) 가 있습니다. 하둡의 서브 프로젝트에서 시작해서 지금은 당당하게 대표 프로젝트로 자리 잡았습니다. 


NoSQL 은 설명할때 제일 힘든 것이 그게 뭐냐라는 질문에 딱히 대답하기가 어렵다는 점입니다. 그래서 제가 제일 쉽게 설명하는 방법은 바로 거대한 구조화된 데이타 저장소 라는 개념입니다. HDFS 는 파일 시스템 개념이라서 밑바닥에 깔려있는 것이고 이것은 그 위에서 구조화된 데이타를 저장하는 저장소 개념입니다. 따라서 구글의 논문이자 구글에서 사용하고 있는 BigTable 에 가장 유사한 형태를 취하고 있습니다. 이 하베는 페이스북(FaceBook)의 메시징 서버를 구현하는데 사용되서 유명합니다. 페이스북이 투자하고 키워오던 카산드라(cassandra)를 대신해서 이용되었기 때문입니다. 

하베의 구조도 입니다. 역시 어디선가 가져왔습니다. 이 한장의 그림으로 정말 하베의 모든것이 설명되고 있다고 보시면 됩니다. 

하베는 분산의 마스터 노드에 해당하는 HMaster 와 분산의 슬레이브 노드에 해당하는 HRegionServer 로 나뉩니다. 이 마스터와 슬레이브 방식을 관리하는 것이 바로 주키퍼(ZooKeeper) 입니다. 그래서 사용자의 클라이언트는 주키퍼를 통해서 마스터(HMaster)에 접근해서 데이터를 추가(insert)하고 읽어오는 작업을 하면 그 작업의 내용을 마스터는 리젼서버(HRegionServer) 에 명령을 내려서 수행하는 방식입니다. 그리고 저장되는 내용은 실제로 Distributed File System 을 통해서 하둡(Hadoop) 에 저장됩니다. 하둡은 전통적으로 파일을 저장하는 방식대로 데이타노드(Datanode) 에 개별 개별의 조각으로 나누어서 저장합니다. 


하베에서 데이타를 저장하는 방식에 대한 설명입니다. 한개의 테이블이 있다면 그 안에 컬럼 패밀리가 다수가 존재하고 그 컬럼패밀리 '군'에 속하는 개별적인 컬럼들이 존재하는 형태 입니다. 상식적으로 RDBMS 방식에 익숙하다면 익숙하지 않은 방식이라고 보일 텐데요. 실제로 컬럼(Column) 방식이 어떤식으로 데이타가 저장되는지 보겠습니다. 


Row 방식과 Column 방식의 차이입니다. 여러값이 들어가지는 않고 각각의 값하고 Column 방식으로 정렬되어 있다는 느낌을 주지요? 거기다가 각각의 Column 과 매칭되는 id 값이 전부다 존재합니다. 이래서 NoSQL 은 보통 Key-Value 방식이라는 이야기를 합니다. 그림에 보다 시피 Key(id 값) 과 그것에 해당하는 각각의 값들이 존재합니다. 


여기까지가 대략적으로 빅데이타라고 말해지는 것들의 개략적인 설명입니다. 개략적인 설명만 듣고 잘난척은 가능하지만 실제 적용하고는 오만년 광년쯤 떨어진 이야기라는 것을 알 수가 있을 것입니다. 그러면 실제로 준비하는 것에 관한 이야기를 들어보기로 합니다. 정말 필요한 순서상으로 따라하기식 설치는 따로 매뉴얼로 작성할 예정입니다.


그럼 일단 하드웨어 준비사항입니다. 첫 항목은 최근에 유명한 라즈베리 파이로 설치해서 하둡을 해볼까 라는 소리를 들어서 입니다. 물론 설치는 가능합니다. 대신 제가 항상 주장하는 '설치를 해서 뭘 해볼껀데?' 라는 질문에 대한 대답하기가 힘듭니다. 물론 각각의 노드매니져나 데이타노드 구동 메모리를 256 메가나 128 메가로 낮추면 돌릴 수 있지 않을까 하는 분들도 계실지 모릅니다. (라즈베리 파이는 256메가나 512메가 메모리를 가지고 있습니다) CDH5 의 기본 설정을 데이타노드에 1기가 노드매니져에 1기가 입니다. 그래서 최소 2기가 이상의 메인메모리가 필요합니다. 2 코어가 필요하다는 이유도 어찌보면 당연합니다. 물리적 노드 한대에 데이타노드와 노드매니져가 함께 있으니 효율성을 극대화 하기 위해서 필요합니다. 

주키퍼(Zookeeper) 권장 사항은 홀수대입니다. 홀수인 이유는 노드중에 한대가 죽었을 때의 대처가 좋기 위해서라는데 (사실 그 이유는 자세히 살펴보지는 않았습니다) 시키는대로 하는 것이 좋겠죠? 

그리고 실제로 클러스터(Cluster)를 구현하기 위해서는 최소 복수개의 노드가 필요하니 (거기에 주키퍼 권장사항) 3대 정도가 필요합니다. 


리눅스가 하둡을 돌리는 최고의 OS 라는것은 이미 다 알려져 있는 내용입니다. CentOS 나 우분투(Ubuntu) 어떠한 것도 가능합니다. 그런데 저는 우분투를 추천합니다. 단 CDH5 를 설치할려고 하면 우분투 14.04 버젼은 주키퍼 설치에 실패하기 때문에 13.04 나 12.04를 추천합니다. 참고로 저는 14.04를 설치했기 때문에 주키퍼를 직접 설치해줬습니다. 자바는 1.7 버젼을 추천하더군요. 저는 혹시나 몰라서 Oracle 용 자바 (Java)를 설치해줬습니다. 찾아보면 우분투에서 apt-get 으로 자바를 설치하는 방법이 있으니 참고하셔서 설치하면 됩니다. 


하드웨어와 기본적인 OS가 준비가 됐다면 어떤 하둡 구현체를 쓸것인가? 하는 문제가 남아 있습니다. 


최근 빅데이타 컨설팅 업계의 삼대장이라고 하면 클라우데라 (Cloudera), 맵알(MapR), 호톤웍스(Hortonworks) 마지막 업체는 잘 모르니 차치하고라서도 , 각각은 많이 발전했으면서도 확연히 차이점이 존재합니다. 


클라우데라는 자신들이 생각하는 방식으로 하둡과 그에 딸려오는 제반 인프라를 설치하기 쉽게 만들어 뒀습니다. 각각을 전용 계정들도 만들게 하며 서비스 방식으로 띄울 수 있게 모든 것을 체계화 했습니다. 게다가 환상적으로 쉬운 (그렇지만 영어입니다) 매뉴얼을 제공해서 열심히 따라하면 손쉽게 (그나마) 거의 모든 빅데이타 인프라를 설치해 볼수가 있습니다. 게다가 아파치 라이센스기 때문에 상업용으로도 이용할 수가 있습니다. 다만 자신들의 입맛에 바꿔놓은 부분이 많기 때문에 클라우데라가 지원하지 않는 솔루션을 설치해 볼려고 하면 한방에 안 깔리는 경우가있습니다. (예를 들면 타조- Tajo ) 

우리나라에서 로그가 많이 나오기로 유명한 카카오에서 분석용 기반 플랫폼으로 사용한다고 합니다. 


제가 사용해본것은 클라우데라지만 MapR 에 관한 이야기는 많이 들었습니다. 하둡에서 시간이 걸리는 부분을  C/C++ 로 변경을 해서 속도 향상을 가지고 왔다고 합니다. JVM 의 한계를 넘어섰는지는 잘 모르겠습니다. 다만 인터페이스가 여전히 자바 기반이기 때문에 기존의 다른 하둡 기반 인프라와 궁합이 잘 맞는다고 합니다. 

그러나 이러한 최적화는 가장 시간이 걸리는 부분은 결국 잡을 나눠서 어떻게 할 것인지에 영향을 미칠 가능성이 매우 크기 때문에 속도향상은 어느정도 있겠지만 그 부분이 절대적이라고 볼 수는 없을 것 같습니다. 게다가 하둡이 어느정도 버젼이 안정화 된 이후에 C/C++ 작업이 들어가는지 (어떻게 보면 당연한 것이라 볼 수가 있을 것입니다) 버젼업이 생각보다 빠르지가 않다고 합니다. 

게다가 유료!! 라고 합니다. 자세한 스펙은 조사하지 않았으나 영업자료에 그리 써 있었다고 합니다. 머신 노드 1기당 800만원이라는 소리가 있으니 보통 작은 은행권에서는 보통 15-20대 가량을 쓰니 소프트웨어 가격만으로도 돈이 적당히 들어갈 것으로 보입니다. 


왜 호톤웍스가 없는지는 묻지 말기로 하고.. 어떤 방식을 추천할 것인가? 에 관해서는 지금 나와 있는 빅데이타 플랫폼을 다 이해하가면서 설치해보고 싶다면 당연히 각각의 컴포넌트를 아파치 재단에서 받아서 설치하는 것을 추천합니다. 지금 속도가 괜찮다고 평가되는 타조(Tajo)는 CDH 와 뭔가 안맞는지 설치가 안됩니다. - 가장 손쉽게 생각하자면 하이브(Hive)의 개량방식이라고 평가받는 솔루션이 타조 (Tajo)와 임팔라(Impala)가 있습니다. 둘다 빠른 동물을 형상화 했지요? 그런데 타조는 국내의 오픈소스 개발이 주력으로 개발됐습니다. 임팔라는 CDH 가 밀고 있습니다. SKT 빅데이터 팀에서 여러 오차를 겪고 나서 타조를 선택했다는 글을 본적이 있는데 그 논리대로라면 타조가 좋을꺼 같아서 설치할려고 했더니 CDH 는 임팔라를 민단 말이죠.. 그러니 타조를 지원할 일이 없는 것입니다 ㅎㅎ. 

그렇다고 CDH 가 나쁘다는 것은 절대 아닙니다. 귀찮은 설치과정을 쉽게 만든 것만으로도 CDH 는 쓸만합니다. 일일이 설치하는 것을 공부라고 여길 필요가 없는 분들! 설치하고 난 뒤에 데이타를 만지작 거리는 것이 진정한 빅 데이타다!! 라고 생각하시는 분들 (열렬하게 공감합니다) 은 CDH5 를 강력추천합니다. 


그렇다면 빅데이타라는 것을 써봤다고 말할려면 무엇을 설치해야 하는 것인가? 이것이 궁금할 수가 있습니다. 항상 남에게 해봤다고 말해볼 수 있을만큼만 하면 됩니다. 


이 세가지가 기본입니다. 사실 가장 왼쪽의 주키퍼(ZooKeeper)는 설치가 안되면 하둡도 설치가 안되는 것이니 필수요소이기도 합니다. <-- 이건 클라우데라 매뉴얼에 있는 내용이고, 실제로 소스를 직접 받아다 설치할 경우에는 주키퍼와 하둡은 상관 관계가 없다고 판명되었습니다. 그리고 하둡이 설치가 되지 않으면 처음이자 끝도 없는 것이지요. 그리고 하이브 입니다. 하이브는 사실 초창기때에는 알기도 쉽지 않았습니다. 그 당시는 피그(Pig)라는 것만 있었습니다. 게다가 왠만하면 전부 맵리듀스 프로그램을 직접 짜서 분석을 하는 것이 일반적이였습니다. 그러다가 일일이 할 때마다 프로그램을 짜는 것이 너무 불편하다는 이야기가 나와서 등장한 것이 하이브(Hive) 입니다. 하이브는 쉽게 말하면 sql 로 분석 구문을 만들면 자동으로 그 내용을 맵-리듀스로 변경해서 하둡의 맵-리듀스 프레임워크에 태워서 분석을 가능하게 해주는 괜찮은 솔루션입니다. 귀찮은 프로그램을 일일이 짤 필요 없이 탑재된 로그 데이타를 분석할 때 강력함을 발휘합니다. 


자 그러면 실제 사례를 보기로 합니다. 


그러면 왜 하이브(Hive)를 쓰는 것인지는 저번에 설명했지만 다시 설명하자면 매번 반복되는 불편함을 제거하기 위해서 시작한 것으로 알고 있습니다. MySQL 의 문법과 기본적인 것은 호환이 되지만 100% 는 아닙니다. 예를 들면 자료형 자체가 많지 않습니다. 자주쓰는것은 INT 와 STRING 입니다. 한가지 여러가지 쿼리를 돌리다가 알아낸 사실입니다. 하둡 관련 플랫폼의 특징은 결국 자바 환경이라는 것인데, 자바의 약점을 그대로 가지고 있습니다. 바로 정해진 힙의 크기를 넘어가면 속된말로 '터진다'는 점입니다. 예를 들면 Group by 키워드를 사용하면 Map 의 영역입니다. 그래서 Map 을 돌리다가 멈추면서 힙(heap)이 터집니다. (자주 보던 그 키워드가 나옵니다. 터졌다고 ㅎㅎ) 그리고 Join 은 reduce 의 영역이라  reduce 에서 힙(heap)이 터집니다. (무식하게 10억건 이상되는 데이타를selfJoin 걸었기 때문이죠 ㅎㅎ) 게다가 이게 가능해야 분석가가 한발을 거칠 수가 있습니다. 분석할때마다 코딩하셔야 합니다. 라고 하면 분석 전문으로 하시는 분중에서 가능한 분이 몇명이나 있겠습니까? 


실제로 POC 를 준비했던 사례를 설명하겠습니다. 어떤 회사인지 말을 못합니다. (뭐 당연하겠죠? ㅎㅎ) 준비 과정에서 CDH5 버젼으로 각각 설치했습니다. 우분투( Ubuntu 14.04 ) 버젼으로 설치했기 때문에 주키퍼 (ZooKeeper)설치에 문제가 있었지만 직접 설치하는 것으로 해결하고 나머지 부분은 CDH 부분이 무난하게 설치 됐습니다. (하둡, 하이브, 하베 세개 다 설치했지만 하베는 사용안해서 지웠습니다) 물론 하드웨어는 제각각의 스펙을 가지고 있었고 그중 제일 괜찮은 서버에 네임노드(Namenode)를 설치해줬습니다. 증권사에서 준 데이타는 10개월치 13억건의 데이타 총 용량 300기가에 해당했습니다. (진짜 BigData 였습니다 ㅋㅋㅋ) 내준 숙제는 과거 데이타 중에 부정한 거래가 일어난 것을 잡는 케이스 였습니다. 샘플 600건을 POC 전날 제공받고 , 당일에는 300기가의 데이타를 제공해서 주어진 5시간 안에 전 데이타를 올리고 그중에서 분석해서 부정사례를 발견하는 것이 숙제였습니다. 이것을 제대로 했는지의 여부는 비밀입니다 ㅋㅋ 


데이타가 담겨 있는 USB 하드는 exFat 형태로 제공됩니다. 이걸 착각해서 ext 타입(ext3, ext4)으로 착각해서 드라이버 설치하는데만 한시간 걸렸습니다. 인터넷이 되면 한줄로 받는 명령을 인터넷이 안되는 환경이라 노트북에 프락시를 설치하고 핸드폰으로 테더링 걸고.. 난리도 아니였습니다. ㅜ.ㅜ 이게 첫번째 실수였습니다. 

그리고 데이터 전송을 한달별로 그리고 일자별로 정리가 되어 있는 자료여서 이것을 멀티프로세싱을 이용해서 한꺼번에 올렸습니다. 무지하게 걸리더군요.. 한달에 40분가량씩? 답이 도저히 안나오는 시간대라 이거 정말 업로드 가능한건가? 고민하다가 개별 개별로 올리기 시작했습니다. 1일치 올라가는 시간이 3-4초 늦어봐야 10초가 걸리더군요.. 이건 정말 무식해서 발생한 일이였습니다. 어차피 하드에 쓰는 속도 차이가 있는 것인데 멀티 프로세싱으로 동작을 시키면 물리적 하드에 쓰기 위해서 헤드가 왔다리 갔다리 하면서 시간이 오히려 더 걸리는 것이였습니다. 그래서 멀티프로세싱이 만능이 아니라는 옛말을 이제야 실감하게 되더군요. 전부 다 올려서 마트를 구성하는 건 10분정도 걸리고 , 전체 카운트 계산은 20초가 안 걸리더군요. 


준비과정에서 있었던 일을 포함해서 설명을 드리자면, 네트워크의 속도가 아주 중요합니다. 일반적인 100M bps 스위치를 기가 스위치로 바꾸고 네트워크 카드가 2개 있는 것을 전부 1개로 본딩(Bonding: 물리적인 2개의 네트워크 카드를 마치 1개 인양 묶어주면 HDD 레이드하는 것처럼 속도가 빨라짐)으로 묶어주니 업로드 속도가 거의 9배 가까이 상승하고 , 쿼리 속도가 거의 4배 상승했습니다. 

그리고 자바환경이기 때문에 역시 튜닝포인트는 존재합니다. 데이타 건수가 너무 많아서 올라가지 않는 문제는 없었기 때문에 거의 쿼리를 던지면 힙이 터지는 문제가 대부분입니다. 그래서 그런 쿼리를 처리하는 것이 노드매니져(nodemanager)의 힙 메모리 사용량을 변경하는 것으로 튜닝이 가능합니다. 기본은 1기가로 되어 있기 때문에 4기가로 올린 것만으로 안돌아가던 쿼리들이 돌아가기 시작하더군요. 만약 8기가 단위의 서버들을 이용해서 클러스터(Cluster)를 구성한다면 노드매니져의 메모리 튜닝만으로도 150만개의 데이터의 셀프조인(self join) 계산인 대략 2조개의 데이터까지 처리가 가능할 것으로 보입니다. 


제가 지금 까지 빅데이타가 우리나라에 소개되기 시작한 초창기부터 스터디하고 실제로 적용해보면서 느꼈던 단상을 말하자면 빅데이타가 만능이 절대 아니라는 것입니다. 사람들은 절대 만능이 아니지라는 말에 격한 공감을 하지만 실제로 이야기 하는 것을 보면 만능인것처럼 기대한다는 것입니다. 그러나 힙도 터지기도 하고 아무리 분산이라고 하지만 처리할 수 있는 용량의 한계는 분명히 존재합니다. 그래서 확장도 해야하고 머신 노드 자체를 늘려야 할 필요도 존재합니다. 

그리고 기본적으로 데이타에서 통찰력을 이끌어 내야 하는 부류이기 때문에 BI 와 같이 컨설팅의 영역에 가깝습니다. 개별 개별 정리할려고 하는 로그가 일정하지 않기 때문입니다. 비정형 데이터를 정리할 필요가 있는 것이지요. 그렇기 때문에 분석가가 달려들려고 해도 이러한 부분이 장벽으로 존재합니다. 즉 인프라 (Infrastructure)에 대한 이해도 필요합니다. 그렇기 때문에 원론적으로 말하는 데이타 해커(Data Hacker: 데이터를 수집하고 분석에 알맞게 정리하고 편하게 분석할 수 있게 구성할 수 있는 사람)와 데이타 과학자(Data Scientist: 데이터를 분석하고 분석된 데이타로부터 통찰력을 가져올 수 있는 사람)이 같이 필요합니다. 그래서 적어도 빅데이타 업체라는 소리를 할려면 이 두가지 종류의 사람이 다 필요합니다. 

그렇기 때문에 빅데이타쪽은 인프라가 필수적입니다. 일단 인프라를 설치하고부터가 시작입니다. 설치하고 데이타를 올리고 분석을 시작하면 갖가지 문제점들이 마구 마구 튀어나올 것입니다. 하지만 그러한 것들이 터져준다면 또한 행복한(?) 일일것입니다. 그러한 것들을 잡아나가는 것이 바로 발전의 시작이기 때문입니다. 



HBase 는 가-분산 방식 까지 설치되어 있다고 가정하고 Hadoop 은 완전-분산 방식까지 설치되어 있다고 가정합니다. (지난 포스트들을 찾아보세요)

4대의 서버에 걸쳐서 HBase 클러스터링 설정을 하는 것으로 하겠습니다. 

nobody1 - HMaster
nobody2 - RegionServer
nobody3 - RegionServer
nobody4 - RegionServer

 




이제 설정파일들을 검토하겠습니다.  

    conf/hbase-env.sh
   

  # export JAVA_HOME=/usr/java/jdk1.6.0/
  export JAVA_HOME=/usr/lib/jvm/java-6-openjdk


를 추가해주고 (아마 되어 있을 것입니다)

 

  # export HBASE_CLASSPATH=
  export HADOOP_HOME=/home/hadoop/work/hadoop-1.0.1
  export HBASE_CLASSPATH=${HBASE_CLASSPATH}:$HADOOP_HOME/conf


를 추가해줍니다. 
 

  # Tell HBase whether it should manage it's own instance of Zookeeper or not.
  export HBASE_MANAGES_ZK=true


이제 주키퍼를 사용한다고 설정해야 하는 부분입니다. 

conf/hbase-site.xml

 1    <configuration>
 2    <property>
 3        <name>hbase.rootdir</name>
 4        <value>hdfs://nobody1:9000/hbase</value>
 5    </property>
 6
 7    <property>
 8        <name>hbase.cluster.distributed</name>
 9        <value>true</value>
10    </property>
11
12    <property>
13        <name>dfs.replication</name>
14        <value>3</value>
15    </property>
16
17    <property>
18        <name>hbase.zookeeper.quorum</name>
19        <value>nobody1,nobody2</value>
20    </property>
21
22    <property>
23      <name>hbase.zookeeper.property.dataDir</name>
24      <value>/home/hadoop/work/hbase-0.92.1/zookeeper</value>
25      <description>Property from ZooKeeper's config zoo.cfg.
26        The directory where the snapshot is stored.
27      </description>
28    </property>
29   </configuration>
   
hbase.rootdir 은 하둡의 네임노드뒤에 /hbase 를 적어줬습니다. 
hbase.cluster.distributed 는 클러스터링을 할 것인지에 관한 것입니다. true 로 적어줬습니다. 
dfs.replication 은 복제셋을 얼마나 가져갈 것인지에 관한 설정인데 3 으로 정해줬습니다. 

zookeeper
관련 설정은 꼭 해줘야 하는 부분입니다. 
hbase.zookeeper.quorum 은 클라이언트가 접속해야 하는 주키퍼를 설정해줄 수가 있습니다. nobody1 과 nobody2 에 주키퍼가 떠 있어서 클라이언트의 접속을 받을 것이라는 설정입니다. 

   conf/regionservers

   

   nobody1
   nobody2
   nobody3
   nobody4


   
이것은 실제적으로 데이타가 저장이 되는 리젼 서버(Region Server)들이 저장되는 곳입니다. 여기에 쓰여져 있는대로 리젼서버들이 구동됩니다. 

이제 설정이 끝나고 설정을 복사해 줄 차례입니다. 

   

   $ cd ~/work/hbase-0.92.1
   $ rsync -av . hadoop@nobody2:/home/hadoop/work/hbase-0.92.1/
   $ rsync -av . hadoop@nobody3:/home/hadoop/work/hbase-0.92.1/
   $ rsync -av . hadoop@nobody4:/home/hadoop/work/hbase-0.92.1/


   이제 다 설정 되었으니 하둡을 먼저 구동시키고 HBase 를 구동시킵니다. 
   

   $ cd ~/work/hbase-0.92.1
   $ bin/start-hbase.sh 




드디어 정리를 해서 올리게 됐습니다. 

하둡 (Hadoop) 클러스터링(Clustering) 은 가-분산 방식 으로 설치가 되어 있다는 가정하에 진행하겠습니다.

nobody1 -> master , namenode 
nobody2 -> datanode , secondary-namenode
nobody3 -> datanode
nobody4 -> datanode

이런 형식으로 설정을 할려고 합니다. 모든 서버는 전부 같은 계정 (예를 들면 hadoop )으로 세팅이 되어 있다고 가정합니다.

그리고 모든 서버는 서로 서로 password 없이 ssh 로 로그인이 된다는 가정이 필요합니다.

nobody1 서버에서 세팅을 하고 나머지 서버로 rsync 를 이용해서 동기화를 시켜줄 것입니다. 하둡은 설정파일에 기재되어 있는대로 동작을 하기 때문에 마스터건 슬레이브 이던간에 동일하게 동작합니다. 이들을 구분 짓는 것은 nobody1~4 만으로 구분 지을 것입니다.

conf/core-site.xml

 1<?xml version="1.0"?>
 2<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 3
 4<!-- Put site-specific property overrides in this file. -->
 5
 6<configuration>
 7    <property>
 8        <name>fs.default.name</name>
 9        <value>hdfs://nobody1:9000</value>
10    </property>
11</configuration>

필히 바꾸어 줘야 할 중요한 설정파일입니다. fs.default.name 즉 네임노드가 저장될 위치를 지정하는 부분입니다. 기존 가-분산 방식에서 지정된 localhost 를 nobody1 으로 수정해 주면 됩니다.

conf/hdfs-site.xml

 1<?xml version="1.0"?>
 2<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 3
 4<!-- Put site-specific property overrides in this file. -->
 5
 6<configuration>
 7    <property>
 8        <name>dfs.replication</name>
 9        <value>3</value>
10    </property>
11
12    <property>
13        <name>dfs.name.dir</name>
14        <value>/home/hadoop/work/hadoop-1.0.1/name</value>
15    </property>
16
17    <property>
18        <name>dfs.data.dir</name>
19        <value>/home/hadoop/work/hadoop-1.0.1/data</value>
20    </property>
21
22    <property>
23        <name>dfs.support.append</name>
24        <value>true</value>
25    </property>
26
27    <property>
28        <name>dfs.datanode.max.xcievers</name>
29        <value>4096</value>
30    </property>
31</configuration>
dfs.replication 의 값이 변경됐습니다. (기존 1 -> 3 으로) 복제셋의 갯수를 지정해 주는 곳입니다. 복제 셋은 한 시스템 (노드)가 다운됐을 때의 Fail Over 나 한 서버에 몰리는 부하를 나누어 주는 역할을 합니다. 3 이라고 하면 같은 데이타를 3곳으로 나누어서 (같은 데이타 3번)저장하라는 것입니다.

conf/mapred-site.xml

 1<?xml version="1.0"?>
 2<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 3
 4<!-- Put site-specific property overrides in this file. -->
 5
 6<configuration>
 7    <property>
 8        <name>mapred.job.tracker</name>
 9        <value>nobody1:9001</value>
10    </property>
11    <property>
12        <name>mapred.system.dir</name>
13        <value>/home/hadoop/work/hadoop-1.0.1/mapred/system</value>
14    </property>
15</configuration>

mapred.job.tracker 의 값은 현재 맵-리듀스 작업을 할 때 그 작업을 각 테스크별로 분배해주는 기능을 하는 서버의 위치를 지정하게 되어 있습니다 . 네임노드가 위치한 곳과 같은 곳을 지정하게 해줍니다.

conf/masters

nobody2

masters 파일은 네임노드의 위치를 적어주는 것이라고 착각하기 쉽습니다. 정확히는 secondary name-node 의 위치를 기억시키는 파일입니다. secondary name-node 는 네임노드 (name-node) 가 죽었을 때 보조적으로 네임노드의 기능을 대신하는 서버 입니다.

conf/slaves

nobody2
nobody3
nobody4

slaves 파일은 데이터노드 (datan-node) 가 저장될 서버들을 기입해 주면 됩니다.

이제 모든 설정은 끝났습니다. 이제 분산화를 처리할 각 서버로 위의 설정파일들과 내용들을 동기화 해주면 됩니다.

$ cd /home/hadoop/work/hadoop-1.0.1
$ rsync -av . hadoop@nobody2:/home/hadoop/work/hadoop-1.0.1/
$ rsync -av . hadoop@nobody3:/home/hadoop/work/hadoop-1.0.1/
$ rsync -av . hadoop@nobody4:/home/hadoop/work/hadoop-1.0.1/


 HBase  구동시에 만약 다음과 같은 에러가 발생한다면

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/crazia/work/hbase-0.92.0/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/crazia/work/hadoop-1.0.1/lib/slf4j-log4j12-1.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]

 클래스패스에  slf4j-log4j12  관련  jar  가 여러개 있어서 이런 현상이 발생하는 것입니다. 제 경우에는 hbase 에는 1.5.8  버젼과 하둡 (hadoop) 에는 1.4.3 버젼이 중첩해서 있어서 발생하는 문제였습니다.

한 버젼으로 통일하고 단 한개만 클래스패스에 존재하게 바꾸어 줍니다. 제 경우에는 hbase 안에 있는 jar 를 hadoop 쪽에 옮겨주고 지워버렸습니다.

아래 사이트 참조해서 해결했습니다.

http://www.slf4j.org/codes.html#multiple_bindings


먼저 하둡(Hadoop) 이 필히 설치가 되어 있어야 합니다. 이번에 HBase 를 가-분산 방식 (Pseudo Distributed )으로 설치해 볼 예정이기 때문에 하둡 (Hadoop) 또한 가-분산 방식으로 설치가 되어 있는 것이 좋을 것입니다.

하둡이 먼저 설치되어야 하는 이유는 HBase 가 하둡 기반위에서 돌아가기 때문입니다. $HBASE_HOME/lib 밑의 추가되어 있는 hadoop-core-x.x.x.jar 는 스탠드얼론(Stand Alone) 버젼에서 쓰이는 것으로 나중에 분산적용할 때는 클러스터(Cluster)에 설치되어 있는 하둡과 버젼을 일치시켜줘야 한다. 따라서 HBase 0.92.0 버젼을 설치하기 위해서는 Hadoop-1.0.0 버젼이 설치되어야 합니다.

하둡 설치하는 방법은 저의 지난 아티클 을 참조합니다.


하둡이 설치되고 구동되는 것까지 확인해 보셨다면 설정 파일들을 몇개 수정해 줘야 합니다. 일단 디렉토리를 계속 왔다리 갔다리 하는게 귀찮으니 하둡쪽의 conf/hdfs-site.xml 을 HBase 쪽의 conf/hdfs-site.xml 로 링크를 걸어주는 작업부터 하기로 합니다.

$ cd ~/work/hbase-0.92.0/conf
$ ln -s ~/work/hadoop-1.0.0/conf/hdfs-site.xml hdfs-site.xml

링크가 걸렸다면 다음 파일을 열어서

conf/hbase-site.xml, conf/hdfs-site.xml

 
<property>
    <name>dfs.support.append</name>
    <value>true</value>
 </property>

위의 내용을 추가해 줍니다.

그리고

conf/hdfs-site.xml 파일 아래쪽에 동시에 제공될 수 있는 파일들 갯수의 상한선을 지정해줘야 합니다.

      <property>
        <name>dfs.datanode.max.xcievers</name>
        <value>4096</value>
      </property>


에 추가 , 이것을 지정 안해 줄시에는 이상한 에러가 발생한다고 하니 유념하시기 바랍니다.

그리고 다음 파일을 열어서

conf/hbase-env.sh

export HADOOP_HOME = /home/crazia/work/hadoop-1.0.0
export HBASE_CLASSPATH=${HBASE_CLASSPATH}:$HADOOP_HOME/conf


이 내용을 추가해 주고

export JAVA_HOME=/usr/java/jdk1.6.0_31/


위의 내용을 추가해서 어떤 자바를 쓸 것인지 지정해줘야 합니다.

여기까지는 공통된 부분이고 이제부터 분산방식을 지정해야 합니다.  분산 방식은 보통 가-분산 (Pseudo-Distributed) 방식이랑 완전-분산(Fully-Distributed) 방식으로 나뉩니다. 컴퓨터 한대에 설치해서 테스트 해 볼것이기 때문에 가-분산 방식으로 설치해보기로 합니다.

하둡은 이미 설치되서 가-분산 방식으로 설정이 되어 있다고 했었기 때문에

hbase-site.xml 의 최종 모습입니다.

<configuration>

  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:9000/hbase</value>
  </property>

  <property>
    <name>dfs.support.append</name>
    <value>true</value>
  </property>

  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

</configuration>


hbase.rootdir 은 $HADOOP_HOME/conf/core-site.xml 에 있는 fs.default.name 을 참조합니다. 제 것은 포트 번호가 9000으로 되어 있군요. 그래서 9000 으로 지정해주고 /hbase 라고 추가해 줬습니다.

hdfs-site.xml 의 최종모습입니다.

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

  <property>
    <name>dfs.name.dir</name>
    <value>/home/crazia/work/hadoop-1.0.0/name</value>
  </property>

  <property>
    <name>dfs.data.dir</name>
    <value>/home/crazia/work/hadoop-1.0.0/data</value>
  </property>

  <property>
    <name>dfs.support.append</name>
    <value>true</value>
  </property>

  <property>
    <name>dfs.datanode.max.xcievers</name>
    <value>4096</value>
  </property>

</configuration>


설정이 다 되었습니다. 이제 하둡부터 구동시킵니다.

$ cd $HADOOP_HOME


  하둡이 설치된 곳으로 이동하라는 명령입니다. 참고로 저는 /home/crazia/work/hadoop-1.0.0 에 설치가 되어 있습니다.

$ ./bin/start-all.sh


하둡을 구동시킵니다. 사실 하둡 파일 시스템만 구동시키면 되지만 그냥 전부 다 구동시켜줍니다. (파일 시스템만 구동시킬 경우에는 start-dfs.sh 를 사용합니다) 하둡이 완벽하게 구동 되었으면 이제 HBase 를 구동시킬 차례입니다.

$ cd $HBASE_HOME


  HBASE 가 설치된 곳으로 이동하라는 명령입니다. 참고로 저는 /home/crazia/work/hbase-0.92.0 에 설치가 되어 있습니다.

$ ./bin/start-hbase.sh


구동이 완료 되었습니다. 저번 아티클 에서 언급됐던 shell 을 띄워서 제대로 구동이 됐는지 테스트를 해봅니다.

이상입니다.


EDIT: 실제로 HDFS 가 저장되는 디렉토리를 지정해줘야 합니다. 지정 안해주면 기본적으로 /tmp 밑에 파일이 생기는 데 리부팅(rebooting) 하게 되면 파일이 사라져서 두번째 부터는 네임노드 (namenode)가 구동하지를 않습니다.


저번 포스트 (누름) 에서 Stand Alone 방식에 대해서 알아봤습니다. 이번에는 가 분산 방식입니다. 

'가 분산' 방식은 한대의 컴퓨터에서 하둡 파일시스템 (hdfs) ,잡 트랙커 (Job Tracker),와  네임노드 (NameNode), 데이타노드 (DataNode) , 태스크트래커 (TaskTracker) 를 띄우는 방식입니다. 마치 분산을 풀로 하는 것처럼 보이지만 실은 한대에서만 돌리는 것이지요. 그래서 '가 분산' (Pseudo Distribuiton) 방식이라고 합니다. 

저번 StandAlone 방식까지 따라 했다는 전제하에 이어서 하겠습니다. 처음부터 여기를 접하셨다면 저번 포스트 부터 따라하시고 오면 됩니다. 

각각의 파일을 열어서 다음과 같이 설정 작업을 해줍니다. 

conf/core-site.xml:

<configuration>
     <property>
         <name>fs.default.name</name>
         <value>hdfs://localhost:9000</value>
     </property>
</configuration>

conf/hdfs-site.xml:

<configuration>
     <property>
         <name>dfs.replication</name>
         <value>1</value>
     </property>
    <property>      <name>dfs.name.dir</name>      <value>/home/crazia/work/hadoop-1.0.0/name</value>    </property>

   <property>      <name>dfs.data.dir</name>      <value>/home/crazia/work/hadoop-1.0.0/data</value>    </property>
 </configuration>


EDIT: 붉은색으로 칠해진 부분은 이번에 추가 된 부분으로 자신의 하둡이 설치되어 있는 디렉토리를 표기해준다.


conf/mapred-site.xml:

<configuration>
     <property>
         <name>mapred.job.tracker</name>
         <value>localhost:9001</value>
     </property>
</configuration>

이는 각각 네임노드 (NameNode) , 레플리케이션 횟수, 잡트래커를 설정해주는 것입니다. 이와 같이 설정작업을 해 주었다면 이제는 ssh 설정 작업을 해주어야 하는 시간입니다. 

$ ssh localhost


만약 위와 같이 입력했는데 접속하지 않는 다면 , 위에서 했던 'sudo apt-get install ssh' 를 다시 한번 해봐서 이미 패키지가 설치되어 있다면 
문제 없이 될 것이고, 만약 그렇게 했는데도 안된다면 다음과 같은 명령을 실행합니다. (그런데 보통 이것은 필요 없을 수도 있습니다.)

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys


EDIT: 2012-02-29
위 과정은 ssh 를 패스워드 없이 접속하기 위해서 해주는 작업으로 필수 과정입니다. 단 위 버젼은 Virtual-Box 에서만 가능하고 독립머신에 설치된 리눅스 버젼에서 작업이 가능할려면 아래 내용을 추가해 줍니다.

$ chmod 644 ~/.ssh/authorized_keys




다시 한번 다음 명령을 실행합니다.

$ ssh localhost


접속이 성공했으면 다음 명령을 써서 다시 원래대로 돌아간다. 

$ exit 


 $HADOOP_HOME 으로 이동해서 distributed-filesystem 을 포맷해줍니다.

$ bin/hadoop namenode -format 



그리고 이제 모든 프로세스들을 띄워야 하는 순간이 왔습니다. 

$ bin/start-all.sh


위와 같은 명령을 실행시켜주고 실제로 네임노드 (NameNode) 와 잡-트랙커(Job-tracker) 가 잘 띄워져 있는지 확인합니다. 하둡에서는 웹페이지로 확인할 수 있게 제공하고 있습니다.

 - 네임노드 : 분산 파일 시스템에 위치한 파일들에 대한 위치정보를 포함하는 정보. 일반적으로 파일시스템                    에서 표현되는 파일명과 디렉토리 위치에 해당한다고 보면 이해가 빠를 것이다. 

 - 잡-트랙커 : 분산 환경에서 작업을 분산시키는 스케쥴 작업을 하는 부분. 

  • NameNode - http://localhost:50070/
  • JobTracker - http://localhost:50030/

  • 위와 같이 제공됩니다. 페이지들이 정상적으로 뜬다면 하둡-분산 파일 시스템이 잘 동작하고 있다는 증거다. 그러면 실제로 잘 동작하는지 간단한 계산을 시켜보기로 하겠습니다.  스탠드얼론 방식에서 했던 테스트를 파일 시스템을 가지고 하는 것입니다. 
     

    $ bin/hadoop fs -put conf input


    위 명령은 하둡-파일 시스템 안으로 conf 에 있는 내용들을 input 이라는 이름으로 집어넣으라는 명령입니다. 자 이제는 실제로 실행을 시켜보져

    $ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'


    시간이 생각보다는 좀 걸립니다. 그리고 결과를 보고 싶으면 

    $ bin/hadoop fs -get output output 
    $ cat output/*


    하둡-파일 시스템 안에 있는 실행결과를 밖으로 꺼내 오는 것입니다. 하둡-파일시스템 안으로 넣을때는 -put , 꺼낼때는 -get 을 쓰는 것에 유의 하시면 됩니다. 
    또 하둡 파일 시스템 안에 있는 결과를 직접 볼 수도 있습니다. 

    $ bin/hadoop fs -cat output/*


    유닉스 명령과 비슷한 명령 (여기서는 -cat ) 을 지원한다. 

    $ bin/stop-all.sh


    위와 같은 명령으로 하둡 파일 시스템을 내릴 수 있습니다. 마치 웹서버 구동과 정지와 비슷합니다. (start-all , stop-all)

     
     
    무엇인가를 해 볼려면 역시 설치부터!! 정말 하둡 초 간단 따라하기 식 설치에 대해서 알아봅니다. 

    시작전에 환경세팅이 필요합니다. 어떤 OS 기반위에 설치할 것인가를 정해야 하는데 저는 그냥 리눅스로 정했습니다. 환경세팅자체도 쉽고 하둡도 리눅스를 추천하고 있기 때문입니다. 그래서 가장 최근에 릴리즈된

    우분투 11.10 (Ubuntu 11.10) - 다운로드 페이지

    로 정했습니다.

    하둡 설치 형태는 3가지로 나뉩니다.

    1. StandAlone
     - 하둡 파일 시스템을 띄우지 않은 상태에서 동작하는 것만 테스트 해 볼 수 있는 상태이다. 
     

    2. Pseudo Distribution
     - 하둡 파일 시스템을 구동시키고 한 컴퓨터에서 모든 데몬들을 띄워서 동작하는 것을 테스트 해볼 수 있는    상태 

    3. Cluster
     - 
    실제로 파일 시스템을 만들고 각 클러스터가 독립적인 기계로 동작하는 방식 

     
    이중 StandAlone 과 Pseudo Distribution 을 싱글노드 (Single - Node ) 방식이라고 합니다. 즉 한대의 컴퓨터에서 설치해서 동작시킬 수 있기 때문입니다.  이중 정말 간단한 StandAlone 방식으로 설치해 보겠습니다.

    Linux 에서 '터미널' 프로그램을 실행한 후에 

    $ sudo apt-get install ssh 
    $ sudo apt-get install rsync


    위와 같이 입력해서 SSH 서버와 Rsync 를 설치해줍니다. Rsync 는 일반적으로 설치가 되어 있습니다. 기본 준비가 되어 있으면 다음은 하둡을 설치해줄 시간입니다. 

    http://ftp.daum.net/apache//hadoop/common/stable/

    위 주소를 클릭해서 다운을 받습니다. 최신버젼을 안 쓰고 안정화 버젼을 쓰는 것은 어찌보면 당연합니다. 어디서 문제가 생길지 모르는 버젼보다는 이미 많이 밝혀져서 안정화 버젼을 쓰는 것이 정신 건강상 좋기 때문입니다.

    하둡을 실제로 실행하기 전에 환경 변수를 챙겨줘야 합니다. $HOME 에 있는 .profile 파일을 열어서 다음과 같은 내용을 추가해줍니다.

    export JAVA_HOME="/usr/lib/jvm/default-java"
    export HADOOP_HOME="/home/crazia/work/hadoop-0.20.203.0"


    HADOOP_HOME 에서  'crazia' 는 본인의 아이디로 대체 합니다. 
    그리고 다시 '터미널' 창에서 다음과 같이 입력해서 변경점을 적용해줍니다. 

    $ source ~/.profile 


    그리고 $HADOOP_HOME/conf/hadoop-env.sh 파일을 열어서 

    # export JAVA_HOME=/usr/lib/j2sdk1.5-sun


    위와 같은 부분을 찾아서 그 밑에 

    export JAVA_HOME=/usr/lib/jvm/default-java


    라고 추가해 줍니다. 이제 여기까지 따라 했으면 준비가 끝났습니다. 간단하게 테스트 해보기로 하겠습니다.

    터미널 프로그램에서 $HADOOP_HOME 으로 이동해서 
     

    $ mkdir input 
    $ cp conf/*.xml input 
    $ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 
    $ cat output/*


    위와 같이 입력해. 그리고 결과를 확인해 봅니다. 만약 결과가 나온다면 설치는 성공한 것입니다.

    사실 여기까지는 정말 별거 아닙니다. 다음 설치를 위한 준비과정이라고 생각하시면 됩니다. 그냥 부담 없이 처음부터 끝까지 쭈욱 따라가기만 하면 설치됩니다. 그리고 다시 한번 개발을 위해서라면 리눅스(Linux) 특히 그중에 우분투( Ubuntu )를 강력 추천합니다.


      
     
      
     


    어디가서 기술 모른다고 기 죽지 말고 들어본 것처럼 말 할 필요가 있는 매니져분들을 위한 1분 짜리 하둡 정리 입니다.더 복잡하고 더 깊이 있는 내용은 '공부'를 해야 하기 때문에 제가 내세우는 취지와는 안 맞을 것입니다. 

    하둡의 화두는 '분산' 입니다. 

    하둡은 두가지 큰 요소의 결합입니다. '처리(계산)' 와 '저장' 입니다. 즉 '분산처리' 와 '분산저장' 이라고 보면 됩니다. 여러개의 저가형 컴퓨터를 마치 하나인것 처럼 묶어주는 기술이라고 보면 됩니다. (그래서 계산 능력과 저장 공간을 늘립니다)

    분산저장

    하둡 파일시스템(HDFS: Hadoop Distributed File System) 을 이용해서 파일을 적당한 블록 사이즈 (64MB)로 나눠서 각 노드 클러스터(각각의 개별 컴퓨터) 에 저장합니다. 또한 데이타 유실의 위험이나 사람들이 많이 접근할때 (Access) 할때의 부하처리를 위해서 각 블록의 복사본 (Replication)을 만들어 둡니다. 보통 복사본은 최소 3카피 정도입니다. 왜 이렇게 하냐면 고성능 서버에서 저장공간은 돈이 많이 들어가는 부분입니다. 그것을 저가형 저장소 여러개를 묶어서 마치 레이드 처럼 동작하게 하려는 목적으로 분산저장을 하는것입니다. 

    분산처리

    MapReduce 라는 프레임워크를 이용해서 계산합니다. 프레임워크라는 것이 중요합니다. 즉 분산처리를 위해서 프레임워크를 만들어 둔것입니다. 분산처리를 위해서 프레임워크에 맞추어서 코딩을 하고 하둡 시스템에서 그것을 실행하면 자동으로 분산처리를 해 줍니다. 
       
    그 맵리듀스 (MapReduce) 라는 프레임 워크는 Map + Reduce 라는 두가지 형식으로 나누어 집니다. 개념은 간단합니다. Map 함수에서 데이타를 처리를 하고 Reduce 함수에서 원하는 결과값을 계산시킵니다. 

    여러가지 설명이 있겠지만 정말 쉽게 설명을 하자면 하둡은 분산을 지원하기 위한 자바를 이용한 '가상 OS' 와 같은 개념으로 보면 가장 편리할 것입니다. (보통 OS 가 파일 시스템 과 잡 스케쥴러를 기반으로 구성됩니다)





    + Recent posts