Hbase入库基于java

Stella981
• 阅读 518

计划每周写一篇博客,督促自己快点学习,懒惰会让人上瘾,努力奋斗,不忘初心。

某天,忽然来任务,要做hbse入库,之前自学过hbase,感觉挺简单的,网上搜了些model直接撸码,一天完成核心功能,测试了下跑通了,更加需求建了两个表,每张表日录入数据量接近两千万,感觉挺简单的。大概过了快一个月,这个很简单的东西,罢工了提示查询失败。

因业务需要,设计时keyvalue定义很长,40多个字节,包含业务和时间,每天接近两千万的数据录入,只能坚持20多天,后来,多方求证,换了一种替代办法,每半个月建立一张新表,根据查询时间,判断要查询的表,从而获取数据。

总结:

    1、rowkey设计很重要,最好不大于8字节。如果超过了,考虑分表

    2、列族和列限定符尽量小,有利于加快查询速度。

啰嗦这么多,上代码。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.MasterNotRunningException;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

import com.hbase.insert.model.InsertModel;

@SuppressWarnings("all")
public class HbaseUtil {
    
    private static final Log log = LogFactory.getLog(HbaseUtil.class);
    
    private Configuration conf;
    private InsertModel insertModel;
    
    public HbaseUtil(InsertModel insertModel){
        this.conf=HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", insertModel.getIp());
        this.insertModel=insertModel;
    }
    
    
    /**
     * 创建表
     * @param tableName
     */
    public void createTable(String tableName){
        try {
            HBaseAdmin admin=new HBaseAdmin(conf);
            NamespaceDescriptor[] namespace=admin.listNamespaceDescriptors();
            int state=0;
            
            /*获取命名空间*/
            for(NamespaceDescriptor name:namespace){
                if(name.getName().equals(insertModel.getDataName())){
                    state=1;
                }
            }
            /*创建命名空间*/
            if(state==0){
                admin.createNamespace(NamespaceDescriptor.create(insertModel.getDataName()).build());
            }
            
            
            if(admin.tableExists(insertModel.getDataName()+":"+tableName)){
                log.info("tables Exists!");
            }else{
                
                /*创建表*/
                HTableDescriptor desc=new HTableDescriptor(TableName.valueOf(insertModel.getDataName()+":"+tableName));
                
                desc.addFamily(new HColumnDescriptor(insertModel.getFamilName()).setTimeToLive(insertModel.getTime()));
                admin.createTable(desc);
                log.info("create table Success!");
            }
            admin.close();
        } catch (MasterNotRunningException e) {
            log.error(e,e);
        } catch (ZooKeeperConnectionException e) {
            log.error(e,e);
        } catch (IOException e) {
            log.error("IOException ",e);
        }
    }
    
    public boolean getTableStatus(String tableName){
        try {
            HBaseAdmin admin=new HBaseAdmin(conf);
            return admin.tableExists(insertModel.getDataName()+":"+tableName);
            
        } catch (MasterNotRunningException e) {
            log.error(e,e);
        } catch (ZooKeeperConnectionException e) {
            log.error(e,e);
        } catch (IOException e) {
            log.error(e,e);
        }
        return false;
    }
    
    /**
     * 删除表
     */
    public void delTable(String tableName){
        try {
            HBaseAdmin admin=new HBaseAdmin(conf);
            if(admin.tableExists(insertModel.getDataName()+":"+tableName)){
                admin.disableTable(insertModel.getDataName()+":"+tableName);
                admin.deleteTable(insertModel.getDataName()+":"+tableName);
                log.info("Delete "+tableName+" Success!");
            }else{
                log.info("No Found This Table:"+tableName);
            }
            
        } catch (MasterNotRunningException e) {
            log.error(e,e);
        } catch (ZooKeeperConnectionException e) {
            log.error(e,e);
        } catch (IOException e) {
            log.error(e,e);
        }
    }
    /**
     * 添加数据
     */
    public void addData(List<String> lineContext,String Yesterday,String dataTime){
        HTable table = null;
        try {
            String[] text;
            Put put;
            String rowkey;
            
            List<Put> imsi=new ArrayList<Put>();
            
            for(String context:lineContext){  //imsi,phone
                text=context.split("\\,");
                if(text[1].startsWith("1")&&text[1].length()==11){
                    rowkey=text[0]+Yesterday;
                    put =new Put(Bytes.toBytes(rowkey)); //设置rowkey
                    put.add(Bytes.toBytes(insertModel.getFamilName()),Bytes.toBytes(insertModel.getCloumnName()),Bytes.toBytes(text[1]));
                    imsi.add(put);
                    
                }
                
            }
            table=new HTable(conf,Bytes.toBytes(insertModel.getDataName()+":"+insertModel.getImsiTable()+dataTime));
            table.put(imsi);

        } catch (IOException e) {
            log.error(e,e);
        }
        
    } 
    

}

其中InsertModel主要有一下字段。

    //数据库名
    private String dataName;
    //imsi表名
    private String imsiTable;
    //手机号表名
    private String msisdnTable;
    //源文件路径
    private String url;
    //Hbase Ip
    private String ip;
    //列族
    private String familyName;
    //列名
    private String cloumnName;
    //表值存储时间
    private Integer time;
    //多少行提交一次
    private Integer rowsize;
    /*表时间*/
    private String tableTime;
    /*参数日期前一天*/
    private String paramTime;

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这