文档章节

Hbase入库基于java

悲喜世界
 悲喜世界
发布于 01/15 14:14
字数 709
阅读 11
收藏 0

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

某天,忽然来任务,要做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;

© 著作权归作者所有

共有 人打赏支持
悲喜世界
粉丝 3
博文 23
码字总数 14227
作品 0
大兴
程序员
私信 提问
hbase无法启动

输入bin/start-hbase.sh后出现如下错误: /home/ted1orelee0308/hbase-1.2.6/bin/hbase: line 412: /usr/lib/jvm/java1.8.0_121/bin/java: No such file or directory /home/ted1orelee0308/......

hbbb
2017/09/27
110
1
hadoop hive hbase 入门学习 (二)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// hadoop 自学系列 hado......

curiousby
2015/03/08
0
0
2018-08-12期 Hbase本地模式安装部署

说明: Hbase部署模式有以下三种 (1)本地模式:本地模式不依赖于HDFS存储,将文件存储到操作系统本地目录,好处是我们不需要搭建HDFS集群,即可学些HBase相关命令及客户端操作。 (2)伪分...

JackmaSong
08/12
0
0
HBase实践 | HBase ThriftServer Kerberos认证

1.前置 用户可以通过ThriftServer来访问HBase服务,它的特点如下: ThriftServer代理用户访问HBase服务返回操作结果,用户客户端不需要直接跟HBase进行通信 用户可以使用java/python/php/c++...

封神
11/27
0
0
HBase实操 | 如何使用Java连接Kerberos的HBase

一.文档编写目的 出于CDH集群安全考虑,在CDH集群中增加了Kerberos认证机制。因为HBase的存储系统是基于Hadoop的存储,所以通过HBase客户端访问HBase数据库时需要进行身份认证。在Linux下使用...

封神
11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Range Sum Query - Immutable(leetcode303)

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1]sumRange(0, 2) -> 1sumRa......

woshixin
15分钟前
0
0
「阿里面试系列」面试加分项,从jvm层面了解线程的启动和停止

线程的启动的实现原理 线程停止的实现原理分析 为什么中断线程会抛出InterruptedException 线程的启动原理 前面我们简单分析过了线程的使用,通过调用线程的start方法来启动线程,线程启动后...

James-
21分钟前
0
0
转换 bytes 为 kb/mb/gb/tb/pb…

智能转换 bytes 为 kb/mb/gb/tb/pb… 用到了 math 模块中的一些函数 #!/usr/bin/env python# -*- coding: utf-8 -*-"""智能转换 bytes 为 kb/mb/gb/tb/pb..."""import mathdef conv...

郭恩洲_OSC博客
29分钟前
4
0
Mysql导出sql语句的方法及可能遇到的mysqldump: command not found

解决办法: 打开terminal    输入vi ~/.bash_profile    添加如下三行代码:    #mysql  PATH=$PATH:/usr/local/mysql/bin  export    保存并退出...

Liens
29分钟前
2
0
一文读懂,深入浅出 RPC框架

RPC 功能目标 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显...

别打我会飞
31分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部