hadoop
MapReduce 소개
수색…
통사론
예제를 실행하기 위해 명령 구문은 다음과 같습니다.
bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>
HDFS로 데이터를 복사하려면 (로컬에서) :
bin/hadoop dfs -mkdir <hdfs-dir> //not required in hadoop 0.17.2 and later bin/hadoop dfs -copyFromLocal <local-dir> <hdfs-dir>
비고
Hadoop에서 MapReduce를 사용하는 단어 수 계산 프로그램.
단어 수 계산 프로그램 (Java 및 Python)
단어 집계 프로그램은 MapReduce의 "Hello World"프로그램과 같습니다.
Hadoop MapReduce는 대용량 클러스터 (수천 노드)의 대량 하드웨어에서 방대한 양의 데이터 (멀티 테라 바이트 데이터 세트)를 안정적이고 내결함성이있는 방식으로 병렬 처리하는 애플리케이션을 쉽게 작성하기위한 소프트웨어 프레임 워크입니다.
MapReduce 작업은 일반적으로 입력 데이터 세트를 완전히 병렬 방식으로 맵 작업에 의해 처리되는 독립적 인 청크로 분할합니다. 프레임 워크는지도의 출력을 정렬 한 다음 축소 작업에 입력합니다. 일반적으로 작업의 입력과 출력은 모두 파일 시스템에 저장됩니다. 프레임 워크는 작업 스케줄링, 작업 모니터링 및 실패한 작업 재실행을 처리합니다.
단어 수 계산 예 :
WordCount 예제는 텍스트 파일을 읽고 단어가 얼마나 자주 발생하는지 계산합니다. 입력은 텍스트 파일이고 출력은 각 행에 단어와 얼마나 자주 발생했는지의 횟수가 탭으로 구분 된 텍스트 파일입니다.
각 매퍼는 줄을 입력으로 사용하고 줄 바꿈합니다. 그런 다음 단어의 키 / 값 쌍을 내고 각 감속기는 각 단어의 수를 합산하고 단어와 합계가있는 단일 키 / 값을 내 보냅니다.
최적화로서, 감속기는지도 출력에서 결합기로도 사용됩니다. 이렇게하면 각 단어를 단일 레코드로 결합하여 네트워크를 통해 전송되는 데이터의 양이 줄어 듭니다.
단어 개수 코드 :
package org.myorg;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class WordCount {
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}
예제를 실행하기 위해 명령 구문은 다음과 같습니다.
bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>
입력 디렉토리 (위의 명령 행에서 in-dir이라고 함)의 모든 파일을 읽고 입력의 단어 수를 출력 디렉토리 (위의 out-dir이라고 함)에 기록합니다. 입력과 출력이 모두 HDFS에 저장되어 있다고 가정합니다. 입력이 HDFS에 아직 없지만 로컬 파일 시스템에있는 경우 다음과 같은 명령을 사용하여 HDFS에 데이터를 복사해야합니다.
bin/hadoop dfs -mkdir <hdfs-dir> //not required in hadoop 0.17.2 and later
bin/hadoop dfs -copyFromLocal <local-dir> <hdfs-dir>
파이썬의 단어 수 계산 예 :
mapper.py
import sys
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
words = line.split()
# increase counters
for word in words:
print '%s\t%s' % (word, 1)
reducer.py
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
# remove leading and trailing whitespaces
line = line.strip()
# parse the input we got from mapper.py
word, count = line.split('\t', 1)
# convert count (currently a string) to int
try:
count = int(count)
except ValueError:
# count was not a number, so silently
# ignore/discard this line
continue
if current_word == word:
current_count += count
else:
if current_word:
print '%s\t%s' % (current_word, current_count)
current_count = count
current_word = word
if current_word == word:
print '%s\t%s' % (current_word, current_count)
위의 프로그램은 cat filename.txt | python mapper.py | sort -k1,1 | python reducer.py