PutMerge 프로그램


hadoop 에서는 getmerge 라는 명령어를 제공하는데 이 명령어는 HDFS 안에 있는 다수의 파일들을 로컬 머신에 복사할때 하나의 파일로 통합해주는 역활을 한다. 요번 예제는 getmerge 와는 반대인 로컬머신에 존재하는 다수의 파일을 HDFS 안에 하나의 통합된 파일로 복사하는 PutMerge 소스를 구현해보겠다. 


!! start-all.sh 로 HDFS on!!


소스 편집


[root@master hadoop-1.0.3]# vi PutMerge.java   // 소스를 생성하고 편집


import java.io.IOException;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileStatus;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;


public class PutMerge {

        public static void main(String[] args) throws IOException {


                Configuration conf = new Configuration();    

                FileSystem hdfs = FileSystem.get(conf);    //HDFS 와 인터페이스 하기 위한 클래스

                FileSystem local = FileSystem.getLocal(conf);    //LOCAL 시스템과 인터페이스 하기 위한 클래스


                Path inputDir = new Path(args[0]);

                Path hdfsFile = new Path(args[1]);

                try {

                        FileStatus[] inputFiles = local.listStatus(inputDir);    //path 객체와, 파일과 디렉터리의 메타 데이터를 저장

                        FSDataOutputStream out = hdfs.create(hdfsFile);        //HDFS 에 파일을 쓰기 위한 객체


                        for (int i = 0; i<inputFiles.length; i++) {                // 아마 파일 갯수 만큼 반복되는거 같음

                                System.out.println(inputFiles[i].getPath().getName());

                                FSDataInputStream in = local.open(inputFiles[i].getPath());  //로컬 입력 스트림 열기    

                                byte buffer[] = new byte[256];

                                int bytesRead = 0;

                                while( (bytesRead = in.read(buffer)) > 0) {        //바이트 단위로 HDFS 파일에 쓰기

                                        out.write(buffer, 0, bytesRead);

                                }

                                in.close();

                        }

                        out.close();

                } catch (IOException e) {

                        e.printStackTrace();

                }

        }

}



  테스트


위에서 짠 java 소스 파일을 컴파일!!
  
[root@master hadoop-1.0.3]# javac -cp hadoop-core-1.0.3.jar -d classes PutMerge.java

// 만약 commons 객체 를 찾지 못하는 오류가 뜬다면  아래와 같이 다시 컴파일...
[root@master hadoop-1.0.3]# javac -cp hadoop-core-1.0.3.jar:lib/commons-cli-1.2.jar -d classes PutMerge.java

// classpath 설정이 재대로 되질 않아 commons 객체를 인식하지 못하는 오류같다...


// jar 파일로 압축후 실행 

[root@master hadoop-1.0.3]# jar -cvf jars/putmerge.jar -C classes/ .
Manifest를 추가함
추가하는 중: PutMerge.class(입력 = 1822) (출력 = 930)(48%를 감소함)

// inputtext 폴더안에 두개의 txt파일을 생성하고 실행!!
[root@master hadoop-1.0.3]# hadoop jar jars/putmerge.jar PutMerge inputtext word-merge.txt 
input1.txt
input2.txt
[root@master hadoop-1.0.3]# hadoop fs -ls
Found 3 items
-rw-r--r--   1 root supergroup         25 2012-08-31 17:16 /user/root/input
drwxr-xr-x   - root supergroup          0 2012-08-31 17:26 /user/root/output
-rw-r--r--   1 root supergroup        109 2012-09-01 02:39 /user/root/word-merge.txt   // 통합된 txt파일 생성

[root@master hadoop-1.0.3]# hadoop fs -cat word-merge.txt        //두개의 txt 파일이 하나로 합쳐져서 출력된다.!!
what is Hadoop?
ok! now let's study Hadoop!!!!
a few minutes later....
What the hell !!! what does it mean?

저작자 표시
신고



Fully distributed Mode 에서 예제 실행

 


fully distributed mode 에서 하둡 예제를 실행 해보고 클러스터 상태를 모니터링 하는데 사용되는 하둡의 웹 인터페이스를 살펴보겠습니다.


하둡 완전분산모드까지 오류 없이 진행되었다는 가정하에 포스팅 할게요 ^^


일단 분산모드에서 모든 파일의 입출력관리는 모두 hdfs(hadoop file system) 안에서 이루어진다. 

예제 실행을 위해서 입력파일을 hdfs 안에 올려놔야 한다.

start-all.sh 모든 데몬들을 실행시키고 시작한다.


HDFS(hadoop file system) 


[root@master hadoop-1.0.3]# hadoop fs -put input input  // local 에서 input파일을 동일한 이름으로 hdfs 안에 저장

[root@master hadoop-1.0.3]# hadoop fs -ls                    // 검색해보면 파일이 올라갔음을 볼수 있다.

Found 1 items

-rw-r--r--   1 root supergroup         25 2012-08-31 17:16 /user/root/input


wordcount 예제 실행


[root@master hadoop-1.0.3]# hadoop jar hadoop-examples-1.0.3.jar wordcount input output

12/08/31 17:26:13 INFO input.FileInputFormat: Total input paths to process : 1

12/08/31 17:26:13 INFO util.NativeCodeLoader: Loaded the native-hadoop library

12/08/31 17:26:13 WARN snappy.LoadSnappy: Snappy native library not loaded

12/08/31 17:26:13 INFO mapred.JobClient: Running job: job_201208311703_0001

12/08/31 17:26:14 INFO mapred.JobClient:  map 0% reduce 0%

12/08/31 17:26:29 INFO mapred.JobClient:  map 100% reduce 0%

12/08/31 17:26:41 INFO mapred.JobClient:  map 100% reduce 100%

12/08/31 17:26:46 INFO mapred.JobClient: Job complete: job_201208311703_0001            // 작업완료

12/08/31 17:26:46 INFO mapred.JobClient: Counters: 29

12/08/31 17:26:46 INFO mapred.JobClient:   Job Counters

12/08/31 17:26:46 INFO mapred.JobClient:     Launched reduce tasks=1

12/08/31 17:26:46 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=13171

12/08/31 17:26:46 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0

12/08/31 17:26:46 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0

12/08/31 17:26:46 INFO mapred.JobClient:     Rack-local map tasks=1

12/08/31 17:26:46 INFO mapred.JobClient:     Launched map tasks=1

12/08/31 17:26:46 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=10384

12/08/31 17:26:46 INFO mapred.JobClient:   File Output Format Counters

12/08/31 17:26:46 INFO mapred.JobClient:     Bytes Written=8

12/08/31 17:26:46 INFO mapred.JobClient:   FileSystemCounters

12/08/31 17:26:46 INFO mapred.JobClient:     FILE_BYTES_READ=18

12/08/31 17:26:46 INFO mapred.JobClient:     HDFS_BYTES_READ=124

12/08/31 17:26:46 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=43087

12/08/31 17:26:46 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=8

12/08/31 17:26:46 INFO mapred.JobClient:   File Input Format Counters

12/08/31 17:26:46 INFO mapred.JobClient:     Bytes Read=25

12/08/31 17:26:46 INFO mapred.JobClient:   Map-Reduce Framework

12/08/31 17:26:46 INFO mapred.JobClient:     Map output materialized bytes=18

12/08/31 17:26:46 INFO mapred.JobClient:     Map input records=5

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce shuffle bytes=18

12/08/31 17:26:46 INFO mapred.JobClient:     Spilled Records=2

12/08/31 17:26:46 INFO mapred.JobClient:     Map output bytes=40

12/08/31 17:26:46 INFO mapred.JobClient:     Total committed heap usage (bytes)=176623616

12/08/31 17:26:46 INFO mapred.JobClient:     CPU time spent (ms)=1660

12/08/31 17:26:46 INFO mapred.JobClient:     Combine input records=4

12/08/31 17:26:46 INFO mapred.JobClient:     SPLIT_RAW_BYTES=99

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce input records=1

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce input groups=1

12/08/31 17:26:46 INFO mapred.JobClient:     Combine output records=1

12/08/31 17:26:46 INFO mapred.JobClient:     Physical memory (bytes) snapshot=179654656

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce output records=1

12/08/31 17:26:46 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=692523008

12/08/31 17:26:46 INFO mapred.JobClient:     Map output records=4



결과 확인


[root@master hadoop-1.0.3]# hadoop fs -ls  //output 디렉토리가 생성되어 있음

Found 2 items

-rw-r--r--   1 root supergroup         25 2012-08-31 17:16 /user/root/input

drwxr-xr-x   - root supergroup          0 2012-08-31 17:26 /user/root/output

[root@master result]# hadoop fs -ls output/   //디렉토리 안에 보면 part-r-00000 이 생성되어 잇음 (오류가 있다면 이 파일이 생기지 않음)

Found 3 items

-rw-r--r--   1 root supergroup          0 2012-08-31 17:26 /user/root/output/_SUCCESS

drwxr-xr-x   - root supergroup          0 2012-08-31 17:26 /user/root/output/_logs

-rw-r--r--   1 root supergroup          8 2012-08-31 17:26 /user/root/output/part-r-00000

[root@master result]# hadoop fs -cat output/part-r-00000      //확인해 보면 정확하게 카운팅이 되어 있음

hello   4


Web UI 로 클러스트 상태 확인하기

익스플로러 창에 http:// 자신의 IP주소:50070 엔터!!

HDFS 웹 인터페이스 HDFS 파일 시스테을 볼수 있고 각 노드의 사용 가능한 저장 용량을 확인 또한 전체적인 클러스터의 상태를 모니터링 




50030 으로 검색하면 madpreduce job 을 모니터링 할수 있다.




  특정 잡을 클리하면 자세한 성능 정보를 볼수 있다.




  여기 까지 오셨다면 hadoop 실행환경은 완벽히 만드셨다고 생각되어 집니다 ^^

  앞으로는 실제 데이타가 MapReduce 프로그램에 의해 처리되는 방식과 실제 소스 부분등 공부할 예정입니다. 

  특정 오류가 나셔서 막히시는 분 계시다면 뎃글 달아주시면 아는 한도 내에서 답글 달아 드릴게요 ^^ 


저작자 표시
신고



Pully distributed Mode


분산환경을 실현하기 위해 centOS 하나를 더 설치하였다. 

노트북 용량 관계로 총 2개의 가상 centOS 로 실행    1대는 마스터와 슬레이브 다른 1대는 슬레이브 역활로 

총 하나의 마스터와 2개의 노드로 구성된 클러스트 환경을 구축함!!

standalone 모드까지 준비되었다는 가정하에 포스팅 하겠음 ^^  준비 안되신 분들은 게시물 처음으로 가셔서 설치 하시기 바람 !!


준비 사항 

cenOS 5.8    2대

192.168.109.128 master    // 1대는 master 역활
192.168.109.129 hadoop1 // 다른 1대는 slave 역활

 

[root@master ~]# vi /etc/hosts  //  아이피 주소를 입력 함 (호스트 이름을 통해 접근하기 위함)

192.168.109.128 master   

192.168.109.129 hadoop1


 

SSH 설정


master는 특정 컴퓨터 사용자 계정이 되고 다른 모든 노들들 은 다른 컴퓨터 사용자 계정이 된다. 특정 컴퓨터 사용자 계정으로 다른 컴퓨터 사용자 계정에 접근하기 위해서 SSH는 표준 공개 키 암호를 제공한다. 이 키는 사용자를 확인하는 데 사용 되는데 하나는 공개(public) 키이고 다른 하나는 개인(private) 키로 설정된다. 공개키는 클러스트에 있는 모든 노드에 저장되고 master는 클러스트에 접근할때 개인키를 보내고 해당 컴퓨터는 이 두 개의 키를 가지고 접근 시도를 허락한다. 

 

SSH 키 생성


[root@master ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):  // 입력없이 enter

Enter passphrase (empty for no passphrase):              // 입력없이 enter

Enter same passphrase again:                                   // 입력없이 enter 

  Your identification has been saved in /root/.ssh/id_rsa.  // 개인키

Your public key has been saved in (/root/.ssh/id_rsa.pub.  // 공개키 

[root@master ~]# cat ~/.ssh/id_rsa.pub  //생성된 키 확인 

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5HQiMabQyYz3tTkGxA+jXrR0C5sPiyChws

mCFFGdvt4AMMOVoCqopkombAlIeoN7KWLVv+z02zYsaPVZephDfiKtc1XeTp4XoT4OhMbk

rt7unYuX9VGZMu3OlsGfa6pQmZuWlT/hO7a8JSEMYvZhX/XnHW/xpyaMuX4e8bBrO0F1XX

bC/p9gpycIrLz2268sqdgROh8ibG4KsD4x9s1G/gAg8HOa76YlNLBHseTfgVv3+yJIB2TDiIV7au

xIib9l9JOHLdkepx7nDU6/E1bndWQAqJN0/vCyO5SncFOEY+DKHHzQKy8GAqLNpa6IJ4biuCu

tHMX9kXXwxqoOPGlp4Q== root@localhost.localdomain


공개 키 배포 와 로그인 테스트

 

[root@master ~]# scp ~/.ssh/id_rsa.pub root@hadoop1:~/master_key

 

//hadoop1 으로 다시 로그인뒤 master의 키를 인증된 키로 설정한다.

 
[root@hadoop1 ~]# mkdir ~/.ssh

[root@hadoop1 ~]# chmod 700 ~/.ssh

[root@hadoop1 ~]# mv ~/master_key ~/.ssh/authoried_keys

[root@hadoop1 ~]# chmod 600  ~/.ssh/authoried_keys

//이젠 master 계정에서 대상 로그인으로 시도

 

[root@master ~]# ssh hadoop1                   
Last login: Thu Aug 30 04:52:02 2012 from master
[root@hadoop1 ~]#                          // 로그인 완료 !!빠져나가려면 명령창에 단순히 exit  작렬!!

 


 

 

fully distributed 모드 환경 설정

 

 

core-site.xml  //로그 파일, 네트워크 튜닝, I/O 튜닝 , 파일 시스템 튜닝, 압축 등의 하부 시스템을 설정한다.

 

[root@master hadoop-1.0.3]# cd conf 
[root@master conf]# vi core-site.xml 

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

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

 

mapred-site.xml  //맵 리듀스 작업시 각 worknode 로 분배 역할을 하는 서버 위치 설정,

 

[root@master conf]# vi mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

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

 

hdfs-site.xml  //hadoop file system 설정

 

[root@master conf]# vi hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>                        //데이터 복제 갯수 설정 보통 3으로 함
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>home/hadoop/work/name</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>home/hadoop/work/data</value>
        </property>
</configuration>

 

- dfs.name.dir : 네임노드에서 사용한다. 파일의 디렉토리 정보와 파일 정보등을 저장한다.
- dfs.data.dir : 데이터노드에서 데이터 파일이 저장. ',' 을 이용해 여러개 지정가능하다.

 

master 와 slave 의 구분을 위해 파일 수정

 

[root@master conf]# vi masters
master

[root@master conf]# vi slaves

master
hadoop1

 

여기 까지 한 환경설정 작업파일은 모두 클러스트에 분산된 slave 노드들에게 동일하게 복사 한다.


[root@master conf]# scp core-site.xml root@hadoop1:$HADOOP_INSTALL/conf
core-site.xml                                 100%  269     0.3KB/s   00:00
//이와 같이 hdfs-site.xml , mapred-site.xml , masters , slaves 파일 모두 모든 슬레이브 노드에 복사

 

Pully distributed Mode 실행

 

 

저장소를 사용하기 위해 HDFS 를 포맷

 


[root@master hadoop-1.0.3]# hadoop namenode -format
12/08/31 03:23:53 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/192.168.109.128
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.3
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1335192; compiled by 'hortonfo' on Tue May  8 20:31:25 UTC 2012
************************************************************/
Re-format filesystem in home/hadoop/work/name ? (Y or N) Y
12/08/31 03:23:55 INFO util.GSet: VM type       = 32-bit
12/08/31 03:23:55 INFO util.GSet: 2% max memory = 19.33375 MB
12/08/31 03:23:55 INFO util.GSet: capacity      = 2^22 = 4194304 entries
12/08/31 03:23:55 INFO util.GSet: recommended=4194304, actual=4194304
12/08/31 03:23:55 INFO namenode.FSNamesystem: fsOwner=root
12/08/31 03:23:55 INFO namenode.FSNamesystem: supergroup=supergroup
12/08/31 03:23:55 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/08/31 03:23:55 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/08/31 03:23:55 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/08/31 03:23:56 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/08/31 03:23:56 INFO common.Storage: Image file of size 110 saved in 0 seconds.
12/08/31 03:23:56 INFO common.Storage: Storage directory home/hadoop/work/name has been successfully formatted.
12/08/31 03:23:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.109.128
************************************************************/

 

하둡의 데몬들을 실행

 

[root@master hadoop-1.0.3]# start-all.sh
starting namenode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-namenode-master.out
hadoop1: starting datanode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-datanode-hadoop1.out
master: starting datanode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-datanode-master.out
master: starting secondarynamenode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-secondarynamenode-master.out
starting jobtracker, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-jobtracker-master.out
master: starting tasktracker, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-tasktracker-master.out
hadoop1: starting tasktracker, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-tasktracker-hadoop1.out

 

데몬들의 상태 확인 (본인은 하나의 마스터와 2개의 슬레이브로 구성했기 때문에 namenode 1 , secondary namenode 1, jobtracker 1, datanode 2, tasktracker 2개 가 떠야 한다.

 

[root@master hadoop-1.0.3]# jps  //마스터 상에서 돌아가는 데몬 ( 마스터의 역활과 슬레이브 역활을 하므로 datanode , tasktracker 도 생성)
1151 Jps
32641 DataNode
327 SecondaryNameNode
562 TaskTracker
417 JobTracker
32514 NameNode

 

[root@master hadoop-1.0.3]# ssh hadoop1 //클러스트 계정에서도 확인
Last login: Thu Aug 30 05:53:31 2012 from master
[root@hadoop1 ~]# jps
25562 DataNode
25357 TaskTracker
25702 Jps

 

여기까지 되면 일단락 완전분산모드 환경 성공!!! 휴...

만약 datanode 가 생성이 안되거나 특정 노드가 보이지 않는다면 !! log 에 저장된 ERROR 를 읽어서 해결해야 한다.



ERROR RESOLUTION

 


datanode 가 생성이 안될경우!!!!! 

슬레이브 계정으로 로그인하여 $HADOOP_INSTALL/logs 라는 디렉토리 확인! 각 노드 별로 log 파일이 존재 하므로 오류가 난 해당 노드의 log 파일을 확인하시면 된다 !!

 

 

ERROR case 1:

[root@hadoop1 logs]# cat hadoop-root-datanode-hadoop1.log   // DataNode 에대한 LOG 가 저장되어 있음

2012-08-30 05:53:04,059 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /tmp/hadoop-1.0.3/home/hadoop/work/data: namenode namespaceID = 908579614; datanode namespaceID = 1581120086

오류내용

dfs.name.dir 디렉토리와  dfs.data.dir 정보가 서로 불일치하여 master 장비의 datanode 부팅 실패함.

복구 방법
     dfs.data.dir 하위의 여러 파일 삭제
     dfs.name.dir 은 hadoop namenode -format 으로 초기화 한다.

 

ERROR case 2:

        

[root@master logs]# cat hadoop-root-secondarynamenode-master.log    //secondarynamenode 가 뜨질 않아 log 파일 확인

2012-08-31 16:20:26,903 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.109.128:9000. Already     tried 0 time(s).

2012-08-31 16:20:27,908 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.109.128:9000. Already tried 1 time(s).

2012-08-31 16:20:28,910 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.109.128:9000. Already tried 2 time(s).



오류내용

리눅스는 자체적으로 방화벽이 설치되어 있어 허용되지 않는 포트 번호로 접속이 시도 될때 접속이 되질 않는다. 지금은 9000번 포포트가 막혀있으므로 접속 오류

복구방법

        

[root@master logs]# vi /etc/sysconfig/iptables     // 방화벽 설정하는곳

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT      //해당 포트 번호를 허용한다.

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50030 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50040 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50060 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT

[root@master logs]# /etc/init.d/iptables restart

방화벽 규칙을 삭제하는 중:                                 [  OK  ]

chains를 ACCEPT 규칙으로 설정함: filter                    [  OK  ]

iptables 모듈을 제거하는 중:                               [  OK  ]


  //슬레이브 노드에서도 수정하여 준다.


[root@hadoop1 ~]# cat /etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50010 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50040 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50050 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50060 -j ACCEPT



이방법이 아니면 자체적으로 방화벽 설정을 해제하는 방법도 있다.

[root@master etc]# cd sysconfig
[root@master sysconfig]# service iptables stop
방화벽 규칙을 삭제하는 중:                                 [  OK  ]
chains를 ACCEPT 규칙으로 설정함: filter                    [  OK  ]
iptables 모듈을 제거하는 중:                               [  OK  ]




이외에도 다양한 오류들이 존재하는데 그럴때마다 log 파일을 확인하여 정확한 오류내용을 찾는것이 현명한 방법이다. 
log 파일을 몰랐을때에는 hadoop 만 다시 깔기를 10번 이상 한것 같습니다. ㅠㅠ 
log 파일에서 정확한 오류 내용을 확인한후 구글에 검색하면 왠만한 오류수정 내용은 나오는것 같습니다 ^^ 하지만 영어번역이 필수 겠지요 ㅎㅎ


저작자 표시
신고




하둡을 이용한 첫 번째 예제 프로그램



하둡에서는 MapRudece 를 이용한 예제로 단어의 겟수를 세는 셈플 예제 소스가 들어있다. wordcount java 프로그램은 txt 파일을 입력으로 받고 결과로는 단어의 겟수를 저장한 파일을 저장한다.


아무런 인수 없이 그냥 wordcount 예제를 실행시켜 본다.


[root@master hadoop-1.0.3]# hadoop jar hadoop-examples-1.0.3.jar wordcount

Usage: wordcount <in> <out>


인수를 지정하라고 메세지가 뜬다. 이제 입력으로 사용할 txt 파일을 하나 만든다.

[root@master hadoop-1.0.3]# cat input  // "hello" 단어가 4개 들어있는 input 파일 생성
hello
hello
hello
hello


[root@master hadoop-1.0.3]# hadoop jar hadoop-examples-1.0.3.jar wordcount input output
12/08/31 00:53:39 INFO util.NativeCodeLoader: Loaded the native-hadoop library // 이러한 메세지들이 쭈욱 뜨면서 실행된다.
12/08/31 00:53:39 INFO input.FileInputFormat: Total input paths to process : 1
12/08/31 00:53:39 WARN snappy.LoadSnappy: Snapnative library not loaded
12/08/31 00:53:39 INFO mapred.JobClient: Running job: job_local_0001
12/08/31 00:53:39 INFO util.ProcessTree: setsid exited with exit code 0

실행이 완료되면 output 디렉토리에 있는 결과파일을 출력해보자!!


[root@master hadoop-1.0.3]# cat output/*

hello   4        // 완료



 hadoop 에서는 독립실행모드 (Standalone) , 가상분산모드 (Pseudo-distributed) , 완전분산모드 (Fully distributed) 이렇게 3가지 모드가 존재한다.


현재 wordcount 예제까지 따라 하셨다면 독립실행모드는 끝난것이다. 독립실행모드는 단일로컬머신에서만 실행되는 환경을 말한다.

따라서 다른 분산된 컴퓨터와 서로 주고 받는 부가 작업이 필요 없으며 이 모드의 목적은 독립적으로 MapReduce 프로그램의 로직을 개발하고 디버깅 하는데 있다.


다음 포스팅 부터는 가상분산모드를 뛰어넘고 완전분산모드로 실행할게요 ^^

완전분산모드가 실제적으로  hadoop 이 동작하는 기능을 모두 갖추고 있기 때문에 가상분산모드는 따로 하지 않아도 된다고 생각함 ^^;;



저작자 표시
신고

PREPARATION OF OS ENVIRONMENTS

 

 

hadoop 의 공식적인 개발환경은 linux 이다. linux를 모르기 때문에 hadoop 에 접근하기가 너무 어려웠음....ㅜ

linnux 설치하기 위해 가상머신을 다운 받았고 가상머신으로 linux 설치

 

 

가상머신 - VMware 7.0 을 설치  

download - http://utilpam.com/bbs/download_p.php?bo_table=pds06&wr_id=496&pshow=kp1/

linux - CentOS-5.8-i386 을 설치      

download - http://ftp.daum.net/centos/5.8/isos/i386/

CD 2장 짜리로 다운!!

 

 

VMware 설정 부분과 CentOS 설치 부분은 다른 blog를 이용해 주세요 ^^;


CentOS 설치 완료하였으면 여기서 부터 CentOS 상에서 모든 작업 시행


jdk 와 hadoop 다운로드

 

 

저는 java 파일과 hadoop 파일 모두 컴퓨터/파일시스템/tmp 폴더 안에 다운 받고 압축을 풀었습니다.

 메뉴얼에는  /usr/local 에 위치하는 것을 권장!! 



여기까지 hadoop 실행을 하기전까지 준비 완료!!

 



CentOS 환경 설정

 


이젠 CentOS 환경 변수 설정!  참고로 계정은 root 로 사용하였습니다 ^^

메뉴얼에는 루트 말고 사용자 계정을 추가하여 사용하는것 을 권장 !! (linux 초보자로써 폴더 접근권한 등 설정이 아직 어려줘 root로 하였음 ㅠㅠ)


java 와 hadoop 사용하기 위해 path 설정

[root@master ~]# vi .bashrc    // .bashrc 파일을 편집기로 열어 편집

// JAVA_HOME 과 HADOOP_INSTALL 을 추가한다.

export JAVA_HOME=/tmp/jdk1.7.0_06

export HADOOP_INSTALL=/tmp/hadoop-1.0.3

// PATH에 각 bin디렉토리를 추가한다.

export PATH=$PATH:$HADOOP_INSTALL/bin:$JAVA_HOME/bin:$PATH


[root@master ~]# source .bashrc    //설정 바꾼후 re컴파일


path 설정후 올바르게 인식되는지 javac 와 javac version을 확인!!

[root@master ~]# java -version

java version "1.7.0_06"  // 다운 받은 jdk 버전 올바르게 인식

Java(TM) SE Runtime Environment (build 1.7.0_06-b24)

Java HotSpot(TM) Client VM (build 23.2-b09, mixed mode)

[root@master ~]# javac -version

javac 1.7.0_06     //  컴파일러도 올바르게 인식



만약 올바르게 버전이 인식이 안된다면 alternatives --config 로 현재 리눅스가 가리키는 jdk 경로를 확인한다.
[root@master ~]# alternatives --config java
3 개의 프로그램이 'java'를 제공합니다.
  선택    명령                                                 // tmp폴더안에 다운받은 jdk 버전이 추가되어 있지 않다.
-----------------------------------------------
*  +1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java    
     2           /usr/lib/jvm/jre-1.4.2-gcj/bin/java
현재 선택[+]을 유지하시려면 엔터키를 누르십시오. 그렇지 않으면,  선택 번호를 입력해 주십시오: 1

// 환경설정에 jdk 추가
[root@master ~]# alternatives --install  /usr/bin/java  java  /tmp/jdk1.7.0_06/bin/java  3
[root@master ~]# alternatives --config  java
3 개의 프로그램이 'java'를 제공합니다.
  선택    명령                                                // tmp폴더안에 다운받은 jdk 버전이 추가 되었다.
-----------------------------------------------
*  1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
   2           /usr/lib/jvm/jre-1.4.2-gcj/bin/java
 + 3           /tmp/jdk1.7.0_06/bin/java
현재 선택[+]을 유지하시려면 엔터키를 누르십시오. 그렇지 않으면,  선택 번호를 입력해 주십시오: 3  // 3번 선택



만약 javac 버전에도 이상이 있다면 위와 동일하게 "alternatives --config javac" 으로 확인해보고 추가하면 된다.


이번엔 hadoop version 확인!!


[root@master ~]# hadoop version

Hadoop 1.0.3        // hadoop 1.0.3 올바르게 인식

Subversion https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1335192

Compiled by hortonfo on Tue May  8 20:31:25 UTC 2012

From source with checksum e6b0c1e23dcf76907c5fecb4b832f3be



여기까지 완료되면 hadoop 실행을 위한 준비가 완료되었다 생각합니다 ^^

다음엔 hadoop sample 예제 중에 wordcount 예제 실행 을 포스팅 할게요 ^^

 

저작자 표시
신고



ps. programming begginer 로써 초급자에 관점에서 앞으로 hadoop 포스팅 해볼 생각입니다^^

 

 

What is Hadoop?

 

 

대용량 데이터를 처리하는 분산 응용 프로그램을 작성하고 실행시키기 위한 오픈 소스 프레임워크(framework)이다.

 

 

- Hadoop simbol - 

 

 

Appearance of Hadoop

 

 

 

오늘날, 고용량의 멀티미디어 데이터 와 페이스북같은 SNS 의 등장으로 인해 데이터는 폭발적으로 으로 증가하고 있고 Big Data, Cloud 등과 같은 대용량의 데이터를 사용하고 관리하는 기술들이 개발되어 지고 있다. 이렇게 방대하게 커져버린 데이터를 현존하는 방식으로 처리하기란 많은 무리가 있다.

 

이런 문제점을 해결하기 위해 구글에서 먼저 MadpReduce를 공개 했는데, Mapreduce는 구굴의 데이터 처리량을 확장하기 위해 사용되는 시스템이다. Doug Cutting은 구글에서 발표한 MapReduce의 논문을 바탕으로 '하둡(Hadoop)'이라는MadpReduce의 오픈 소스 버전을 개발하게 되었고 야후와 다른 기업들의 동참으로 오늘날 하둡은 야후, 페이스북, 링크드인, 트위터와 같은 웹 기반의 회사에서 연산처리를 위한 인프라의 핵심 부분으로 사용되고 있다.

 

 

 

*MapReduce : 다수의 컴퓨터에서 데이터를 분산처리하여, 그 결과를 추려내는 데이터 프로세싱 기법

 

Advantage of Hadoop

 

 


초당 100MB 를 처리할수 있는 값비싼 컴퓨터 한대가 4TB의 데이터를 처리한다고 하였을때 대략 세 시간 정도가 소요된다. 하지만 하둡은 4TB의 데이터를 분산된 여러 컴퓨터가 병렬로 나누어서 동시에 처리하기 때문에 훨씬 빠른 속도로 데이터를 처리 할수 있다. 또 이런한 값싼 범융 컴퓨터들로 이루어진 클러스트를 구축하는것이 비용면에서 성능 좋은 컴퓨터보다 저렴하다.

 

클라이언트는 연산할 데이터를 보내는 대신 연산할 식(MapReduce)을 데이타가 존재 하는 클러스트에 보내는 방식이다. 클라이언트에서 보내는 MapReduce프로그램은 크기가 KB 단위로 매우 작기 때문에 전송이 빠르다. 처리될 데이타는 클러스트에 저장되어 있고 하둡클러스는 클라이언트에서 보낸 작은 코드를 읽어 데이터 연산을 처리한다. 



저작자 표시
신고

티스토리 툴바