[HADOOP] 처음으로 Hadoop을 사용하면 MapReduce 작업이 단계 축소되지 않음
HADOOP처음으로 Hadoop을 사용하면 MapReduce 작업이 단계 축소되지 않음
DFS에서 데이터를 읽어 들여 간단한 알고리즘을 실행하는 간단한 맵 축소 작업을 작성했습니다. 디버깅을 시도 할 때 매퍼가 키와 값의 단일 집합을 출력하도록하고 감속기가 완전히 다른 집합을 출력하기로 결정했습니다. 단일 노드 Hadoop 20.2 클러스터에서이 작업을 실행하고 있습니다. 작업이 끝나면 출력에는 매퍼가 출력 한 값이 포함되어있어 감속기가 실행되고 있지 않다고 믿을 수 있습니다. 왜 누군가가 내 코드가 그러한 결과물을 만들어 내는지에 대한 통찰력을 제공한다면 크게 감사 할 것입니다. 다른 것들뿐만 아니라 setMapOutputKeyClass 및 setMapOutputValueClass 다른 것들을 outputKeyClass 및 outputValueClass 설정 시도했다. 현재 주석 처리 된 코드 섹션은 내가 실행중인 알고리즘이지만 맵을 변경하고 단순히 특정 값을 출력하는 메소드를 줄였습니다. 다시 한번, 작업의 출력에는 맵퍼가 출력 한 값만 들어 있습니다. 그 일을하는 데 사용 된 수업은 다음과 같습니다.
import java.io.IOException; import java.util. *;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; 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; org.apache.hadoop.util.GenericOptionsParser 가져 오기;
/ ** * * @author redbeard * / 공용 클래스 CalculateHistogram {
public static class HistogramMap extends Mapper<LongWritable, Text, LongWritable, Text> {
private static final int R = 100;
private int n = 0;
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
if (n == 0) {
StringTokenizer tokens = new StringTokenizer(value.toString(), ",");
int counter = 0;
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if (tokens.hasMoreTokens()) {
context.write(new LongWritable(-2), new Text("HI"));
//context.write(new LongWritable(counter), new Text(token));
}
counter++;
n++;
}
} else {
n++;
if (n == R) {
n = 0;
}
}
}
}
public static class HistogramReduce extends Reducer<LongWritable, Text, LongWritable, HistogramBucket> {
private final static int R = 10;
public void reduce(LongWritable key, Iterator<Text> values, Context context)
throws IOException, InterruptedException {
if (key.toString().equals("-1")) {
//context.write(key, new HistogramBucket(key));
}
Text t = values.next();
for (char c : t.toString().toCharArray()) {
if (!Character.isDigit(c) && c != '.') {
//context.write(key, new HistogramBucket(key));//if this isnt a numerical attribute we ignore it
}
}
context.setStatus("Building Histogram");
HistogramBucket i = new HistogramBucket(key);
i.add(new DoubleWritable(Double.parseDouble(t.toString())));
while (values.hasNext()) {
for (int j = 0; j < R; j++) {
t = values.next();
}
if (!i.contains(Double.parseDouble(t.toString()))) {
context.setStatus("Writing a value to the Histogram");
i.add(new DoubleWritable(Double.parseDouble(t.toString())));
}
}
context.write(new LongWritable(55555555), new HistogramBucket(new LongWritable(55555555)));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "MRDT - Generate Histogram");
job.setJarByClass(CalculateHistogram.class);
job.setMapperClass(HistogramMap.class);
job.setReducerClass(HistogramReduce.class);
//job.setOutputValueClass(HistogramBucket.class);
//job.setMapOutputKeyClass(LongWritable.class);
//job.setMapOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
해결법
-
==============================
1.reduce 메소드의 서명이 잘못되었습니다. 메서드 시그니처에 "반복자 <텍스트>"가 포함되어 있습니다. "반복 가능한 <텍스트>"를 전달해야합니다.
reduce 메소드의 서명이 잘못되었습니다. 메서드 시그니처에 "반복자 <텍스트>"가 포함되어 있습니다. "반복 가능한 <텍스트>"를 전달해야합니다.
코드가 Reducer 기본 클래스의 reduce 메소드보다 우선 적용되지 않습니다. 이 때문에 Reducer 기본 클래스에서 제공하는 기본 imlementation이 사용됩니다. 이 구현은 신원 기능입니다.
@Override 주석을 사용하여 이와 같은 오류를 예상하십시오.
from https://stackoverflow.com/questions/4253286/using-hadoop-for-the-first-time-mapreduce-job-does-not-run-reduce-phase by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 원사 (MRv2) 또는지도 (MRv1)가 아닌 사용자가 제출 한 Hadoop 작업이 실패합니다. (0) | 2019.06.23 |
---|---|
[HADOOP] start-dfs.sh를 사용하여 데몬을 시작할 수 없습니다. (0) | 2019.06.23 |
[HADOOP] Sqoop : mysql 드라이버 예외를로드 할 수 없습니다. (0) | 2019.06.23 |
[HADOOP] Hadoop FS 셸을 사용하여 두 개의 파일을 어떻게 Hadoop의 파일로 연결할 수 있습니까? (0) | 2019.06.23 |
[HADOOP] 3 번의 재시도 후 ZooKeeper가 실패했습니다. (0) | 2019.06.23 |