소개
마법의 사막 왕국 자라 (Xara) 에서 현명하고 자비로운 아미르 왕은 왕국 전역에 흩어져 있는 방대한 데이터 자원의 힘을 활용하고자 했습니다. 그는 가장 숙련된 데이터 마법사들을 소환하여 왕국의 데이터를 수집, 처리 및 분석하고, 의사 결정과 모든 사람의 번영을 돕는 통찰력을 얻을 수 있는 시스템을 고안하도록 했습니다.
목표는 Hadoop 분산 파일 시스템 (HDFS) 과 통합하고 MapReduce 의 강력한 기능을 활용하여 효율적인 데이터 처리를 수행할 수 있는 강력하고 확장 가능한 데이터 플랫폼을 만드는 것이었습니다. 이 플랫폼을 통해 왕국은 무역 기록, 농업 생산량, 인구 조사 정보 등 다양한 소스의 데이터를 분석하여 아미르 왕이 백성을 위해 정보에 입각한 결정을 내릴 수 있도록 했습니다.
Hadoop 생태계 탐험
이 단계에서는 Hadoop 생태계와 핵심 구성 요소인 HDFS 및 MapReduce 에 대해 알아봅니다.
Hadoop 은 상용 하드웨어 클러스터에서 대규모 데이터 세트를 분산 저장하고 처리하기 위한 오픈 소스 프레임워크입니다. 다음 두 가지 주요 구성 요소로 구성됩니다.
Hadoop 분산 파일 시스템 (HDFS): 여러 머신에 걸쳐 대용량 파일을 저장하도록 설계된 분산 파일 시스템으로, 데이터에 대한 내결함성 및 높은 처리량 액세스를 제공합니다.
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 는 머신 클러스터에서 대규모 데이터 세트를 병렬로 처리하기 위한 프로그래밍 모델입니다. 다음 두 가지 주요 단계로 구성됩니다.
Map (매핑): 입력 데이터는 더 작은 청크로 분할되고, 각 청크는 "매퍼 (mapper)"라고 하는 별도의 작업에 의해 처리됩니다. 매퍼는 데이터를 처리하고 키 - 값 쌍을 내보냅니다.
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 와 통합하는 데 필요한 귀중한 기술을 습득하여 실제 빅 데이터 문제를 해결할 수 있는 지식을 갖추게 되었습니다. 이 경험은 의심할 여지 없이 데이터 마법사로서의 성장에 기여하여 다양한 분야에서 통찰력을 얻고 의사 결정을 추진할 수 있도록 해줄 것입니다.



