关闭

MySql迁移到HBase数据库(服务器)

标签: hbasemysql数据库java
551人阅读 评论(0) 收藏 举报
分类:

简介

前一段时间做项目需要将服务器上MySql数据库中的数据迁移到HBase数据库,没有用工具,直接用JDBC和HBase API解决。
碰到一些问题,服务器上的HBase数据库不知道为什么远程连接不上,于是写了xx.java文件在服务器上跑。
前提配置:

  • java jdk
  • hbase、hadoop
  • mysql
  • 一些habse和jdbc的jar包
  • jar包以及样例链接如下,不日上传
    -截图如下
    这里写图片描述

迁移思路

  • 根据mysql数据库表名,获取表字段信息,根据第四列找到主键,如图这里写图片描述
  • mysql表与hbase表对应,主键对应主键,其他属性对应列族(info)的属性,如上图News表”url”对应News_veetah表”url”(rowkey),”news_article_id”对应”info:news_article_id”
  • jdbc从mysql一条条读取表中数据,同时一行行添加到hbase对应表
  • hbase api java操作(不详细解释,基本和jdbc原理类似)

代码

注释不详细解释了,注意装hbase服务器的IP,装mysql服务器的ip,mysql用户名密码等

import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

public class SqlToHBase {
    Map<String, List<String>> map = new HashMap<String, List<String>>();//存储表名,主键

    public static Configuration config = null;

    static {
        config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", "47.92.123.230:2181");
    }

    /*
     * 创建表
     */
    public static void createTable(String tableName, String[] columnfamily) {
        Admin admin;
        HTableDescriptor table;
        TableName t_name = TableName.valueOf(tableName);
        Connection connection = null;
        try {
            System.out.println("connection...");
            connection = ConnectionFactory.createConnection(config);
            admin = connection.getAdmin();
            table = new HTableDescriptor(t_name);
            System.out.println("table.addFamily...");
            for (int i = 0; i < columnfamily.length; i++) {
                table.addFamily(new HColumnDescriptor(columnfamily[i]));
            }
            if (admin.tableExists(t_name)) {
                System.out.println("Table " + tableName + " Exists!!");
                return;
            } else {
                System.out.println("admin.createTable...");
                admin.createTable(table);
                System.out.println("Create Table Success!!! Table Name :[ " + tableName + " ]");
            }
            System.out.println("admin.close...");
            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                System.out.println("connection.close...");
                if (null != connection && !connection.isClosed()) {
                    connection.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /*
     * 删表
     */
    public static void deleteTable(String tableName) {
        Connection connection = null;
        Admin admin;
        try {
            connection = ConnectionFactory.createConnection(config);
            admin = connection.getAdmin();
            admin.disableTable(TableName.valueOf(tableName));
            admin.deleteTable(TableName.valueOf(tableName));
            System.out.println(tableName + " is deleted!!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (null != connection && !connection.isClosed()) {
                    connection.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
     * 添加数据
     */
    public static void addData(String tableName, String rowKey, String[] column, String[] value) {
        Connection connection = null;
        Table table = null;
        try {
            connection = ConnectionFactory.createConnection(config);
            Put put = new Put(Bytes.toBytes(rowKey));
            table = connection.getTable(TableName.valueOf(tableName));
            HColumnDescriptor[] columnFamilies = table.getTableDescriptor().getColumnFamilies();
            for (int i = 0; i < columnFamilies.length; i++) {
                String familyName = columnFamilies[i].getNameAsString();
                if (familyName.equals("info")) {
                    for (int j = 0; j < column.length; j++) {
                        if(value[j] != null) {
                            put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(column[j]), Bytes.toBytes(value[j]));
                        }
                    }
                }
                table.put(put);
                System.out.println("Add Data to [" + tableName + "] Success!!! Rowkey:" + rowKey);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != table) {
                    table.close();
                }
                if (null != connection && !connection.isClosed()) {
                    connection.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
     * 根据MySQL表名得到MySQL表属性
     */
    public List<String> getSqlTableColumnByName(String sqltablename) {
        List<String> list = new ArrayList<String>();
        // 1.声明变量
        java.sql.Connection connection = null;
        PreparedStatement state = null;
        ResultSet result = null;

        try {
            // 2.获取连接
            connection = DBManager.getConnection();

            // 3.创建sql语句对象,并执行语句
//          String sql = "select COLUMN_NAME from information_schema.COLUMNS where table_name = ?";
            String sql = "describe " + sqltablename;
            state = connection.prepareStatement(sql);
//          state.setString(1, sqltablename);
//          state = connection.prepareStatement(sql);
            result = state.executeQuery(); // 返回查询结果

            List<String> keylist = new ArrayList<String>();
            while(result.next()) {
                if(result.getString(4).equals("PRI")) {
                    keylist.add(result.getString(1));
                } else {
                    list.add(result.getString(1));
                }
            }
            map.put(sqltablename, keylist);

        } catch (Exception e) {
            // 5.处理异常
            e.printStackTrace();
        } finally {
            // 6.释放资源
            DBManager.closeAll(connection, state, result);
        }
        return list;
    }

    /*
     * 传输
     */
    public void doSqlToHBase(String[] names) {
//      //删表
//      for(int i = 0; i < names.length; i++) {
//          deleteTable(names[i] + "_veetch");
//      }
        for(int i = 0; i < names.length; i++) {
            String tablename = names[i] + "_veetah222";
            String[] columnfamily = {"info"};
            createTable(tablename, columnfamily);
            List<String> list = getSqlTableColumnByName(names[i]);
            String[] columns = new String[list.size()];
            for(int j = 0; j < list.size(); j++) {
                columns[j] = list.get(j);
            }

//          String[] columns = {"city_id", "city_name", "city_name_e", "lng", "lat", "weight"};
            String[] values = new String[columns.length];

            // 1.声明变量
            java.sql.Connection connection = null;
            PreparedStatement state = null;
            ResultSet result = null;

            try {
                // 2.获取连接
                connection = DBManager.getConnection();

                // 3.创建sql语句对象,并执行语句
                String sql = "select * from " + names[i];
                state = connection.prepareStatement(sql);
                result = state.executeQuery(); // 返回查询结果

                // 4.分析执行结果
                while (result.next()) {
                    for(int cc = 0; cc < values.length; cc++) {
                        values[cc] = result.getString(list.get(cc));
                    }
                    String rowkey = "";

                    if(map.get(names[i]).size() == 1) {
                        rowkey = result.getString(map.get(names[i]).get(0));
                    } else {
                        for(int jj = 0; jj < map.get(names[i]).size(); jj++) {
                            rowkey += ":" + result.getString(map.get(names[i]).get(jj));
                        }
                    }
                    addData(tablename, rowkey, columns, values);
                }
            } catch (Exception e) {
                // 5.处理异常
                e.printStackTrace();
            } finally {
                // 6.释放资源
                DBManager.closeAll(connection, state, result);
            }
        }
        System.out.println("---------迁移成功!----------");
    }
    public static void main(String[] args) throws IOException {
        SqlToHBase s = new SqlToHBase();
//      String[] names = {"Account", "Admin", "Blog", "Blog_of_xinjin", "Blog_xinjin", "Forum", "Forum_of_xinjin","Material","News","News_modif","News_of_xinjin","News_xinjin",
//              "Result","Topic", "VPS", "backupTest","blog_crawler_reply","News","city","facebook_account","map","model","news_crawler_reply","post_job","reply_job",
//              "site","test","view"};
        String[] names = {"Admin"}; //Topic 两个主键
        s.doSqlToHBase(names);
//      s.createTable("wwwwww", new String[]{"info"});

    }
}


JDBC连接类
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DBManager {
    private static String host = "12.12.12.12";
//  private static String host = "127.0.0.1";
    private static String port = "3306";
    private static String username = "root";
    private static String password = "xxxxxxx";
//  private static String password = "123456";
    private static String database = "veetah";

    public DBManager(){
    }

    //通过静态代码块加载数据库驱动程序
    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    //获取数据库连接
    public static java.sql.Connection getConnection() {
        java.sql.Connection connection = null;
        String url = "jdbc:mysql://" + host + "" + ":" + port +"/" + database;
        try{
            connection = DriverManager.getConnection(url, username, password);
        }catch(Exception e){
            e.printStackTrace();
        }
        return connection;
    }

    //释放资源
    public static void closeAll(java.sql.Connection connection, Statement state, ResultSet result) {
        try{
            if(result != null){
                result.close();
            }
            if(state != null){
                state.close();
            }
            if(connection != null){
                connection.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

编译运行命令

  1. 在服务器创建一个文件夹mkdir test
  2. 进入文件夹cd test
  3. 创建lib文件夹 mkdir lib
  4. 将必要jar包导入到lib下
  5. 创建两个类vi SqlToHBase.java,vi DBManager.java复制代码到里面
  6. 编译运行javac -Djava.ext.dirs=./lib DBManager.java,javac -Djava.ext.dirs=./lib SqlToHBase.java,java -Djava.ext.dirs=./lib SqlToHBase
  7. 如图
    这里写图片描述

运行结果截图

这是一个MySQL中veetah数据库中的view表迁移到HBase中 view_veetah表截图示例
这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

mysql数据库迁移至Oracle数据库

1.使用工具:(1) Navicat Premium (2) PL/SQL Developer 11.0 (3) Oracle SQL Developer 4.0.0.12.84(点击可进入下载页面) 特别说明:最初我用的一直是高版本的Oracle SQL Developer,但在数据库移植两...
  • javaee_sunny
  • javaee_sunny
  • 2016-10-20 17:14
  • 789

sqlserver数据库迁移到mysql的方法和步骤

一.迁移方法 工具:用mysql yog,下载地址1:http://wh.uzzf.com//jxl/SQLyog_Enterprise_chs.zip 下载地址2:http://yunpan.cn/QazFaTkuUpwmf (提取码:2310) 步骤: 1.在mysql中选择要迁移到数据...
  • LT_1029
  • LT_1029
  • 2014-08-26 17:12
  • 3795

数据从mysql迁移到hbase的一些思考及设计

mysql数据库中联合索引在迁移hbase的时候如何进行设计
  • molong1208
  • molong1208
  • 2016-11-27 10:22
  • 1519

MySQL数据库数据迁移到SQLserver

最近因工作需要,需要将mysql数据库迁移到sqlserver,仅仅是数据迁移,因此相对比较简单。对于mysql迁移到sqlserver,我们需要使用到mysql odbc驱动,然后透过sqlserver链接服务器的方式来访问mysql。具体见下文描述。
  • robinson_0612
  • robinson_0612
  • 2016-04-05 17:40
  • 7846

MySQL数据库从windows迁移到linux

前几天搭建了lamp环境,想把之前写的小东西迁到linux上运行,涉及到把mysql数据库的文件迁移到linux上,直接用fileZilla传过去应该不行,我试了下,反正没成功。下面是我采用的方法: (一)用mysqldump命令导出数据库文件: 在windows下cd到Mysql的bin目录: ...
  • Move_now
  • Move_now
  • 2016-08-13 18:32
  • 3020

SQLServer数据迁移到Mysql

Navicat 是卓软数码科技有限公司生产的一系列 MySQL、MariaDB、Oracle、SQLite、PostgreSQL 及 Microsoft SQL Server 的图形化数据库管理及发展软件。它有一个类似浏览器的图形使用者接口,支援多重连线到本地和远端数据库。它的设计合乎各种使用者的需...
  • l294333475
  • l294333475
  • 2015-01-20 15:13
  • 1501

MySQL数据库迁移到PostgreSQL

MySQL数据库迁移到PostgreSQL 查了不少资料,也尝试了一些,最后采用的办法如下:  1. 导出mysql表定义(无数据) mysqldump --no-data [dbname] >dbdef.sql 2. 使用mysql2postgres把脚本转换为pgsq...
  • xinpo66
  • xinpo66
  • 2014-01-15 23:33
  • 10930

HBase数据迁移至Hive

HBase数据迁移至Hive背景:需要将HBase中表xyz(列簇cf1,列val)迁移至Hive1. 建立Hive和HBase的映射关系1.1 运行hive shell进入hive命令行模式,运行如下脚本CREATE EXTERNAL TABLE hbase_table_1(key int, va...
  • dominic_tiger
  • dominic_tiger
  • 2017-04-19 10:24
  • 523

mysql数据迁移到mongodb之工具迁移

最近写mongodb的数据库操作,写得差不多了,不了解的可以看回spring MongoDB 集成crud操作(简单封装),现在准备把mysql数据迁移到mongodb,上网搜索了一些资料,上了mongodb的官网看了,在window下有一个mongodb客户端工具,可以直接把数据迁移到mongod...
  • yibing548
  • yibing548
  • 2016-01-20 21:28
  • 1821

mysql数据迁移mongodb

mysql数据迁移mongodb  最近写mongodb的数据库操作,写得差不多了,不了解的可以看回spring MongoDB 集成crud操作(简单封装),现在准备把mysql数据迁移到mongodb,上网搜索了一些资料,上了mongodb的官网看了,在window下...
  • zzjjiandan
  • zzjjiandan
  • 2014-06-06 09:17
  • 11946
    友情链接
    个人资料
    • 访问:12790次
    • 积分:327
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    最新评论