Windows Local Map&Reduce Job RunnerDriver


# Windows OS - Eclipse에서 로컬의 파일을 읽어, 로컬에 파일을 출력
 - HDFS 접속없이 로컬에서 MapReduce 테스트및 잡 구동(jar 파일 없이)
 - Mapper, Reducer 등의 디버깅 가능


* Hadoop 테스트 버전 : 1.1.2

* 필요사항(Hadoop 관련 jar 파일)
  $HADOOP_HOME/hadoop-core-x.x.x.jar
  $HADOOP_HOME/lib/*.jar


* 선택사항(Eclipse, Build Path에 mapred-site.xml 파일이 존재할 경우 mapred-site.xml 파일을 참조)
  $HADOOP_HOME/conf 디렉토리의 설정 파일

* MapReduce 파라메터 정보
  http://hadoop.apache.org/docs/r1.1.2/mapred_tutorial.html#Map+Parameters

# MapReduce Driver의 Configuration 설정 추가 내역
Configuration conf = getConf();

// 로컬실행으로 환경 설정
conf.set("fs.default.name", "file:///");
conf.set("mapred.job.tracker", "local");

// OutOfMemoryError: Java heap space 발생시
// 메모리 버퍼를 낮게 설정(기본값:100) 또는 JVM 힙 메모리를 높게 설정
// 셔플 참고 : http://develop.sunshiny.co.kr/897

// conf.set("mapred.child.java.opts", "-Xmx512m"); // JVM 힙 메모리
conf.set("io.sort.mb", "100"); // 맵 태스크 메모리 버퍼(mapred-site.xml)

// WindowsLocalFileSystem 권한 설정 클래스(IOException 처리)
conf.set("fs.file.impl", "org.apache.hadoop.mr.local.WindowsLocalFileSystem");
conf.set("io.serializations",
          "org.apache.hadoop.io.serializer.JavaSerialization," +
          "org.apache.hadoop.io.serializer.WritableSerialization");


# MRJobWindowsLocalDriver.java
package org.apache.hadoop.mr.local;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mr.WordCount.IntSumReducer;
import org.apache.hadoop.mr.WordCount.TokenizerMapper;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/**
 * # Windows Local Map&Reduce Job RunnerDriver
 */
public class MRJobWindowsLocalDriver extends Configured implements Tool{

    @Override
    public int run(String[] arg0) throws Exception {
        Configuration conf = getConf();
        conf.set("fs.default.name", "file:///");
        conf.set("mapred.job.tracker", "local");
        // WindowsLocalFileSystem 권한 설정 클래스
        conf.set("fs.file.impl", "org.apache.hadoop.mr.local.WindowsLocalFileSystem");
        conf.set("io.serializations",
                  "org.apache.hadoop.io.serializer.JavaSerialization," +
                  "org.apache.hadoop.io.serializer.WritableSerialization");

        Job job = new Job(conf,"Word Count Driver");

        // 맵퍼 & 리듀서
        job.setMapperClass(TokenizerMapper.class); // 맵퍼
//        job.setCombinerClass(IntSumReducer.class); // 콤바이너
        job.setReducerClass(IntSumReducer.class);   // 리듀서 
        
        // 인풋 아웃풋 설정
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);        

        Path input = new Path("D:/02.WorkData/work_data/위키_빅데이터.txt");
        Path output = new Path("D:/02.WorkData/output/위키_빅데이터");

        FileInputFormat.addInputPath(job, input);
        FileOutputFormat.setOutputPath(job, output);

        FileSystem fs = FileSystem.getLocal(conf);
        fs.delete(output, true); // 이전 출력 파일 삭제
        
        job.waitForCompletion(Boolean.TRUE);
        return 0;
    }
    
    public static void main(String[] args) throws Exception {
        ToolRunner.run(new MRJobWindowsLocalDriver(), null);
    }    
}



# WindowsLocalFileSystem.java
package org.apache.hadoop.mr.local;

import java.io.IOException;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;

import org.apache.hadoop.fs.LocalFileSystem;

/**
 * # Windows 로컬 파일 시스템 권한 처리
 *    출처 : http://bigdatanerd.wordpress.com/2013/11/14/
 *    mapreduce-running-mapreduce-in-windows-file-system-debug-mapreduce-in-eclipse/
 */
public class WindowsLocalFileSystem extends LocalFileSystem{

    public WindowsLocalFileSystem() {
        super();
    }

    public boolean mkdirs (final Path path, final FsPermission permission) 
                                                                throws IOException {
        final boolean result = super.mkdirs(path);
        this.setPermission(path, permission);
        return result;
    }

    public void setPermission (final Path path, final FsPermission permission) 
                                                                    throws IOException {
        try {
            super.setPermission(path, permission);
        } catch (final IOException e) { // file IOException에 대한 예외를 출력하고 계속 진행
            System.err.println("Cant help it, hence ignoring IOException " +
                    "setting persmission for path \"" + path + "\": " + e.getMessage());
        }
    }
}



# WordCount.java
package org.apache.hadoop.mr;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

/**
 * # WordCount
 */
public class WordCount {

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context) throws IOException, 
                                    InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) 
                                    throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

/*    
    public int runJob() throws Exception {

        Configuration conf = new Configuration();
        Job job = new Job(conf, "WordCount Driver");

        // Job 클래스 설정
        job.setJarByClass(WordCount.class);

        // 맵퍼 & 리듀서
        job.setMapperClass(TokenizerMapper.class);
//        job.setCombinerClass(IntSumReducer.class); // 콤바이너
        job.setReducerClass(IntSumReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        Path input = new Path("D:/02.WorkData/work_data/위키_빅데이터.txt");
        Path output = new Path("D:/02.WorkData/output/위키_빅데이터");

        FileInputFormat.addInputPath(job, input);
        FileOutputFormat.setOutputPath(job, output);

        FileSystem fs = FileSystem.getLocal(conf);
        fs.delete(output, true); // 이전 출력파일 삭제

        job.waitForCompletion(Boolean.TRUE);
        return 0;
    }

    public static void main(String[] args) throws Exception {
        new WordCount().runJob(); 
    }
*/
}




※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
01 17, 2014 21:07 01 17, 2014 21:07


Trackback URL : http://develop.sunshiny.co.kr/trackback/990

Leave a comment


Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   12 2019   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2777714 HIT
TODAY 439 HIT
YESTERDAY 468 HIT