BigDATA/Hadoop

04. 하둡 예제 실행 및 코딩해보기!

태하팍 2014. 9. 15. 14:56
반응형


1. 예제 실행


저번 시간에는 2014/09/11 - [BigDATA/Hadoop] - 부록. 하둡 설치  을 해보았습니다.


우선! 하둡에서 제공되어지는 예제코드와 예제 코드를 패키징한 jar를 수행 해보겠습니다.


1) 예제를 실행하기 전에 우선 다음과 같이 hadoop-env.sh 파일을 HDFS에 업로드 합니다.

    그냥 따라해봅시다~

  dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env.sh


fs 명령어를 아직은 잘은 모르지만 한번 해봅시다~

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -lsr conf/ 

-rw-r--r--   3 dakao supergroup       2540 2014-09-07 17:23 /user/dakao/conf/hadoop-env.sh


2) 파일이 업로드 되면 다음과 같이 하둡 명령어를 이용해 jar 파일을 실행합니다.

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$

./bin/hadoop jar hadoop-examples-*.jar wordcount conf/hadoop-env.sh wordcount_output

위의 명령어는 하둡명령어를 통해 jar를 수행한 것이고, hadoop-examples-*.jar파일에 있는 wordcount class를 실행하는데, 입력값은 

conf/hadoop-env.sh 파일을, 출력값은 output 디렉토리를 사용하겠다는 의미 입니다.

14/09/07 17:50:15 INFO input.FileInputFormat: Total input paths to process : 1

14/09/07 17:50:15 INFO util.NativeCodeLoader: Loaded the native-hadoop library

14/09/07 17:50:15 WARN snappy.LoadSnappy: Snappy native library not loaded

14/09/07 17:50:16 INFO mapred.JobClient: Running job: job_201409071442_0001

14/09/07 17:50:17 INFO mapred.JobClient:  map 0% reduce 0%

14/09/07 17:50:23 INFO mapred.JobClient:  map 100% reduce 0%

14/09/07 17:50:32 INFO mapred.JobClient:  map 100% reduce 100%

14/09/07 17:50:34 INFO mapred.JobClient: Job complete: job_201409071442_0001

14/09/07 17:50:34 INFO mapred.JobClient: Counters: 29

14/09/07 17:50:34 INFO mapred.JobClient:   Job Counters 

14/09/07 17:50:34 INFO mapred.JobClient:     Launched reduce tasks=1

14/09/07 17:50:34 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=6145

14/09/07 17:50:34 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0

14/09/07 17:50:34 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0

14/09/07 17:50:34 INFO mapred.JobClient:     Launched map tasks=1

14/09/07 17:50:34 INFO mapred.JobClient:     Data-local map tasks=1

14/09/07 17:50:34 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=9190

14/09/07 17:50:34 INFO mapred.JobClient:   File Output Format Counters 

14/09/07 17:50:34 INFO mapred.JobClient:     Bytes Written=2283

14/09/07 17:50:34 INFO mapred.JobClient:   FileSystemCounters

14/09/07 17:50:34 INFO mapred.JobClient:     FILE_BYTES_READ=2983

14/09/07 17:50:34 INFO mapred.JobClient:     HDFS_BYTES_READ=2665

14/09/07 17:50:34 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=124429

14/09/07 17:50:34 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=2283

14/09/07 17:50:34 INFO mapred.JobClient:   File Input Format Counters 

14/09/07 17:50:34 INFO mapred.JobClient:     Bytes Read=2540

14/09/07 17:50:34 INFO mapred.JobClient:   Map-Reduce Framework

14/09/07 17:50:34 INFO mapred.JobClient:     Map output materialized bytes=2983

14/09/07 17:50:34 INFO mapred.JobClient:     Map input records=61

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce shuffle bytes=2983

14/09/07 17:50:34 INFO mapred.JobClient:     Spilled Records=348

14/09/07 17:50:34 INFO mapred.JobClient:     Map output bytes=3719

14/09/07 17:50:34 INFO mapred.JobClient:     Total committed heap usage (bytes)=176033792

14/09/07 17:50:34 INFO mapred.JobClient:     CPU time spent (ms)=1180

14/09/07 17:50:34 INFO mapred.JobClient:     Combine input records=305

14/09/07 17:50:34 INFO mapred.JobClient:     SPLIT_RAW_BYTES=125

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce input records=174

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce input groups=174

14/09/07 17:50:34 INFO mapred.JobClient:     Combine output records=174

14/09/07 17:50:34 INFO mapred.JobClient:     Physical memory (bytes) snapshot=245370880

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce output records=174

14/09/07 17:50:34 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1276059648

14/09/07 17:50:34 INFO mapred.JobClient:     Map output records=305 

    

3) 이제 wordcount를 실행한 출력값이 정상적으로 생성됐는지 확인해보겠습니다. 

    fs 명령어의 cat 파라미터를 사용해서 HDFS에 저장된 출력값을 확인해보겠습니다.

우선은 fs -lsr로 어떤 파일들이 있는지 확인 해보겠습니다.(namenode이나 datanode 아무곳에서나 확인 가능!)


dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -lsr wordcount_output/

-rw-r--r--   3 dakao supergroup          0 2014-09-07 17:50 /user/dakao/wordcount_output/_SUCCESS

drwxr-xr-x   - dakao supergroup          0 2014-09-07 17:50 /user/dakao/wordcount_output/_logs

drwxr-xr-x   - dakao supergroup          0 2014-09-07 17:50 /user/dakao/wordcount_output/_logs/history

-rw-r--r--   3 dakao supergroup      13774 2014-09-07 17:50 /user/dakao/wordcount_output/_logs/history/job_201409071442_0001_1410137416094_dakao_word+count

-rw-r--r--   3 dakao supergroup      51778 2014-09-07 17:50 /user/dakao/wordcount_output/_logs/history/job_201409071442_0001_conf.xml

-rw-r--r--   3 dakao supergroup       2283 2014-09-07 17:50 /user/dakao/wordcount_output/part-r-00000 


    

- Result

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -cat wordcount_output/part-r-00000

# 39

$HADOOP_BALANCER_OPTS" 1

$HADOOP_DATANODE_OPTS" 1

$HADOOP_HOME/conf/slaves 1

$HADOOP_HOME/logs 1

$HADOOP_JOBTRACKER_OPTS" 1

$HADOOP_NAMENODE_OPTS" 1

$HADOOP_SECONDARYNAMENODE_OPTS" 1

$USER 1

'man 1

(fs, 1

-o 1

/tmp 1

1000. 1

A 1

All 1

CLASSPATH 1

Command 1

ConnectTimeout=1 1

Default 1

Empty 2

Extra 3

File 1

HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_CLASSPATH= 1

HADOOP_CLIENT_OPTS 1

HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_HEAPSIZE=2000 1

HADOOP_HOME_WARN_SUPPRESS="TRUE" 1

HADOOP_IDENT_STRING=$USER 1

HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_LOG_DIR=${HADOOP_HOME}/logs 1

HADOOP_MASTER=master:/home/$USER/src/hadoop 1

HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_NICENESS=10 1

HADOOP_OPTS 1

HADOOP_OPTS=-server 1

HADOOP_PID_DIR=/var/hadoop/pids 1

HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves 1

HADOOP_SLAVE_SLEEP=0.1 1

HADOOP_SSH_OPTS="-o 1

HADOOP_TASKTRACKER_OPTS= 1

Hadoop-specific 1

JAVA_HOME 1

JAVA_HOME. 1

JAVA_HOME=/home/hadoop/hadoop/jdk1.7.0_67 1

JAVA_HOME=/usr/lib/j2sdk1.5-sun 1

Java 2

MB. 1

NOTE: 1

Optional. 1

Otherwise 1

Required. 1

Seconds 1

See 1

SendEnv=HADOOP_CONF_DIR" 1

Set 1

The 6

This 1

Unset 2

When 1

Where 1

a 3

ace-t 1

amount 1

appended 1

applies 1

are 4

arrive 1

attack. 1

be 4

best 1

between 1

by 9

can 4

clusters, 1

code 1

commands 1

commands. 1

configuration 1

correctly 1

daemon 1

daemons. 1

default. 8

defined 1

dfs, 1

directory 2

distcp 1

distributed 1

e.g., 1

elements. 1

environment 2

etc) 1

export 21

faster 1

file, 1

files 2

following 1

for 2

from. 1

fsck, 1

going 1

hadoop 2

hadoop. 1

heap 1

here. 1

host:path 1

hosts. 1

implementation 1

in 3

instance 1

is 5

it 2

java 1

large 1

log 1

master 1

maximum 1

modify 1

multiple 1

naming 1

nice'. 1

nodes. 1

of 2

on 1

only 2

optional. 1

options 1

options. 2

others 1

otherwise 1

pid 1

potential 1

priority 1

processes. 1

remote 2

representing 1

required 1

rsync'd 1

rsyncs 1

run 1

running 1

runtime 1

scheduling 1

service 1

set 2

should 2

slave 3

sleep 1

so 1

specific 1

specified 1

ssh 1

stored. 2

string 1

symlink 1

than 1

that 3

the 4

them. 1

there 1

this 3

to 9

use, 1

use. 1

useful 1

users 1

variable 1

variables 1

when 1

where 2

where, 1

written 1 

잘 이해가 가지 않더라도 그냥 이런식으로 되어지는구나..라고만 느끼자! 필 충만! 


2. 개발 환경 구성

여기에서는 이클립스와 JDK1.7을 셋팅 해보겠습니다.

  1) eclipse download - 클릭!

  2) JDK download - 클릭!     


참고 : 2014/07/02 - [Language/Java] - Mac에서 Jdk8 설치 되는 장소!


우선 /Users/AceT/app/hadoop 이라는 디렉토리에 ide 디렉토리와 java 디렉토리를 만들었습니다.

AceTui-MacBook-Pro:hadoop AceT$ pwd

/Users/AceT/app/hadoop

AceTui-MacBook-Pro:hadoop AceT$ ls

ide java 



jdk 심볼릭 링크 걸기!(java디렉토리에서)

 ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home hadoop_java1.7


잘걸어져있나 확인!

ls -alr

total 8

lrwxr-xr-x  1 AceT  staff   63  9 15 16:16 hadoop_java1.7 -> /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home

drwxr-xr-x  5 AceT  staff  170  9 15 15:21 ..

drwxr-xr-x  3 AceT  staff  102  9 15 16:16 .


심볼릭 링크 삭제는 rm 명령어를 통해 삭제하면 된다.

ex) rm (심볼릭 링크이름)

     rm hadoop_java1.7


이클립스를 기동 시킨 뒤  환경설정에서 Java쪽을 1.7로 바꿔준다. 디폴트로 1.8로 되어있었음! 

(기존에 1.6, 1.8이 셋팅되어있었기 때문에..이클립스가 그냥 기동되었던것 같다. jdk가 기존에 셋팅이 되어있지 않으신 분들은 셋팅을 해야 합니다. 즉, 터미널에서 java -version 쳤을 때 뭔가 나와야 한다는 것이다.) 


[이클립스 기동]




[환경 설정]

 - Eclipse > 환경설정...


- Java 버전 수정!

  -- Compiler

 

  -- JRE


이제는 maven 프로젝트를 하나 만듭니다.



simple하고 프로젝트를 만들어봅니다.


아래와 같이 hadoop-map-reduce라는 메이븐 프로젝트가 만들어졌습니다.(reduce인데..오타났네요 ㅠ)



자! 이제 대망의 맵리듀스 코딩을 해보겠습니다.

참고자료는 현재 사내스터디 책인 "하둡완벽가이드 개정3판" 으로 하겠습니다.^-^


코딩을 하기전에 input data가 필요 합니다. 그래서 기상 데이터를 분석해보도록 하겠습니다.

사용할 데이터는 국립기후자료센터(NCDC) 입니다. 


책의 부록을 보면 http://hadoopbook.com/code.html 의 사이트를 소개 합니다.

가보면 github 주소를 알려줍니다.goooood~^0^ 

input data : https://github.com/tomwhite/hadoop-book/tree/master/input/ncdc

                         sample.txt를 다운 받으신 뒤 하둡서버에 올려주시면 되겠습니다~

또한 hadoop 명령어 fs -put을 통해서 hdfs에 put을 해놓습니다.

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ 

hadoop fs -put input/ncdc/sample.txt input/ncdc/sample.txt


소스 : https://github.com/tomwhite/hadoop-book/tree/master/ch02/src/main/java


이제 이클리스를 기동하시고! 차례대로 따라하시면 됩니다.

1) 이클립스 기동!

2) pom.xml hadoop-core 추가! dependency는 메이븐레파지토리 사이트에서 원하는 jar에 맞게 가져오시면 됩니다.

<dependencies>  

   <dependency>

      <groupId>org.apache.hadoop</groupId>

      <artifactId>hadoop-core</artifactId>

      <version>1.2.1</version>

   </dependency>

</dependencies> 


3) 코딩! 3부분 코딩- Map / Reduce / main




4) jar로 묶기

  4-1) Export 하기


  4-2) jar 만들기 - Java > JAR file 선택



  4-3) jar file명 넣기 - hadoop-acet-example.jar



  4-5) Main class 지정 - 이 설정 때문인지..삽질 좀 했네요 ㅠㅠ 



5) 만들어진 jar를 하둡이 셋팅 된 서버에 옮겨놓습니다.



6) 실행 합니다!

   $hadoop jar hadoop-acet-example.jar input/ncdc/sample.txt output


중요! 아래와 같이 MaxTemperature라는 메인 클래스를 넣었을 때는..동작하지 않았었습니다..

 - 실행 - hadoop jar hadoop-acet-example.jar MaxTemperature input/ncdc/sample.txt output

 - 동작 X - $ hadoop jar hadoop-acet-example.jar MaxTemperature input/ncdc/sample.txt output

                    Usage: MaxTemperature <input path> <output path> 



7) 결과


8) file 확인 - hadoop fs -lsr output


9) file 내용 확인 - hadoop fs -cat /user/dakao/output/part-r-00000


맵-리듀스의 실행동작을 알아보았습니다. 대충 감이 오네요 후후~

하지만 더 중요한 것은!!! 맵과 리듀스의 코드겠죵?! 더더더 중요한 것은 하둡의 핵심인 HDFS와 MapReduce의 아키텍처입죠!

차근차근 이해하면서 제대로 알아가봐야겠네요^0^

그럼 오늘은 여기까쥐~!! 


참고 

1) http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html#Inputs+and+Outputs

2) https://github.com/rgan/hadoop-mapreduce-example

3) https://github.com/tomwhite/hadoop-book/tree/master/input/ncdc

4) 하둡 완벽가이드 개정3판


      - END -

반응형