我在一個流行的hadoop教科書中提供了一個簡單的例子。代碼如下: - [程序後,我的問題的說明如下]減速機停止工作
package src.main.myjob;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Set;
import javax.lang.model.SourceVersion;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.KeyValueTextInputFormat;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
* @author Anup Saumithri
*/
public class MyJob extends Configured implements Tool
{
public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text>
{
@Override
public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException
{
output.collect(value, key);
}
}
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text>
{
public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException
{
String csv = "";
while(values.hasNext())
{
csv += values.next().toString();
csv += ",";
}
output.collect(key, new Text(csv));
}
}
@Override
public int run(String[] args) throws Exception
{
Configuration conf = new Configuration();
JobConf job = new JobConf(conf, MyJob.class);
Path in = new Path(args[0]);
Path out = new Path(args[1]);
FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);
job.setJobName("MyJob");
job.setMapperClass(MapClass.class);
job.setReducerClass(Reduce.class);
job.setInputFormat(KeyValueTextInputFormat.class);
job.setOutputFormat(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.set("key.value.seperator.in.input.line", ",");
JobClient.runJob(job);
return 0;
}
public static void main(String[] args) throws Exception
{
int res = ToolRunner.run(new Configuration(), new MyJob(), args);
System.exit(res);
}
}
現在讀者的利益這一切的程序做它處理包含引用專利的id行的文件[大文件] &引用了專利ID並將其反轉。所以實質上,輸出文件具有所列出的所有專利ID,每個專利ID後面跟着逗號分隔的引用專利ID列表。
當我嘗試執行Map任務運行得很好,但是reduce任務卡在66%。我嘗試過諸如檢查日誌等很多東西(很隱晦的&幾乎沒有用),並增加了reducer的數量。但是,我很少成功地理解這個問題。代碼看起來很直截了當。我真的很感謝你的投入,幫助我理解如何在這裏調試這個問題。我沒有看到這個程序有什麼明顯的錯誤。
感謝您的迴應,我希望我可以測試出來,但數據節點沒有啓動。我想知道爲什麼Hadoop在行爲上如此不一致。開發MapReduce應用程序似乎比管理Hadoop/HDFS要容易得多=> Harderst部分是調試/管理而不是開發.... – Ace
我認爲你沒有足夠的磁盤空間。你檢查過了嗎? –
我每次提交作業都會做namenode格式。 – Ace