이번 포스팅에서는 이전 포트팅에서 구성한 하둡 클러스터에 wikipedia 덤프를 받아서 WordCount를 해보도록 하겠다.
(이전 포스트)
1) hadoop 2.0 (YARN) 개요 & Hyper-V를 이용한 실험환경 구성 #1
2) hadoop 2.0 (YARN) 개요 & Hyper-V를 이용한 실험환경 구성 #2
1. Wikipedia Dump 다운로드
이전 포스팅에서 각 노드는 20GB HDD를 VM에 연결하였는데, WikiPedia 덤프를 다운로드하기에는 적은 용량이다. 따라서 Hyper-V 관리자에서 yarn_nn VM의 설정을 클릭하고 IDE 탭에서 하드 드라이브를 선택하고 100GB 정도의 새로운 HDD를 생성해서 연결해 준다. 그러면 yarn_nn에는 /dev/sdb 에 100GB HDD가 연결된다. Root 권한으로 다음과 같이 partition을 생성해 준다.
그리고 mkfs.ext4 /dev/sdb 로 포맷을 해준다. 그리고 mkdir /data 로 마운트할 디렉토리를 생성하고, mount -t ext4 /dev/sdb /data로 마운트 해준다. 그리고 hadoop 계정이 접근할수 있도록 권한 설정을 해준다. chown -R hadoop /data
그리고 다음과 같이 wikipedia를 다운로드 한다.
wget https://dumps.wikimedia.org/enwiki/20160501/enwiki-20160501-pages-articles-multistream.xml.bz2
압축을 풀면 57G 정도 나오는데, 현재 구성된 cluster로는 수용이 불가능하다. hdfs-site.xml에서 replication 설정을 1로 하고, 다음과 같이 이 파일을 쪼겐다. split enwiki-20160501-pages-articles-multistream.xml -b 5G
xaa 부터 파일이 생성되는데, xaa를 다음과 같이 HDFS로 옮긴다. hdfs dfs -copyFromLocal xaa /input
hdfs dfsadmin -report 하게 되면 전체 5G정도, 개별 노드에서는 1.3G 정도 할당 된다. 다음은 hdfs dfs -du -h 로 점유된 용량을 볼 수 있다.
hadoop@nn:~$ hdfs dfs -df -h
Filesystem Size Used Available Use%
hdfs://nn:9000 78.2 G 5.0 G 59.2 G 6%
Next를 누르고 "Create a simple project"를 체크한 다음 [Next] 버튼을 누른다. GroupId와 ArtifactId를 설정하고 Finish 한다.
Package Explorer에서 pom.xml을 클릭하고 다음과 같이 pom.xml에 dependencies를 설정한다.
src/main 에서 오른쪽 버튼을 클릭하고 New>Class 에서 다음과 같이 프로젝트를 생성한다.
소스 코드에 다음의 코드를 입력하고 Build 한다.
import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static class WCMapper extends Mapper<LongWritable,Text,Text,LongWritable>{ private final static LongWritable one=new LongWritable(1); private Text word=new Text(); public void map(LongWritable key, Text value, Context context) throws IOException,InterruptedException{ StringTokenizer itr=new StringTokenizer(value.toString()); while(itr.hasMoreTokens()){ word.set(itr.nextToken().toLowerCase()); context.write(word, one); } } } public static class WCReducer extends Reducer<Text, LongWritable,Text,LongWritable>{ private LongWritable sum=new LongWritable(); public void reduce(Text key,Iterable<LongWritable> values,Context context) throws IOException, InterruptedException{ long sumNumber=0; for(LongWritable val:values){ sumNumber+=val.get(); } sum.set(sumNumber); context.write(key, sum); } } public static void main(String[] args) { // TODO Auto-generated method stub Configuration conf=new Configuration(); try { Job job=Job.getInstance(); job.setJarByClass(WordCount.class); job.setMapperClass(WCMapper.class); job.setReducerClass(WCReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true)?0:1); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.exit(-1); } } |
eclipse에서 Run>Run As>Maven Instll 하게 되면 Package Explorer에서 target 폴더에 WordCount-0.0.1-SNAPSHOT.jar 가 생성된 것을 볼 수 있다. 이 파일을 하둡 네임노드의 홈 폴더에 옮겨놓는다.
<property> <name>mapreduce.map.output.compress</name> <value>true</value> </property> <property> <name>mapreduce.map.outputcompress.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> </property> |
WordCount-0.0.1-SNAPSHOT.jar 프로그램이 있는 경로에서 다음의 명령을 입력한다.
hadoop@nn:~$ hadoop jar WordCount-0.0.1-SNAPSHOT.jar WordCount /input /output 16/06/01 23:06:53 INFO client.RMProxy: Connecting to ResourceManager at nn/192.168.1.10:8050 16/06/01 23:06:53 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 16/06/01 23:06:53 INFO input.FileInputFormat: Total input paths to process : 1 16/06/01 23:06:53 INFO mapreduce.JobSubmitter: number of splits:40 16/06/01 23:06:54 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1464789852045_0001 16/06/01 23:06:54 INFO impl.YarnClientImpl: Submitted application application_1464789852045_0001 16/06/01 23:06:54 INFO mapreduce.Job: The url to track the job: http://nn:8088/proxy/application_1464789852045_0001/ 16/06/01 23:06:54 INFO mapreduce.Job: Running job: job_1464789852045_0001 16/06/01 23:07:00 INFO mapreduce.Job: Job job_1464789852045_0001 running in uber mode : false 16/06/01 23:07:00 INFO mapreduce.Job: map 0% reduce 0% 16/06/01 23:07:16 INFO mapreduce.Job: map 2% reduce 0% <----중략------> 16/06/01 23:20:40 INFO mapreduce.Job: map 100% reduce 99% 16/06/01 23:20:49 INFO mapreduce.Job: map 100% reduce 100% 16/06/01 23:21:22 INFO mapreduce.Job: Job job_1464789852045_0001 completed successfully 16/06/01 23:21:22 INFO mapreduce.Job: Counters: 51 File System Counters FILE: Number of bytes read=1944222038 FILE: Number of bytes written=2615247138 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=5368872264 HDFS: Number of bytes written=1062681713 HDFS: Number of read operations=123 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Killed map tasks=1 Launched map tasks=41 Launched reduce tasks=1 Data-local map tasks=37 Rack-local map tasks=4 Total time spent by all maps in occupied slots (ms)=4830145 Total time spent by all reduces in occupied slots (ms)=746889 Total time spent by all map tasks (ms)=4830145 Total time spent by all reduce tasks (ms)=746889 Total vcore-milliseconds taken by all map tasks=4830145 Total vcore-milliseconds taken by all reduce tasks=746889 Total megabyte-milliseconds taken by all map tasks=4946068480 Total megabyte-milliseconds taken by all reduce tasks=764814336 Map-Reduce Framework Map input records=59103515 Map output records=631711586 Map output bytes=10307206835 Map output materialized bytes=666647391 Input split bytes=3400 Combine input records=0 Combine output records=0 Reduce input groups=36534125 Reduce shuffle bytes=666647391 Reduce input records=631711586 Reduce output records=36534125 Spilled Records=2430081091 Shuffled Maps =40 Failed Shuffles=0 Merged Map outputs=40 GC time elapsed (ms)=16481 CPU time spent (ms)=3173870 Physical memory (bytes) snapshot=11365359616 Virtual memory (bytes) snapshot=78800453632 Total committed heap usage (bytes)=8370782208 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=5368868864 File Output Format Counters Bytes Written=1062681713
|