04. 하둡 예제 실행 및 코딩해보기!
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 -