对Hbase进行MapReduce后将结果保存到MySQL中,MapReduce从MySQL中读取数据并把数据存储到hbase中

本文介绍了如何使用MapReduce在Hbase和MySQL间进行数据迁移。通过创建一个与MySQL表字段对应的类,在Map端读取Hbase数据,Reduce端将处理结果写入MySQL。同时,也展示了如何从MySQL读取数据,通过MapReduce将其存储到Hbase中,确保数据在两个系统间的同步。
摘要由CSDN通过智能技术生成

使用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 
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值