Hadoop-Mysql新API连接

Hadoop-Mysql新API连接,hadoop,Hadoop,我试图在Hadoop进程中将MySQL设置为输入。如何在版本1.0.3中为Hadoop-MySQL连接使用DBInputFormat类?通过hadoop-1.0.3/docs/api/中的JobConf配置作业不起作用 // Create a new JobConf JobConf job = new JobConf(new Configuration(), MyJob.class); // Specify various job-specific parameters job.se

我试图在Hadoop进程中将MySQL设置为输入。如何在版本1.0.3中为Hadoop-MySQL连接使用DBInputFormat类?通过hadoop-1.0.3/docs/api/中的JobConf配置作业不起作用

// Create a new JobConf
JobConf job = new JobConf(new Configuration(), MyJob.class);

// Specify various job-specific parameters     
job.setJobName("myjob");

FileInputFormat.setInputPaths(job, new Path("in"));
FileOutputFormat.setOutputPath(job, new Path("out"));

job.setMapperClass(MyJob.MyMapper.class);
job.setCombinerClass(MyJob.MyReducer.class);
job.setReducerClass(MyJob.MyReducer.class);

job.setInputFormat(SequenceFileInputFormat.class);
job.setOutputFormat(SequenceFileOutputFormat.class);

您需要执行以下操作(例如,假设使用典型的employee表):

configureDB()
setInput()
调用configure
DBInputFormat
。第一个调用指定要使用的JDBC驱动程序实现以及要连接到哪个数据库。第二个调用指定要从数据库加载的数据。MyRecord类是Java中读取数据的类,“employees”是要读取的表的名称。“employee_id”参数指定表的主键,用于排序结果。下面的“InputFormat的限制”一节解释了为什么这是必要的。最后,fields数组列出了要读取的表的哪些列。
setInput()
的重载定义允许您指定要读取的任意SQL查询

调用
configureDB()
setInput()
后,您应该像往常一样配置作业的其余部分,设置映射器和还原器类,指定要读取的任何其他数据源(例如HDFS中的数据集)和其他作业特定参数


您需要创建自己的
可写
实现—类似于以下内容(将id和name视为表字段):

然后,映射器接收DBWritable实现的一个实例作为其输入值。输入键是数据库提供的行id;您很可能会放弃此值

public class MyMapper extends MapReduceBase implements Mapper<LongWritable, MyRecord, LongWritable, Text> { 
public void map(LongWritable key, MyRecord val, OutputCollector<LongWritable, Text> output, Reporter reporter) throws IOException { 
// Use val.id, val.name here 
output.collect(new LongWritable(val.id), new Text(val.name)); 
} 
} 
公共类MyMapper扩展MapReduceBase实现Mapper{
公共void映射(LongWritable键、MyRecord val、OutputCollector输出、Reporter Reporter)抛出IOException{
//在此处使用val.id、val.name
collect(新的LongWritable(val.id)、新文本(val.name));
} 
} 

更多信息:请阅读下面的链接(我答案的实际来源):

看看这篇文章。它显示了如何将数据从Map Reduce接收到MySQL数据库。

很可能它不起作用,因为您的代码没有显示任何与
DBInputFormat
.org.apache.hadoop.mapreduce.lib.db.DBInputFormat org.apache.hadoop.mapred.lib.db.DBInputFormat相关的内容,请根据您使用的API尝试使用其中一个。我还不知道如何使用“public void readFields”(java.sql.ResultSet ResultSet)在映射程序中抛出SQLException以获取值。。。其他人似乎都没事。。。我是hadoop和java新手,对此我感到困惑抱歉,很晚才回复,您是否参考了我在回答中的链接?您需要创建自己的
可写
:类似以下内容:
类MyRecord实现了可写,DBWritable{}
是的,我开发了类。。。我主要还是有问题。。可能在DBInputformat的配置文件中。。。谢谢你的回复…我发现了错误,我回复如下。。。非常感谢。
class MyRecord implements Writable, DBWritable { 
    long id; 
    String name; 

    public void readFields(DataInput in) throws IOException { 
        this.id = in.readLong(); 
        this.name = Text.readString(in); 
        } 

    public void readFields(ResultSet resultSet) throws SQLException { 
        this.id = resultSet.getLong(1); 
        this.name = resultSet.getString(2); } 

    public void write(DataOutput out) throws IOException { 
        out.writeLong(this.id); 
        Text.writeString(out, this.name); } 

    public void write(PreparedStatement stmt) throws SQLException { 
        stmt.setLong(1, this.id); 
        stmt.setString(2, this.name); } 
    } 
public class MyMapper extends MapReduceBase implements Mapper<LongWritable, MyRecord, LongWritable, Text> { 
public void map(LongWritable key, MyRecord val, OutputCollector<LongWritable, Text> output, Reporter reporter) throws IOException { 
// Use val.id, val.name here 
output.collect(new LongWritable(val.id), new Text(val.name)); 
} 
}