转载请注明出处。
这里先理一下思路,要将数据从hbase中导入mysql,要实现5个类,分别是负责读取hbase数据的mapper类,负责写入mysql的reducer类,combine类,数据库信息读写的接口类,以及最后让程序跑起来的主类。
先来看下连接mysql需要给出的信息:
有3点:分别是配置参数configuration
,输入输出格式dbout/input, job的初始化。
先看第一点,配置信息:
Configuration conf = new Configuration() ;
DBConfiguration.configureDB(
conf, "com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/test",
"root","admin");
接下来是第二点,输入输出格式,这里要实现一个接口类,具体步骤参考http://blog.csdn.net/u014595019/article/details/53204081,下面给出自己测试用的代码:
public class DBStatic {
public static class ReStatic implements Writable, DBWritable {
private String court;
public ReStatic(){}
@Override
public void write(PreparedStatement statement) throws SQLException {
statement.setBytes(1, Bytes.toBytes(this.getCourt()));
}
@Override
public void readFields(ResultSet resultSet) throws SQLException {
this.court = resultSet.getString(1);
}
public String getCourt() {
return court;
}
public void setCourt(String court) {
this.court = court;
}
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(this.court);
}
@Override
public void readFields(DataInput in) throws IOException {
this.court = in.readUTF();
}
}
}
第三点就是job的初始化
job设置最后给出,看接下来的代码,这里需要注意的是一定要在有连接hbase和mysql的信息之后再初始化job,否则会报错。还有就是只需要初始化一次job信息就好,当初自己就是粗心犯了这么个小错误,调试了好久才把错误找到,切记切记。
接下来连接hbase的信息:
Configuration conf = HBaseConfiguration.create();
其实有上面一句连接hbase就够了,后面在写job时还要再加上一句:
TableMapReduceUtil.initTableMapperJob(Bytes.toBytes(tableName), scan, HbaseTestMapper.class, Text.class,
IntWritable.class, job);
测试结果
代码放到GitHub上了,见https://github.com/dreamQAQ/hbasetosql