Windows에서 Docker Desktop을 사용하여 몇 분 만에 Hadoop 플레이그라운드 생성

이번 학기에 저는 병렬 컴퓨팅에 대한 과정을 선택했습니다. 프로젝트 중 하나는 Java의 Hadoop에서 MapReduce 프로그램을 작성하는 것입니다. 학교의 컴퓨팅 리소스에 연결하는 것은 때때로 어려울 수 있습니다. 특히 기한이 다가오면 더욱 그렇습니다. 그 결과 몇 가지 실험을 빠르게 수행할 수 있도록 Windows 노트북에서 Docker로 로컬 Hadoop 환경을 설정하는 쉬운 방법을 찾았습니다.

준비



도커



Docker를 사용하면 특정 소프트웨어(이 게시물의 Hadoop 포함)에 대한 복잡한 설치 절차를 거치지 않아도 되며 디스크 공간을 확보해야 하는 경우 명확하게 삭제할 수 있습니다.

첫 번째 단계는 컴퓨터에 Windows(OS가 Mac인 경우 Mac용)용 Docker Desktop을 다운로드하여 설치하는 것입니다. 이제 Docker Desktop은 백엔드로 Hyper-V 대신 WSL 2(Linux 2용 Windows 하위 시스템) 사용을 지원합니다. Windows 시스템에 WSL이 없는 경우 this official guide에 따라 활성화할 수 있습니다.

Docker 데스크톱이 설치되고 실행되면 터미널(Powershell/WSL 셸)에 다음 명령을 입력하여 버전을 확인하여 Docker와 Docker Compose의 올바른 설치를 테스트할 수 있습니다.

$ docker --version
Docker version 20.10.13, build a224086
$ docker-compose --version
Docker Compose version v2.3.3


샘플 도커 컨테이너를 시작하여 도커의 기능을 확인할 수도 있습니다.

$ docker run -d -p 80:80 --name myserver nginx


VSCode



모든 개발자가 VSCode를 설치했다고 확신하므로 VSCode에 플러그인Remote Development이 설치되어 있는지 확인하기만 하면 됩니다. 이를 통해 컨테이너, 원격 머신 또는 WSL에서 개발할 수 있습니다.

하둡으로 가자



설정



아래 단계에서 볼 수 있듯이 Docker로 Hadoop 환경을 설정하는 것은 다소 간단합니다.

특정 경로에서 repo big-data-europe/docker-hadoop을 복제한 다음 docker-compose를 통해 Hadoop 클러스터를 설정합니다.

git clone [email protected]:big-data-europe/docker-hadoop.git
cd docker-hadoop
docker-compose up -d


이제 모두 설정되었습니다 :). 잠시 후 http://localhost:9870/을 방문하여 제대로 작동하는지 확인할 수 있습니다.

기차에 타다



드디어 새로운 Hadoop 클러스터를 만날 시간입니다. VS Code를 시작한 다음 왼쪽 패널로 이동하여 원격 개발 플러그인을 선택합니다. 위의 드롭다운에서 "컨테이너"를 선택한 다음 "컨테이너에 연결"아이콘을 클릭하여 "namenode"라는 컨테이너를 찾아 연결합니다. 당신은 Hadoop 세계에 도착했습니다!



안녕하세요 "워드카운트"



이것이 Hadoop 클러스터를 테스트하는 방법입니다. Word Count 예제(Java의 소스 코드에서)를 실행하여 작동 방식을 확인합니다.

하지만 아직 서두르지 마세요. 할 일이 몇 가지 더 있습니다. 샘플 입력 데이터를 만들어야 합니다.

VS Code에서 터미널을 엽니다. 그런 다음 다음을 실행합니다.

mkdir input
echo "Hello World" > input/f1.txt
echo "Hello Docker" > input/f2.txt


우리가 만든 입력은 로컬(더 정확하게는 도커 컨테이너 로컬)에 저장됩니다. 또한 HDFS에 복사해야 합니다.

hadoop fs -mkdir -p input
hdfs dfs -put ./input/* input


준비가 끝나면 공식 WordCount 예제를 this link에서 얻을 수 있습니다.

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;

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();
    Job job = Job.getInstance(conf, "word count");
    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(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

WordCount.java 파일명으로 저장합니다.

이제 작동하는지 알아 봅시다.

export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar
hadoop com.sun.tools.javac.Main WordCount.java
jar cf wordcount.jar WordCount*.class
hadoop jar wordcount.jar WordCount input output 


로그가 많은 것 같지만 우리가 신경 쓰는 것은 출력입니다. cat 명령으로 출력하십시오.

$ hdfs dfs -cat output/part-r-0000*
Docker 1
Hello 2
World 1


만세! 우리는 해냈다!

대청소



이것은 간단합니다. 이 명령을 사용하면 컴퓨터를 더 쉽게 사용할 수 있습니다.

docker-compose down


승인



이 문서는 José Lise의 this article을 상당히 참조합니다. VSCode로 개발하는 방법에 대한 내용을 추가했습니다.

좋은 웹페이지 즐겨찾기