하둡은 역시 삽질해야 제맛인듯 하다.
wordcount 예제를 실행햐려고 했는데 jar 파일을 도저히 찾을 수가 없었다.
$ find / -name hadoop-examples-2.8.1.jar 2>/dev/null
$
...
그래서 열심히 구글링을 했는데 뭐가 설치가 안된거다, 설정이 잘못된거다, 등등 해서 하라는대로 다 했더니 설정파일 꼬여서 작동이 안되는거다.
수습불가 상태에 이르러 재설치를 하기를 두번... ㅂㄷㅂㄷ
그런데 갑자기 이런 방법이 생각났다.
$ cd $HADOOP_HOME $ find ./ -name *.jar 2>/dev/null ./share/hadoop/hdfs/sources/hadoop-hdfs-native-client-2.8.1-sources.jar ./share/hadoop/hdfs/sources/hadoop-hdfs-client-2.8.1-sources.jar ./share/hadoop/hdfs/sources/hadoop-hdfs-client-2.8.1-test-sources.jar ./share/hadoop/hdfs/sources/hadoop-hdfs-native-client-2.8.1-test-sources.jar ./share/hadoop/hdfs/sources/hadoop-hdfs-2.8.1-sources.jar ./share/hadoop/hdfs/sources/hadoop-hdfs-2.8.1-test-sources.jar ./share/hadoop/hdfs/hadoop-hdfs-client-2.8.1.jar ./share/hadoop/hdfs/hadoop-hdfs-2.8.1.jar ./share/hadoop/hdfs/hadoop-hdfs-client-2.8.1-tests.jar (...) ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/log4j-1.2.17.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/activation-1.1.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/xmlenc-0.52.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/netty-3.6.2.Final.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/commons-beanutils-core-1.8.0.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/jackson-xc-1.9.13.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/commons-digester-1.8.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/commons-beanutils-1.7.0.jar ./share/hadoop/kms/tomcat/webapps/kms/WEB-INF/lib/jcip-annotations-1.0.jar $
이중에 찾으면 있을까 싶은 마음이 생겼다. 그런데 하나하나 보기에는 너무 많아서 한번 더 걸러보았다.
$ find ./ -name *examples*.jar 2>/dev/null
./share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.8.1-test-sources.jar
./share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.8.1-sources.jar
./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar
$
혹시 맨 아래 꺼인가? 하고 wordcount 예제를 실행해보았다.
$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar wordcount
Usage: wordcount <in> [<in>...] <out>
$
이거다! 그동안 참고했던 포스팅들을 보고 jar파일 이름을 거기에 나온대로만 찾았었는데 버전이 바뀌면서 jar파일 이름도 바뀌었었나보다...ㅠ
wordcount 예제를 이제 본격적으로 실행해본다. wordcount 예제는 이름 그대로 텍스트파일의 글자수를 세어주는 프로그램인데 하둡에서의 Hello, World! 예제 정도로 생각하면 된다.
먼저 글자수를 셀 대상파일이 필요하다. 여기서는 오바마 연설문 파일을 사용한다.
여기서 텍스트파일 입력을 할 디렉토리를 생성해야 한다.
하둡내에는 고유의 파일시스템을 가지고 있는데 그곳에 디렉토리를 생성하여야 한다. 그냥 쉘에서 mkdir 하면 안된다.
좀 더 정확히는 하둡 1버전은 하둡과 리눅스간 파일시스템에 상호 구분 없었으나 2버전부터 분리된 듯 하다.
아직도 1버전 기준으로 쓰여진 포스팅이 인터넷 상에 많아서 혼란스러울 수 있으니 주의가 필요하다.
$ hadoop fs -ls /
$ hadoop fs -mkdir /input
$ hadoop fs -put ./obama.txt /input
$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar wordcount /input/obama.txt /output
17/09/28 16:40:37 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.110.1:8040
17/09/28 16:40:38 INFO input.FileInputFormat: Total input files to process : 1
17/09/28 16:40:38 INFO mapreduce.JobSubmitter: number of splits:1
17/09/28 16:40:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1506580183921_0001
17/09/28 16:40:39 INFO impl.YarnClientImpl: Submitted application application_1506580183921_0001
17/09/28 16:40:39 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1506580183921_0001/
17/09/28 16:40:39 INFO mapreduce.Job: Running job: job_1506580183921_0001
17/09/28 16:40:52 INFO mapreduce.Job: Job job_1506580183921_0001 running in uber mode : false
17/09/28 16:40:52 INFO mapreduce.Job: map 0% reduce 0%
17/09/28 16:41:01 INFO mapreduce.Job: map 100% reduce 0%
17/09/28 16:41:10 INFO mapreduce.Job: map 100% reduce 100%
17/09/28 16:41:11 INFO mapreduce.Job: Job job_1506580183921_0001 completed successfully
17/09/28 16:41:11 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=13642
FILE: Number of bytes written=299913
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=13510
HDFS: Number of bytes written=9549
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=7017
Total time spent by all reduces in occupied slots (ms)=5368
Total time spent by all map tasks (ms)=7017
Total time spent by all reduce tasks (ms)=5368
Total vcore-milliseconds taken by all map tasks=7017
Total vcore-milliseconds taken by all reduce tasks=5368
Total megabyte-milliseconds taken by all map tasks=7185408
Total megabyte-milliseconds taken by all reduce tasks=5496832
Map-Reduce Framework
Map input records=69
Map output records=2413
Map output bytes=23030
Map output materialized bytes=13642
Input split bytes=99
Combine input records=2413
Combine output records=1030
Reduce input groups=1030
Reduce shuffle bytes=13642
Reduce input records=1030
Reduce output records=1030
Spilled Records=2060
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=183
CPU time spent (ms)=1550
Physical memory (bytes) snapshot=315613184
Virtual memory (bytes) snapshot=3862253568
Total committed heap usage (bytes)=139718656
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=13411
File Output Format Counters
Bytes Written=9549
$
위와같이 실행결과가 잘 뜬다면 실행이 잘 된 것이다.
wordcount의 output파일은 당연히 각 단어가 파일에서 몇번 등장하였는지 보여주는 파일일 것이다.
그런데 앞에서도 이야기했지만 하둡 고유의 파일시스템에 저장을 하였으므로 리눅스의 디렉토리에서는 아무리 ls, find해봤자 output파일을 찾을 수 없다. (실제로 해본 1인)
$ hadoop fs -ls /output/
Found 2 items
-rw-r--r-- 3 witlab supergroup 0 2017-09-28 16:41 /output/_SUCCESS
-rw-r--r-- 3 witlab supergroup 9549 2017-09-28 16:41 /output/part-r-00000
fs는 filesystem의 약자이고, -ls의 ls는 리눅스의 ls와 같다. 즉 하둡 파일시스템에서 ls 명령을 한 것이다.
저기 밑에 있는 파일을 열어보자.
$ hadoop fs -cat /output/part-r-00000
"Let 1
- 23
Afghanistan. 1
All 1
America 5
America's 2
America. 3
American 1
American, 1
Americans 2
Americans. 1
And 6
Arlington 1
As 2
At 2
Bush 1
But 3
Christians 1
Concord 1
Domestic 1
Earth. 1
Earth; 1
Fathers, 1
For 8
(...)
world...that 1
worldly 1
worn 1
would 1
wrong 1
year 1
year. 1
years 1
yes, 1
yet, 1
you 12
you. 2
young 1
your 3
$
위와같이 결과를 확인할 수 있다.
오늘의 삽질 끝!
'Cloud, Bigdata, AI > Big Data Analysis' 카테고리의 다른 글
[PySpark] PyCharm에서 PySpark 연동하여 사용하기 (2) | 2019.03.29 |
---|---|
[HBase] HBase의 HMaster가 작동 안될 때 (0) | 2018.10.16 |
[Bigdata] Hadoop, Spark, Zeppelin 연동 시스템 구축 (15) | 2018.10.15 |
[Hadoop] 하둡 설치 삽질기 (1) | 2017.09.21 |