Hadoop-Mysql新API连接
我试图在Hadoop进程中将MySQL设置为输入。如何在版本1.0.3中为Hadoop-MySQL连接使用DBInputFormat类?通过hadoop-1.0.3/docs/api/中的JobConf配置作业不起作用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
// 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()
调用configureDBInputFormat
。第一个调用指定要使用的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));
}
}