跳到正文
W Winse Blog
bigdata 2 min read

使用hadoop编写mapreduce程序的注意点

# 编程时需要注意:

1、实例化job后,不要再使用原来的configuration,得通过job.getCongfigure()来进行参数的配置

public static Job createSubmittableJob(Configuration conf, String[] args) 
		throws IOException {
	String tableName = args[0];

	conf.set(TableInputFormat.INPUT_TABLE, tableName);
	conf.set(TableInputFormat.SCAN, 
		ScanAccessor.getTableInputFormatScan(conf, tableName));

	Job job = new Job(conf, 
		Index.class.getSimpleName() + "_" + tableName + ":" + Utils.now());
	job.setJarByClass(Index.class);

	// conf.set(..., ...)设置将不会生效
	job.getConfiguration().set(...

2、map输出的keyvalue与reduce的输出keyvalue对象不统一,这种情况不应该把reduce作为combine类。

job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(FloatWritable.class);

job.setOutputKeyClass(Text.class);
//job.setOutputValueClass(FloatWritable.class);
job.setOutputValueClass(Text.class);

这样的错误,出现后,如果不认认真真检查的话,比较难发现问题的!

如果map和reduce的keyvalue类型不同时,不要把Reduce的类作为Combine的处理类!

3、聚合类型的操作才使用reduce

  1. GOOD: sqoop导数据功能
  2. WORSE: hadoop contrib index (详…)

4、命令行参数的顺序

-D参数,以及Hadoop内置的参数, 必须放在class后面,不能跟在args

· ERROR

% hadoop jar hadoop-*-examples.jar sort -r numbers.seq sorted
-inFormat org.apache.hadoop.mapred.SequenceFileInputFormat
-outFormat org.apache.hadoop.mapred.SequenceFileOutputFormat
-outkey org.apache.hadoop.io.IntWritable
-outvalue org.apache.hadoop.io.Text

· OK

% hadoop jar hadoop-*-examples.jar sort -r
-inFormat org.apache.hadoop.mapred.SequenceFileInputFormat
-outFormat org.apache.hadoop.mapred.SequenceFileOutputFormat
-outkey org.apache.hadoop.io.IntWritable
-outvalue org.apache.hadoop.io.Text
numbers.seq sorted

# 配置属性注意点:

  1. 开启trash

    <property>
    <name>fs.trash.interval</name>
    <value>720</value>
    </property>
    
  2. 去除mapreduce完成后"SUCCESS",“history目录”

  3. 共享jvm

  4. 不要关闭mapreduce的超时

    Configuration conf = ...
    conf.set("hadoop.job.history.user.location", "none");
    conf.setBoolean("mapreduce.fileoutputcommitter.marksuccessfuljobs", false);
    
    conf.set("mapred.job.reuse.jvm.num.tasks", "-1");
    
    // conf.set("mapred.task.timeout", "0");
    

    可以在执行任务时,新建一个发送心跳的线程,告诉jobtracker当前的任务没有问题。

  5. pid的存放目录最好自定义。长期放置在tmp下的文件将会被清除。 http://winseclone.iteye.com/blog/1772989

    export HADOOP_PID_DIR=/var/hadoop/pids
    

# Hadoop入门资料:

  1. 官网
  2. https://ccp.cloudera.com/display/DOC/Hadoop+Tutorial

【原文地址】

–END

在 GitHub 上讨论

欢迎通过 GitHub Issue 留言或反馈。每条讨论都会关联到对应文章的源文件路径。

2012-09-27-notes-when-written-hadoop-mapreduce-program.md

Related posts