'2016/06/01'에 해당되는 글 1건

  1. 2016.06.01 Hyper-V로 구성한 Hadoop에 WordCount 돌리기
반응형

이번 포스팅에서는 이전 포트팅에서 구성한 하둡 클러스터에 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%



2. eclipse 설정
 eclipse 를 다운로드 한다. (http://www.eclipse.org) 현재(2016.05.31) eclipse는 Mars.2 Release(4.5.2)가 최신이고 여기에는 maven이 기본 설치되어 있다. 하둡 프로젝트를 하기 위해서 eclipse의 File>New>Other를 클릭하고 Wizard에서 Maven Project를 설정한다.


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 가 생성된 것을 볼 수 있다. 이 파일을 하둡 네임노드의 홈 폴더에 옮겨놓는다.


3. WordCount 실행
 MapReduce 를 실행할때 snappy 압축 코덱을 사용하는 것이 좋다. 디스크를 절약할수도 있으며 네트워크에 이동하는 데이터양을 줄일수 있기 떄문에 성능이 더 좋아진다. 다음과 같이 mapred-site.xml에 property를 추가한다

       <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 jar WordCount-0.0.1-SNAPSHOT.jar WordCount /input /output
 그러면 map-reduce 작업이 각 노드에서 실행된다. 다음은 노드 하나를 htop으로 모니터한 화면이다.


다음은 실행 로그 출력이다.

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

 




반응형
Posted by alias
,