首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

Map/reduce出错Error in configuring object,求帮助!该怎么处理

2012-01-28 
Map/reduce出错Error in configuring object,求帮助!小弟刚接触Map/reduce编程,想通过dbinputformat来读写

Map/reduce出错Error in configuring object,求帮助!
小弟刚接触Map/reduce编程,想通过dbinputformat来读写Oracle数据库,但是出现了Error in configuring object的错误。

不过话说hadoop0.20.0的dbinputformat支不支持Oracle的啊?敬请各位大牛不吝赐教。.

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Random;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
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.lib.LongSumReducer;
import org.apache.hadoop.mapred.lib.db.DBConfiguration;
import org.apache.hadoop.mapred.lib.db.DBInputFormat;
import org.apache.hadoop.mapred.lib.db.DBOutputFormat;
import org.apache.hadoop.mapred.lib.db.DBWritable;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.hsqldb.Server;

public class WordCountDB {


  private static final String DRIVER_CLASS = "com.oracle.jdbc.Driver"; //数据库引擎
  private static final String DB_URL = "jdbc:oracle://127.0.0.1:1521/BUS"; //数据库地址
  private static final String DB_USER="manage_bus"; //数据库名
  private static final String DB_PASSWD="its312"; //密码
  
  private static final String[] FieldNames = {"name", "age"};
   
  private static Connection connection; //数据库连接
  public static boolean initialized = false; //数据库连接判定

  public static class TokenizerMapper extends MapReduceBase implements  
  Mapper<LongWritable, TeacherRecord, Text, DoubleWritable>{
   


@Override  
  public void map(LongWritable key, TeacherRecord value, OutputCollector<Text, DoubleWritable> output, Reporter reporter) 
throws IOException
  {
System.out.println("进入map函数");
output.collect(new Text(value.name), new DoubleWritable(value.age));
  }
  }
  
  
  public static class IntSumReducer extends MapReduceBase implements 
  Reducer<Text,DoubleWritable,TeacherRecord,NullWritable> {
   
NullWritable n = NullWritable.get();
@Override
public void reduce(Text key, Iterator<DoubleWritable> values,
OutputCollector<TeacherRecord, NullWritable> output, Reporter arg3)
throws IOException {
// TODO Auto-generated method stub
System.out.println("进入reduce函数");
 
double sum = 0;

while(values.hasNext()) {
sum += values.next().get();
}

output.collect(new TeacherRecord(key.toString(),sum), n);

}
  }

  static class TeacherRecord implements Writable, DBWritable 
  {
String name;
double age;
 
public TeacherRecord(String m_name, double m_age) {


this.name = m_name;
this.age = m_age;
}
 
@Override
public void readFields(DataInput in) throws IOException {
this.name = Text.readString(in);
this.age = in.readDouble();
}
 
@Override
public void write(DataOutput out) throws IOException {
Text.writeString(out, this.name);
out.writeDouble(age);
}
 
@Override
public void readFields(ResultSet resultSet) throws SQLException {
this.name = resultSet.getString(1);
this.age = resultSet.getDouble(2);
}
@Override
public void write(PreparedStatement statement) throws SQLException {
statement.setString(1, this.name);
statement.setDouble(2, this.age);
}
}

  
  public static void main(String[] args) throws Exception 
  {
String driverClassName = DRIVER_CLASS;
String url = DB_URL;
String dbuser=DB_USER;
String dbpw=DB_PASSWD;
 
//map-reduce设置
// JobConf job = new JobConf(getConf(), WordCountDB.class); //????存疑getConf是干什么的

JobConf job = new JobConf(WordCountDB.class);
job.setJobName("Count from DB");
 
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
 
job.setInputFormat(DBInputFormat.class);
DBConfiguration.configureDB(job, driverClassName, url,dbuser,dbpw); //连接数据库 
DBInputFormat.setInput(job, TeacherRecord.class, "teacher", null, "name", FieldNames);
 
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(DoubleWritable.class);
 
 

DBOutputFormat.setOutput(job, "teacher", FieldNames);
job.setOutputKeyClass(TeacherRecord.class);
job.setOutputValueClass(NullWritable.class);
 
try 
{
JobClient.runJob(job);  

catch(Exception e)
{
e.printStackTrace();
System.out.println("运行出现异常");
}  
  }
  
 错误如下:
java.lang.RuntimeException: Error in configuring object
at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:93)
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
at org.apache.hadoop.mapred.JobConf.getInputFormat(JobConf.java:400)
at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:810)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:781)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:730)
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1249)
at WordCountDB.main(WordCountDB.java:205)

纠结了好久,希望大家能帮帮忙,谢谢!

[解决办法]
帮顶吧,这代码太长了,恐怕会吓走不少人
[解决办法]
饿滴神啊!
[解决办法]
不错,观摩中
[解决办法]
这里已经说出位置了,WordCountDB.main(WordCountDB.java:205)
自己检查下这一行
[解决办法]
WordCountDB.java:205

对象属性是不是设错了?看看api

热点排行