hadop 실천 (5) win 10 + eclipse + hadop 2.6.4 개발 환경

본인 환경 win 10 (win 7 에서 승급 가능)
        eclipse  Kepler Service Release 1
        win 10 에 vm workstation 을 설 치 했 고 그 위 에 centos 6.5 를 설 치 했 으 며 그 위 에 hadop 2.6.4 의 의사 분포 식 설 치 를 배치 했다.
목표
        win 10 하의 eclipse 개발 환경 을 설정 하고 이 환경 에서 hadop 응용 을 개발 하여 의사 분포 식 hadop 환경 에서 테스트 할 수 있 습 니 다. 
준비
       1、eclipse  (  Kepler Service Release 1)
       2、 hadoop2.6.4
       3. hadop. dll 과  winutils
       4. wordcount 코드
      5. wordcount 에 필요 한 통계 단어의 텍스트 원본
      6. hadop for eclipse 플러그 인, 본인 이 사용 하 는 플러그 인 은? hadoop-eclipse-plugin-2.6.4.jar
       
3. 환경 구축 절차
      1. hadop 2.6.4 압축 풀기 win 10 시스템 의 임의의 디 렉 터 리 아래 있 습 니 다.(eclipse 를 설정 하기 위해 실제 연결 할 때 Liux 가상 기기 의 의사 분포 식 hadop 을 연결 합 니 다)
      2. win 10 의 환경 변 수 를 설정 하고 제어 판 - 시스템 - 고급 설정 - 환경 변 수 를 통 해 다음 과 같은 몇 가지 환경 변 수 를 설정 해 야 합 니 다. 이미 본인 의 기 계 를 예 로 들 면:
           
                JAVA_HOME=C:\Program Files (x86)\Java\jre6\bin               
                HADOOP_HOME=E:\cwqwork\develop\hadoop-2.6.4
                path 마지막 증가 E:\cwqwork\develop\hadoop-2.6.4\bin
       3. 플러그 인 복사 eclipse 설치 디 렉 터 리 의 plugsin 디 렉 터 리
       4 、 eclipse 시작, windows-》hadoop Map/Reduce
               hadop installation directory 에 앞의 첫 번 째 압축 해제 디 렉 터 리 를 입력 하고 OK 를 누 르 십시오.
        5. 화면 오른쪽 에 새로 나 온 맵 / Reduce 탭 에서 맨 왼쪽 Project Explorer 가 나타 납 니 다. DFS Locations。
              화면 맨 오른쪽 아래 에 파란색 아기 코끼리 가 있 습 니 다. 클릭 후, 설정 hadoop location
         6. 위 에 설정 하면 한 층 한 층 훑 어 볼 수 있 습 니 다.   DFS Locations。 이것 은 Liux 아래 hadop 의 dfs 시스템 을 표시 합 니 다.
넷, 테스트 공정 코드
          1. 새 프로젝트, other - map reduce procject 를 선택 하고 프로젝트 이름 을 입력 하 는 등 새로운 프로젝트 를 만 듭 니 다.
          2 、 WordCount 클래스 만 들 기
                 코드 는 다음 과 같 습 니 다:
import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
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;
import org.apache.hadoop.util.GenericOptionsParser;

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 static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    //conf.set("mapred.job.tracker","192.168.136.155:9001" );
    //conf.set("fs.default.name","192.168.136.155:9000" );
    
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
   
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount <in> <out>");
      System.exit(2);
    }
    System.out.println ("Usage: wordcount <in> <out>" + otherArgs[0] +"  "+ otherArgs[1] );
    
    Job job = new Job(conf, "wordcount");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    
    System.out.println ("add input path:" + otherArgs[0]);    
    System.out.println ("set output path:" + otherArgs[1]); 
    System.out.println ("begin wait job completion");
    
    job.waitForCompletion(true);  
  }
}

                 생 성 이 완료 되면 Liux 가상 컴퓨터 에서 통계 가 필요 한 텍스트 를 가 져 옵 니 다.
                 Hello world Hello me!cwq solo
                 텍스트 2: Hello world Hello you! solo
                 linux 디 렉 터 리 / opt / hadop / input / ordcount 다음:
                      echo "Hello world Hello me! cwq solo"  >test1.txt
                      echo " Hello world Hello you! solo"  >test2.txt
             hadoop fs -put  /opt/hadoop/input/wordcount input
       3. 완료 후 클래스 에서 오른쪽 버튼 - run configuration - 입력 매개 변수
                 hdfs://192.168.136.155:9000/user/hadoop/input/wordcount  hdfs://192.168.136.155:9000/user/hadoop/output/wordcount
                 입력 후 실행 하지 마 십시오.
                그리고 run on hadop 방식 으로 실 행 됩 니 다.
          4. 정상 적 인 상황 에서 이상 을 보고 합 니 다.
Exception in thread "main" java.lang.NullPointerException
at java.lang.ProcessBuilder.start(ProcessBuilder.java:441)
at org.apache.hadoop.util.Shell.runCommand(Shell.java:445)
at org.apache.hadoop.util.Shell.run(Shell.java:418)

             패 치 를 설치 하지 않 았 기 때문이다. 장차 hadop. dll 과  winutils 복사 win 10 위 hadop 디 렉 터 리 아래 bin 디 렉 터 리.
             
          5. 다시 실행 합 니 다. 이상 이 없 지만 실행 이 끝 났 습 니 다. dfs 를 보면 output 결과 가 없고 console 에 출력 이상 이 없습니다.이곳 은 오랫동안 갈등 하고 있다.
                 해결 방법: src 디 렉 터 리 에 log. properties 파일 을 만들어 log4j 를 인쇄 할 수 있 도록 합 니 다.
            
                 log4j.rootLogger=debug,stdout,R
                 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
                 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
                 log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n
                 log4j.appender.R=org.apache.log4j.RollingFileAppender
                 log4j.appender.R.File=mapreduce_test.log
                 log4j.appender.R.MaxFileSize=1MB
                 log4j.appender.R.MaxBackupIndex=1
                 log4j.appender.R.layout=org.apache.log4j.PatternLayout
                 log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%
                 log4j.logger.com.codefutures=DEBUG

              6. 다시 실행 하면 console 인쇄 에 error 가 있 습 니 다.
 WARN - job_local194089354_0001 org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/user/hadoop/output":hadoop:supergroup:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)
                권한 문제 임 을 설명 합 니 다. eclipse 는 Administrator 로 시작 되 었 습 니 다. Liux 에 연 결 된 hadop 은 이 사용자 이기 때문에 권한 이 금지 되 어 있 습 니 다.
해결 방법:
1), 테스트 환경 이 라면 hadop hdfs 의 사용자 권한 검 사 를 취소 할 수 있 습 니 다.conf / hdfs - site. xml 을 열 고 dfs. permissions 속성 을 false (기본 값 true) 로 변경 합 니 다. OK.2) hadop location 인 자 를 수정 하고 advanced parameter 옵션 에서 hadop. job. ugi 항목 을 찾 아 hadop 을 시작 하 는 사용자 이름 으로 바 꾸 면 됩 니 다. 3) window 기기 의 사용자 이름 을 hadop 사용자 이름 으로 바 꾸 면 됩 니 다.
 
          7. 실행, 이번 정확 한 실행 이 완료 되 었 습 니 다. console 은 오 류 를 보고 하지 않 습 니 다. dfs location 오른쪽 버튼 - reconnect - > 는 한 층 한 층 씩 열 리 고 마지막 으로 output 디 렉 터 리 에서 통계 단어 결 과 를 볼 수 있 습 니 다.
Hello 4 cwq 1 me! 1 solo 2 world 2 you! 1

좋은 웹페이지 즐겨찾기