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. It's amazing to pay a visit this s... 대구유흥 01 18,
  2. 안녕하세요^^ 배그핵
  3. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  4. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  5. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny

Recent Trackbacks

  1. pet friendly flats to rent in london pet friendly flats to rent in london 18 01
  2. los cabos luxury vacation los cabos luxury vacation 18 01
  3. get redirected here get redirected here 18 01
  4. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   01 2020   »
      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 2817459 HIT
TODAY 12 HIT
YESTERDAY 647 HIT