한국컴퓨터정보학회지제 18 권제 1 호, 2010. 6. Hadoop 설치와애플리케이션의구동 금태훈 ( 한양대학교컴퓨터공학과 ) 김세회 ( 한양대학교컴퓨터공학과 ) 이상준 ( 평택대학교물류정보대학원 ) Ⅰ. 서론 클라우드컴퓨팅이란개인용컴퓨터또는기업의서버에개별적으로저장해두었던자료와소프트웨어들을클라우드클러스터로구축하여필요할때 PC나휴대폰과같은각종단말기를이용하여원격작업을수행할수있는환경을의미한다. 클라우드컴퓨팅은 2006년구글 (Google) 의엔지니어가처음으로제안하였으며 [1] 유연한동적 IT 인프라와 QoS가보장되는컴퓨팅환경, 그리고구성가능한소프트웨어서비스를제공하기때문에많은관심을받고있다. 국외에서는이미많은연구와개발이진행중이며, 대표적인예로 Amazon Elastic Compute Cloud[2], IBM Blue Cloud[3] 그리고 Google App Engine[4] 등이있다. 한국에서도 2008년에한국클라우드컴퓨팅협의회 (CCKI) 가출범하는등관련업게중심으로클라우드컴퓨팅에대한관심을높이고있다. 클라우드컴퓨팅기술은가상화기술, 웹서비스, SOA (Service Oriented Architecture), 웹 2.0, 분산파일시스템과프로그래밍모델등이있다 [5]. Hadoop[8] 은이러한클라우드환경을구축할수있는플랫폼으로 Apache 오픈소스프로젝트로개발되었다. Hadoop은 2005년 Apache의 Nutch 오픈소스검색엔진의대용량의웹데이터를처리하기위해고안되었다가 2008년 Apache Top-Level 프로젝트로승격되었다. Hadoop은 HDFS, HBase, Hive 등의많은컴포넌트를지원하며, 데이터처리방식으로 MapReduce 소프트웨어프레임워크를사 용한다. 본논문에서는 Hadoop의설치와구동, 예제애플리케이션실행을위한과정을리눅스명령어와함께상세히설명한다. 본논문의구성은다음과같다. 2장에서는 HDFS와 MapReduce 프로그래밍모델에대하여설명하고 3장에서는 Hadoop 클러스터구축을위한과정을상세히설명한다. 4 장에서는 Hadoop의예제애플리케이션에대해설명한후, 5장에서결론을맺는다. II. 관련연구 Hadoop의설치에앞서분산파일시스템과분산처리에대해살펴본다. 대표적인분산파일시스템으로는구글의 GFS[6] 와 Hadoop의 HDFS가있다. 대표적인분산처리는구글의 MapReduce[7] 가있는데 Hadoop의 MapReduce는구글의 MapReduce 기술을모방하여만들어진것이며동작방식도동일하다. 1. HDFS(Hadoop Distributed File System) HDFS는저비용의수백내지수천노드를가지는클러스터를이용하여기가바이트또는테라바이트의대용량데이터집합을처리하는응용프로그램에적합하도록설계한분산파일시스템이다. HDFS는마스터-슬레이브구조로동작하며, 노드간에 TCP/IP 프로토콜을사용하여통신한다. 또한
10 한국컴퓨터정보학회지 노드실패에대비하여데이터를복제하여저장한다. 이 HDFS의구조는그림 1과같다. 트를통하여네임노드와통신한다. 2. MapReduce MapReduce는대용량데이터집합을처리하는기법이다. 또한 MapReduce는일정한데이터포맷을생성하여분산처리하는기능을제공한다. 이때개발자는 Map 함수와 Reduce 함수를정의한다. Map 함수는입력된 <key, value> 쌍들을처리하여 <key, value> 쌍의중간값집합을생성한다. Reduce 함수는중간 key값을가지는모든중간값들을통합하여최종출력값으로저장한다. MapReduce의동작과정은다음과같다. 그림 1. HDFS 구조 Fig. 1. HDFS Architecture 그림 1에서단일네임노드 (Name node) 는파일시스템네임스페이스를관리하고, 클라이언트에의한파일접근을통제한다. 데이터노드 (Data node) 는클러스터에서각노드의스토리지를관리하며네임노드가지시하는블록명령등을수행한다. 클라이언트의대용량파일원본을 HDFS에저장할때블록단위로나누어서저장한다. 기본적인블록크기는 64MB 또는 128MB이며사용자가임의로설정가능하다. 각파일의블록들은데이터노드실패시에자동복구를위해복제본을생성한다. 이때복제설정값은기본적으로 3 이지만사용자가임의로설정가능하다. 이러한복제블록을어떻게배치하느냐에따라 HDFS의신뢰성과성능에중요한영향을미치는데현재 HDFS는 Rack-aware 복제배치정책을사용하고있다. 이것은다른랙 (rack) 에위치한두노드사이의통신은스위치를통하기때문에대역폭이작은반면동일한랙에위치한두노드간의대역폭은훨씬크다는점을고려한것이다. 예를들면복제설정값이 3일경우, 동일랙에존재하는두노드에각각복제본을저장하고, 다른랙의노드에동일한복제본을저장한다. 따라서노드실패가발생하면동일한복제본 2개를이용하여데이터를복구함으로써데이터손실을방지할수있다. 또한클라이언트- 네임노드간의통신은 TCP/IP 프로토콜을사용한다. 클라이언트는네임노드에서설정한 TCP 포 1 마스터노드는입력파일들을특정크기로분할하고, 그분할된 M개의조각을클러스터의작업노드들에게할당한다. 2 각작업노드들은할당받은 Map 작업에필요한조각들을로드하여, Map 함수를수행하고중간결과값을저장한다. 3 Reduce 작업을할당받은작업노드들은중간결과값을로드하여 Reduce 함수를수행하고, 최종결과값을저장한다. 4 모든 Map과 Reduce 작업이완료되면마스터노드는그결과를사용자프로그램에전송한다. 마스터노드는주기적으로모든작업노드들이동작하는지체크한다. 만일특정시간동안작업노드의응답이없으면마스터노드는해당작업노드를실패로처리한다. 이때더이상작업실패노드접근이불가능하기때문에로컬디스크에서작업중이던결과물에접근할수없다. 따라서수행중이던작업을모두초기상태로되돌리고, 다른작업노드에할당하여재시작한다. III. 본론 Hadoop 기반의클러스터구축방식에는단일구성방식, 가상분산방식, 완전분산방식이있다. 먼저단일구성방식은비분산모드로 Hadoop을하나의로컬시스템에서자바프로세스로실행하는방식으로주로 Hadoop 기반의응용프
Hadoop 설치와애플리케이션의구동 11 로그램디버깅에유용하다. 가상분산방식은하나의노드에서네임노드와데이터노드각각을가상의자바프로세스로설정하여실행하는것이다. 마지막으로완전분산방식은 TCP/IP 프로토콜로통신하는다수의노드로하나의클러스터를구성하는방식이다. 본논문에서는완전분산방식의 Hadoop 클러스터구축에대한과정을리눅스명령어와함께상세히설명한다. 본논문에서사용한클러스터의환경은표 1과같다. 2. Hadoop 환경설정 Hadoop의환경설정을위해 hadoop-env.sh을수정한다. conf/hadoop-env.sh 파일에 JAVA_HOME의주석을제거하고 Java가설치된폴더로설정한다. $ vi /home/user/hadoop/conf/hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.10 표 1. 클러스터환경 네임노드 1개 노드수 데이터노드 10개 CPU 성능 2.4 Ghz 노드성능 RAM 용량 768 MB 운영체제 Linux(Ubuntu 9.04 Server) Hadoop Hadoop-0.19.1 1. 소프트웨어다운로드및설치 Hadoop을설치하기에앞서모든노드에동일한사용자를등록한다. 본논문에서는 'user' 라는사용자를등록하였다. 그리고모든노드에 http://hadoop.apache.org 에서 hadoop을다운로드한다. 다운로드한압축파일을 user' 폴더아래에압축을푼다. 그리고편의상, hadoop의폴더명을 hadoop' 으로변경하였다. 따라서모든노드에서 hadoop의위치는 /home/user/hadoop/' 이된다. Hadoop은 Java로개발되었기때문에모든노드에 Java 를설치한다. $ sudo apt-get install sun-java6-jdk 그리고 Hadoop은 ssh를통해수행명령을송수신하기때문에 ssh를설치한다. $ sudo apt-get install ssh Hadoop은 hadoop-site.xml 파일을통해네임노드와통신할포트, HDFS 데이터복제수, 데이터블록크기등의속성을설정할수있다. hadoop-site. xml 파일의내용은그림 2와같다. 그림 2에서 fs.default.name 은파일시스템의마스터데이터를관리하는네임노드서버의 URI(Uniform Resource Identifier) 를지정하는속성이다. fs.default.name 의속성값인 hdfs://192.168.0.1:9000는네임노드서버 IP와포트번호를각각 192.168.0.1과 9000으로설정하고 hdfs 프로토콜을사용하여통신한다는의미이다. mapred.job.tracker는 MapReduce 분산처리작업을관리하는 Job Tracker 서버를설정하는속성이다. mapred.job.tracker의속성값인 192.168.0.1:9001은 Job Tracker 서버 IP와포트번호를각각 192.168.0.1과 9001로설정하여사용한다는의미이다. 일반적으로네임노드가 Job tracker의기능을수행하기때문에그림 2에서는서버 IP를 192.168.0.1로동일하게설정한다. hadoop-site.xml 파일에서 fs.default.name 속성과 mapred.job. tracker 속성은반드시설정하고, 다른속성은 Hadoop에설정한기본적인속성값을지정한다. HDFS에데이터를저장할때생성하는복제본의수는 dfs.replication 속성에지정한다. 기본적인복제본의수는 3이다. dfs.block.size는데이터블록의크기이며기본적으로 64MB 이다. 그리고그하위의속성은 HDFS와 MapReduce 가생성하는데이터가저장될폴더를정의하는데, Hadoop을테스트하는도중, 이상발생시 dfs 폴더를삭제하고, Name node 의정보를포맷하고다시실행하면된다.
12 한국컴퓨터정보학회지 <configuration> <name>fs.default.name</name> <value>hdfs://192.168.0.1:9000</value> <name>mapred.jop.tracker</name> <value>192.168.0.1:9001</value> <name>dfs.replication</name> <value>3</value> <name>dfs.block.size</name> <value>67108864</value> <name>dfs.name.dir</name> <value>/home/user/hadoop/dfs/name</value> <name>dfs.data.dir</name> <value>/home/user/hadoop/dfs/data</value> <name>mapred.system.dir</name> <value>/home/user/hadoop/dfs/mapreduce/system </value> <name>mapred.local.dir</name> <value>/home/user/hadoop/dfs/mapreduce/local </value> bb </configuration> 그림 2. hadoop-site.xml 설정 이로써 Hadoop의설정은완료되었지만, 이를모든노드에똑같이적용하는것은매우번거로운일이다. 따라서한노드에서위와같이설정을끝낸후, hadoop 폴더를압축하여각노드로전송한후, 각노드에서압축을해제하면된다. $ cd /home/user $ tar -cvf hadoop.tar hadoop/ $ gzip -9 hadoop.tar $ scp /home/user/hadoop.tar.gz hadoop@ip_add:/home/user/hadoop.tar.gz 위의명령어중 IP_ADD 는전송할노드의 IP 주소이다. 3. System 설정 Hadoop은시스템의이름을통해통신을하기때문에 hosts 파일에클러스터에참여하는모든노드의시스템이름과 IP가나열되어야한다. $ sudo vi /etc/hosts 192.168.0.1 hadoop-n01 192.168.0.2 hadoop-n02... 그리고 Hadoop에서 ssh를이용하여각노드의실행메시지를보내는데, 인증키가없다면매번연결할때마다패스워드를묻게된다. 이를간편하게하기위해다음과같이 Name node에서 ssh- keygen을실행한다. 다음으로 Name node 와 Data node 의 IP 를설정한다. $ cd /home/user/hadoop/conf $ vi masters 192.168.0.1 $ ssh-keygen -t rsa ( 이후계속엔터 ) $ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys $ scp /home/user/.ssh/authorized_keys hadoop@ip_add:/home/user/.ssh/authorized_keys $ cd /home/user/hadoop/conf $ vi slaves 192.168.0.2 192.168.0.3 192.168.0.4... 위와같이 Name node에서 RSA키를생성한후, 다른모든노드에 authorized_keys를보내준다.
Hadoop 설치와애플리케이션의구동 13 4. Hadoop 실행 모든설정이완료되었다면, Hadoop을실행하기전 Name node가가진정보를초기화한다. $ cd /home/user/hadoop $ bin/hadoop namenode -format 만약, dfs에접근을못하거나에러가발생한다면 Hadoop 을중단하고, hadoop/dfs 폴더 (hadoop-site.xml 에정의한속성 ) 를삭제한후, 위와같이초기화를하면해결할수있다. 단, HDFS에저장된파일은모두삭제된다. 아래와같이 start-all.sh를실행하면 Hadoop이실행된다. start-mapred.sh 와 start-dfs.sh 는각각 MapReduce, HDFS 를실행하는데, start-all.sh 를실행하면모두함께실행된다. Hadoop의중단도동일한형태이며, 명령어는아래와같다. 그리고 Hadoop의주요명령어는표 2와같다. $ bin/start-all.sh $ bin/stop-all.sh IV. 애플리케이션구동 본논문에서는 Hadoop의기본적인예제애플리케이션인 WordCount 를통해 MapReduce의동작에대해설명한후, Hadoop의수정및리빌드에대해추가적으로설명한다. WordCount 는입력파일을읽어서블록단위로단어빈도수를계산하는애플리케이션이다. 1. WordCount의동작 WordCount의실행에앞서 WordCount의동작을살펴본다. 그림 4는 WordCount 의주요동작에관련된부분인 map 함수와 reduce 함수를의사코드로표현한것이다. Hadoop의애플리케이션을개발할때, map 함수와 reduce 함수를오버라이딩 (Overriding) 하여사용하기때문에단순한코드만으로분산처리를구현할수있다. 그림 3의 WordCount 애플리케이션은 map 함수에서파일의내용을단어단위로분리하여단어수를카운트한다. 각각의단어를 key로하고, value는 1로지정하여 output에저장한다. reduce 함수에서는 map 함수의수행결과를 key, values로전달받는다. 그리고 key에해당되는특정단어에대한 value를합산하여단어수를계산한다. 그리고그결과를 output에저장한다. 표 2. Hadoop 의주요명령어 DFS 파일보기 bin/hadoop dfs -ls DFS 파일삭제 bin/hadoop dfs -rmr FILENAME Job 리스트 bin/hadoop job -list Job 중지 bin/hadoop job -kill JOB_ID 웹브라우져에서 http://name node_ip:50070 으로접속하면 HDFS의정보를볼수있다. 또한, MapReduce 작업에대한정보는 http://name node_ip:50030/ 으로접속하여확인할수있다. Function map(key, value, output) Text word = first word in value while (until last word in value) output.collect(word, 1) word = next word in value End while End map Function reduce(key, values, output) integer sum = 0 while (until last value in values) sum += values.next() End while output.collect(key, sum) End reduce 그림 3. WordCount 애플리케이션의사코드
14 한국컴퓨터정보학회지 2. WordCount의실행 3장에서설명한것과같이 Hadoop이실행된상태에서 WordCount를실행한다. WordCount 의입력으로사용할텍스트는폴더형태나파일형태에관계없이 HDFS내에존재하기만하면된다. 먼저, 아래의명령을사용하여입력으로사용할폴더나텍스트를 HDFS에저장한다. 아래의예에서는 Hadoop의 conf 폴더및하위파일들을 HDFS에 input 으로저장하고있다. $ bin/hadoop dfs -put conf input 그림 4. HDFS 정보 이제 WordCount 를실행한다 WordCount는 hadoop-*-examples.jar에포함되어있으며, WordCount의첫번째파라메터는단어를카운트할 HDFS 내의파일, 두번째파라메터는결과를저장할파일이다. $ bin/hadoop jar hadoop-*-examples.jar wordcount input output 그림 5. Hadoop 작업리스트 위와같이 WordCount가실행이완료되면실행결과는 HDFS의 'output' 으로저장되는데, HDFS에저장된데이터를로컬로복사하는명령어는아래와같다. $ bin/hadoop dfs -get output localout 그림 4, 5, 6은 3장에서언급한바있는웹브라우저에서 Hadoop의정보를나타낸것이다. 그림 4는 HDFS의정보를확인한화면이고, 그림 5는 Hadoop에서수행중이거나수행된작업을모두보여주고, 그림 6은특정작업에대한정보를나타낸다. 그림 6. 작업에대한세부정보
Hadoop 설치와애플리케이션의구동 15 3. Hadoop 의수정및리빌드 Hadoop은오픈소스프로젝트로코드가공개되어있다. 따라서사용자는자신의클러스터환경에맞게코드를수정할수있는데, 본논문에서는간단한예를통해 Hadoop을수정하고리빌드한다. 먼저, 아래와같이 Apache의자바기반빌드도구인 Ant를설치한다. $ sudo apt-get install ant 다음으로 /home/user//bashrc 파일을수정한다. 수정을완료하고, 아래와같이빌드를한다. $ cd /home/user/hadoop $ ant package 빌드가완료되면./build 폴더에현재버전보다높은버전이만들어져있다. 이것을아래와같이복사한다. $ cp./build/hadoop-core- 버전.jar./ 현재파일명.jar $ vi /home/user/.bashrc export ANT_HOME=Ant 설치디렉토리 export PATH=$ANT_HOME/bin:$PATH 그리고다시 Hadoop을시작하고, 애플리케이션을실행하면 Reduce 함수에서 Map 데이터를가져올때마다해당 Map의 URL을출력한다. 만약, 애플리케이션을실행중에 Reduce가실행이되지않는다면 Map과의연결성을검사해야할것이다. 먼저, Reduce수행시 Map의 Output을가져오는루틴에서연결성을검사한다고가정한다. 따라서 /home/user/hadoop/src/mapred/org/apache/hadoop/mapred /ReduceTask.java 파일을수정한다. 1225라인근처의 getmapoutput 함수로이동하여아래와같이로그출력코드를추가한다. private MapOutput getmapoutput(mapoutputlocation mapoutputloc, Path filename) throws IOException, terruptedexception { // Connect URLConnection connection = mapoutputloc.getoutputlocation().openconnection (); LOG.warn("TEST LOG: " + connection.geturl().tostring()); InputStream input = getinputstream(connection, DEFAULT_READ_TIMEOUT, STALLED_COPY_TIMEOUT); V. 결론 본논문에서는클라우드컴퓨팅을위한플랫폼인 Hadoop 의설치와실행에대해상세히설명했다, 또한 Hadoop의예제애플리케이션인 WordCount를통해 MapReduce 의동작을살펴보았다. 본논문은 http://hadoop.apache.org의 Hadoop Guide[9] 에서설명한기본적인사항들을바탕으로하였다. 하지만, Hadoop Guide에세부적인사항들이기술되지않아, Hadoop 설치및실행에다소어려운점이존재한다. 본논문에서는예제를이용한구축단계를상세히기술하였기때문에실제클라우드환경을구축하는데많은도움이될것이다. 참고문헌 [1] Wikipedia, http://en.wikipedia.org/wiki/christophe_bisciglia, 2009 [2] Amazon Elastic Compute Cloud, http://aws.amazon.com/ec2, 2007 [3] IBM Blue Cloud project, http://www04.ibm.com/jct03001c/press/us/en/pressrel
16 한국컴퓨터정보학회지 ease/22613.wss, 2009 [4] Google App Engine, http://code.google.com/appengine, 2009 [5] L. Wang and G. Von Laszewski, Cloud Computing: A Perspective Study, In Proceedings of the Grid Computing Environments (GCE) workshop, Nov. 2008. [6] S. Ghemawat, H. Gobioff, S.T. Leung, The Google file system, ACM SIGOPS Operating Systems Review, Vol. 37, No. 5, pp. 29-43, Dec. 2003. [7] J. Dean and S. Ghemawat, Mapreduce: Simplified Data Processing on Large Clusters, Communications of the ACM, Vol. 51, No. 1, pp. 107-113, Jan. 2008. [8] Hadoop, http://hadoop.apache.org, 2009 [9] Hadoop, http://hadoop.apache.org/common/docs/r0.19.2/, 2009 저자소개 금태훈 2009: 경일대학교컴퓨터공학과학사. 현재 : 한양대학교컴퓨터공학과석사과정. 관심분야 : 클라우드컴퓨팅, Hadoop, 모니터링시스템. 김세회 2009: 한양대학교전자컴퓨터공학부학사. 현재 : 한양대학교컴퓨터공학과석사과정. 관심분야 : 클라우드컴퓨팅, 분산파일시스템. 이상준 1989: 한양대학교전자계산학과공학사. 1991: Univ. of Utah Mechanical Eng. 공학석사. 1991: Arizona State Univ. Mechanical & Aerospace Eng. 공학박사. 현재 : 평택대학교물류정보대학원전임강사. 관심분야 : 물류정보시스템, 유비쿼터스, RFID/USN, 클라우드컴퓨팅.