使用Mapreduce处理hbase的数据,并将数据存储到MySQL中
1、首先先定义一个类,这里面的字段要和你的mysql数据库中的表的字段相对应
package com.hbase2mysql;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.lib.db.DBWritable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
//如果不把StuHbase当做Map输出的key时,直接使用Writable,不用使用WritableCombarble接口,可以少写一个方法
/*
*这里也就体会出来,在reduce方法内是不进行排序,
*在reduce端进行排序时,是按分区 把不同的map的输出进行合并时,
*会进行排序,此后是不会在进行排序的,这样的结果因为你在reduce方法的输入时进行排序了,所以reduce端是有序的,但是这只是一个reduce中局部有序,如果你有多个reduce task,则结果只会是每个reducetask的输出局部有序,
要想全局有序,可以在分区时进行改进,把比如你的key是1-100
你可以把1-10,放到一个分区
11-20放到一个分区中
91-100放到一个分区中,这样就会在配个分区中局部有序,也会使全局有序
*/
public class StuHbase implements WritableComparable<StuHbase>, DBWritable {
//与mysql中表对应的
private String name;
private int age;
private String sex;
private int grade;
public StuHbase(){
}
public StuHbase(String name,int age,String sex,int grade){
this.name = name;
this.age = age;
this.sex = sex;
this.grade = grade;
}
//这里写和读的字段的顺序要一样
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeUTF(name);
dataOutput.writeInt(age);
dataOutput.writeUTF(sex);
dataOutput.writeInt(grade);
}
@Override
public void readFields(DataInput dataInput) throws IOException {
this.name = dataInput.readUTF();
this.age = dataInput.readInt();
this.sex = dataInput.readUTF();
this.grade = dataInput.readInt();
}
@Override
public void write(PreparedStatement preparedStatement) throws SQLException {
//类似于jdbc是使用preparedStatement,进行赋值
int index = 1;
preparedStatement.setString(index++,name);
preparedStatement.setInt(index++,age);
preparedStatement.setString(index++,sex);
preparedStatement.setInt(index,grade);
}
@Override
public void readFields(ResultSet resultSet) throws SQLException {
//类似于jdbc进行查询
int index = 1;
name = resultSet.getString(index++);
age = resultSet.getInt(index++);
sex = resultSet.getString(index++);
grade = resultSet.getInt(index);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
public int getGrade() {
return grade;
}
public