Xara 의 데이터 마법

LinuxBeginner
지금 연습하기

소개

마법의 사막 왕국 자라 (Xara) 에서 현명하고 자비로운 아미르 왕은 왕국 전역에 흩어져 있는 방대한 데이터 자원의 힘을 활용하고자 했습니다. 그는 가장 숙련된 데이터 마법사들을 소환하여 왕국의 데이터를 수집, 처리 및 분석하고, 의사 결정과 모든 사람의 번영을 돕는 통찰력을 얻을 수 있는 시스템을 고안하도록 했습니다.

목표는 Hadoop 분산 파일 시스템 (HDFS) 과 통합하고 MapReduce 의 강력한 기능을 활용하여 효율적인 데이터 처리를 수행할 수 있는 강력하고 확장 가능한 데이터 플랫폼을 만드는 것이었습니다. 이 플랫폼을 통해 왕국은 무역 기록, 농업 생산량, 인구 조사 정보 등 다양한 소스의 데이터를 분석하여 아미르 왕이 백성을 위해 정보에 입각한 결정을 내릴 수 있도록 했습니다.

Hadoop 생태계 탐험

이 단계에서는 Hadoop 생태계와 핵심 구성 요소인 HDFS 및 MapReduce 에 대해 알아봅니다.

Hadoop 은 상용 하드웨어 클러스터에서 대규모 데이터 세트를 분산 저장하고 처리하기 위한 오픈 소스 프레임워크입니다. 다음 두 가지 주요 구성 요소로 구성됩니다.

  1. Hadoop 분산 파일 시스템 (HDFS): 여러 머신에 걸쳐 대용량 파일을 저장하도록 설계된 분산 파일 시스템으로, 데이터에 대한 내결함성 및 높은 처리량 액세스를 제공합니다.

  2. MapReduce: 머신 클러스터에서 대량의 데이터를 병렬로 처리하는 애플리케이션을 작성하기 위한 프로그래밍 모델 및 소프트웨어 프레임워크입니다.

Hadoop 생태계를 탐험하려면 터미널에서 다음 명령을 사용할 수 있습니다.

먼저, 터미널에서 다음 명령을 실행하여 hadoop 사용자로 로그인했는지 확인합니다.

su - hadoop

HDFS 의 디렉토리 및 파일 목록을 표시합니다.

hdfs dfs -ls /

HDFS 에 새 디렉토리를 생성합니다.

hdfs dfs -mkdir -p /home/hadoop/input

로컬 파일을 HDFS 로 복사합니다.

hdfs dfs -put /home/hadoop/local/file.txt /home/hadoop/input

이러한 명령은 HDFS 와 상호 작용하여 내용을 나열하고, 디렉토리를 생성하고, 로컬 파일 시스템에서 파일을 복사하는 방법을 보여줍니다.

hdfs dfs 명령은 Hadoop 분산 파일 시스템 (HDFS) 과 상호 작용하는 데 사용됩니다. -ls 옵션은 HDFS 의 디렉토리 내용을 나열하고, -mkdir은 새 디렉토리를 생성합니다. -put 옵션은 로컬 파일을 HDFS 로 복사합니다.

MapReduce 작업 실행

이 단계에서는 HDFS 에 저장된 데이터에서 MapReduce 작업을 실행하는 방법을 배우고, 대규모 데이터 세트를 효율적으로 분석하기 위해 병렬 처리의 강력한 기능을 활용합니다.

MapReduce 는 머신 클러스터에서 대규모 데이터 세트를 병렬로 처리하기 위한 프로그래밍 모델입니다. 다음 두 가지 주요 단계로 구성됩니다.

  1. Map (매핑): 입력 데이터는 더 작은 청크로 분할되고, 각 청크는 "매퍼 (mapper)"라고 하는 별도의 작업에 의해 처리됩니다. 매퍼는 데이터를 처리하고 키 - 값 쌍을 내보냅니다.

  2. Reduce (리듀스): 매퍼의 출력은 키별로 정렬 및 그룹화되고, 각 그룹은 "리듀서 (reducer)"라고 하는 별도의 작업에 의해 처리됩니다. 리듀서는 각 키와 관련된 값을 결합하고 최종 결과를 생성합니다.

텍스트 파일에서 단어의 발생 횟수를 계산하는 간단한 MapReduce 작업을 실행해 보겠습니다. 먼저, 다음 내용으로 WordCount.java라는 Java 파일을 생성합니다.

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 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);
    }
}

다음으로, Java 파일을 컴파일합니다.

mkdir ~/wordcount
javac -source 8 -target 8 -classpath $(hadoop classpath) -d ~/wordcount WordCount.java
jar -cvf ~/wordcount.jar -C ~/wordcount .

마지막으로, MapReduce 작업을 실행합니다.

hadoop jar ~/wordcount.jar WordCount /home/hadoop/input/file.txt /home/hadoop/output

WordCount 클래스는 텍스트 파일에서 단어의 발생 횟수를 계산하는 MapReduce 작업을 정의합니다. TokenizerMapper 클래스는 입력 텍스트의 각 줄을 토큰화하고 (단어, 1) 키 - 값 쌍을 내보냅니다. IntSumReducer 클래스는 각 단어에 대한 값을 합산하고 최종 (단어, 개수) 쌍을 내보냅니다.

Java 파일은 컴파일되어 JAR 파일로 패키징된 다음, hadoop jar 명령을 사용하여 실행됩니다. 입력 파일 경로 (/home/hadoop/input/file.txt) 및 출력 디렉토리 경로 (/home/hadoop/output) 가 인수로 제공됩니다.

요약

이 랩에서는 Xara 의 마법 사막 왕국으로의 여정을 시작하여 King Amir 를 도와 Hadoop 생태계의 힘을 활용하여 왕국의 데이터를 처리하고 분석했습니다. 분산 스토리지를 위한 HDFS 와 병렬 데이터 처리를 위한 MapReduce 를 포함하여 Hadoop 의 핵심 구성 요소를 탐구했습니다.

실습 단계를 통해 HDFS 와 상호 작용하고, 디렉토리를 생성하고, 파일을 업로드하는 방법을 배웠습니다. 또한 Hadoop 의 병렬 처리 기능을 보여주는 단어 수 세기 애플리케이션과 같은 MapReduce 작업을 실행하는 경험을 얻었습니다.

이 랩을 완료함으로써 Hadoop 을 HDFS 및 MapReduce 와 통합하는 데 필요한 귀중한 기술을 습득하여 실제 빅 데이터 문제를 해결할 수 있는 지식을 갖추게 되었습니다. 이 경험은 의심할 여지 없이 데이터 마법사로서의 성장에 기여하여 다양한 분야에서 통찰력을 얻고 의사 결정을 추진할 수 있도록 해줄 것입니다.