Hbase JavaAPi介绍和使用示例(待更新)

Posted ZeroTeam_麒麟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hbase JavaAPi介绍和使用示例(待更新)相关的知识,希望对你有一定的参考价值。

Hbase客户端Api使用笔记

开发环境

系统版本下载地址
Idea1.4下载
hbase1.1.0下载

环境搭建

在这里我用的是Maven创建项目

初步预览

java类HBase数据模型
HBaseAdmin数据库(DataBase)
HBaseConfiguration
HTable表(Table)
HTableDescriptor列族(Column Family)
Put列修饰符(Column Qualifier)
Get
Scanner

HBaseConfiguration

关系:org.apache.hadoop.hbase.HBaseConfiguration

作用:对HBase进行配置

返回值函数描述
voidaddResource(Path file)通过给定的路径所指的文件来添加资源
voidclear()清空所有已设置的属性
stringget(String name)获取属性名对应的值
StringgetBoolean(String name, boolean defaultValue)获取为boolean类型的属性值,如果其属性值类型部位boolean,则返回默认属性值
voidset(String name, String value)通过属性名来设置值
voidsetBoolean(String name, boolean value)设置boolean类型的属性值

用法示例:

HBaseConfiguration hconfig = new HBaseConfiguration();
hconfig.set("hbase.zookeeper.property.clientPort","2181");

该方法设置了”hbase.zookeeper.property.clientPort”的端口号为2181。一般情况下,HBaseConfiguration会使用构造函数进行初始化,然后在使用其他方法。

HBaseAdmin

关系:org.apache.hadoop.hbase.client.HBaseAdmin

作用:提供了一个接口来管理HBase数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。

返回值函数描述
voidaddColumn(String tableName, HColumnDescriptor column)向一个已经存在的表添加咧
checkHBaseAvailable(HBaseConfiguration conf)静态函数,查看HBase是否处于运行状态
createTable(HTableDescriptor desc)创建一个表,同步操作
deleteTable(byte[] tableName)删除一个已经存在的表
enableTable(byte[] tableName)使表处于有效状态
disableTable(byte[] tableName)使表处于无效状态
HTableDescriptor[] listTables()列出所有用户控件表项
voidmodifyTable(byte[] tableName, HTableDescriptor htd)修改表的模式,是异步的操作,可能需要花费一定的时间
booleantableExists(String tableName)检查表是否存在

用法示例:

HBaseAdmin admin = new HBaseAdmin(config);
admin.disableTable("tablename")

HTableDescriptor

关系:org.apache.hadoop.hbase.HTableDescriptor

作用:包含了表的名字极其对应表的列族

返回值函数描述
voidaddFamily(HColumnDescriptor)添加一个列族
HColumnDescriptorremoveFamily(byte[] column)移除一个列族
byte[]getName()获取表的名字
byte[]getValue(byte[] key)获取属性的值
voidsetValue(String key, String value)设置属性的值

用法示例:

HTableDescriptor htd = new HTableDescriptor(table);
htd.addFamily(new HcolumnDescriptor("family"));

在上述例子中,通过一个HColumnDescriptor实例,为HTableDescriptor添加了一个列族:family

HColumnDescriptor

关系:org.apache.hadoop.hbase.HColumnDescriptor

作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。

返回值 |函数 |描述
byte[]| getName()| 获取列族的名字
byte[] |getValue(byte[] key)| 获取对应的属性的值
void| setValue(String key, String value)| 设置对应属性的值
用法示例:

HTableDescriptor htd = new HTableDescriptor(tablename);
HColumnDescriptor col = new HColumnDescriptor("content:");
htd.addFamily(col);

此例添加了一个content的列族

HTable

关系:org.apache.hadoop.hbase.client.HTable

作用:可以用来和HBase表直接通信。此方法对于更新操作来说是非线程安全的。

返回值函数描述
voidcheckAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put自动的检查row/family/qualifier是否与给定的值匹配
voidclose()释放所有的资源或挂起内部缓冲区中的更新
Booleanexists(Get get)检查Get实例所指定的值是否存在于HTable的列中
Resultget(Get get)获取指定行的某些单元格所对应的值
byte[][]getEndKeys()获取当前一打开的表每个区域的结束键值
ResultScannergetScanner(byte[] family)获取当前给定列族的scanner实例
HTableDescriptorgetTableDescriptor()获取当前表的HTableDescriptor实例
byte[]getTableName()获取表名
static booleanisTableEnabled(HBaseConfiguration conf, String tableName)检查表是否有效
voidput(Put put)向表中添加值

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
ResultScanner scanner =  table.getScanner(family);

Put

关系:org.apache.hadoop.hbase.client.Put

作用:用来对单个行执行添加操作

返回值函数描述
Putadd(byte[] family, byte[] qualifier, byte[] value)将指定的列和对应的值添加到Put实例中
Putadd(byte[] family, byte[] qualifier, long ts, byte[] value)将指定的列和对应的值及时间戳添加到Put实例中
byte[]getRow()获取Put实例的行
RowLockgetRowLock()获取Put实例的行锁
longgetTimeStamp()获取Put实例的时间戳
booleanisEmpty()检查familyMap是否为空
PutsetTimeStamp(long timeStamp)设置Put实例的时间戳

用法示例:

HTable table = new HTable(conf,Bytes.toBytes(tablename));
Put p = new Put(brow);//为指定行创建一个Put操作
p.add(family,qualifier,value);
table.put(p);

Get

关系:org.apache.hadoop.hbase.client.Get

作用:用来获取单个行的相关信息

返回值函数描述
GetaddColumn(byte[] family, byte[] qualifier)获取指定列族和列修饰符对应的列
GetaddFamily(byte[] family)通过指定的列族获取其对应列的所有列
GetsetTimeRange(long minStamp,long maxStamp)获取指定取件的列的版本号
GetsetFilter(Filter filter)当执行Get操作时设置服务器端的过滤器

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
Get g = new Get(Bytes.toBytes(row));

Result

关系:org.apache.hadoop.hbase.client.Result

作用:存储Get或者Scan操作后获取表的单行值。使用此类提供的方法可以直接获取值或者各种Map结构(key-value对)

返回值| 函数| 描述
boolean |containsColumn(byte[] family, byte[] qualifier) |检查指定的列是否存在
NavigableMap

开发示例

public class HbaseTestApi 
    static Configuration conf = null;
    static Connection conn = null;
    static Random ra = new Random();

    static 
        Configuration conf = HBaseConfiguration.create();
        //配置访问
        conf.set("hbase.zookeeper.quorum", "172.19.4.231,172.19.4.230,172.19.4.239");
        try 
            conn = ConnectionFactory.createConnection(conf);
         catch (IOException e) 
            e.printStackTrace();
        
    

    /**
     * 创建Hbase数据库表
     * TableName 表名
     * colmnsName 列族名
     */
    @Test
    public void CreateHbaseTable() throws IOException 
        //表名
        TableName test = TableName.valueOf("test");
        Admin admin = conn.getAdmin();
        //判断是否存在
        if (admin.tableExists(test)) 
            admin.disableTable(test);
            admin.deleteTable(test);
        
        //表
        HTableDescriptor ht = new HTableDescriptor(test);
        //列族
        HColumnDescriptor hc = new HColumnDescriptor("cf1".getBytes());
        //设置最大版本
        hc.setMaxVersions(5);
        hc.setBlockCacheEnabled(true);
        //Block
        hc.setBlocksize(1800000);
        //将 列族添加到 表中
        ht.addFamily(hc);
        //请求创建
        admin.createTable(ht);
        //关闭
        admin.close();
    

    /**
     * 插入
     */
    @Test
    public void insert() throws IOException 
        //获取表
        Table table = conn.getTable(TableName.valueOf("test"));
        //创建一个 Put数组,批量插入
        List<Put> putList = new ArrayList<Put>();
        for (int i = 0; i < 200; i++) 
            Put put = new Put(Bytes.toBytes(randomPhone()+"_"+System.currentTimeMillis()));
            put.addColumn("cf1".getBytes(), "name".getBytes(), randomUsername().getBytes());
            put.addColumn("cf1".getBytes(), "address".getBytes(), randomAddres().getBytes());
            put.addColumn("cf1".getBytes(), "phone".getBytes(), randomPhone().getBytes());
            put.addColumn("cf1".getBytes(), "type".getBytes(), randomType().getBytes());
            putList.add(put);
        
        //写入
        table.put(putList);
    

    /**
     * 扫描
     */
    @Test
    public void ScanTable() throws IOException 
        Table table = conn.getTable(TableName.valueOf("test"));
        Scan scan = new Scan("0_one".getBytes());
        ResultScanner scanner = table.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();
        while (iterator.hasNext()) 
            Result next = iterator.next();
            byte[] value = next.getValue("cf1".getBytes(), "name".getBytes());
            System.out.println(new String(value));
        
    

    /**
     * 模糊扫描
     */
    @Test
    public void findtype() throws IOException 
        Table table=conn.getTable(TableName.valueOf("test"));
        Scan scan=new Scan();
        FilterList filterlist=new FilterList(FilterList.Operator.MUST_PASS_ALL);
        PrefixFilter pf=new PrefixFilter("15".getBytes());
        SingleColumnValueFilter sf =new SingleColumnValueFilter("cf1".getBytes(),"address".getBytes(), CompareFilter.CompareOp.EQUAL,"湖南".getBytes());
        SingleColumnValueFilter sf1 =new SingleColumnValueFilter("cf1".getBytes(),"type".getBytes(), CompareFilter.CompareOp.EQUAL,"1".getBytes());
        filterlist.addFilter(pf);
        filterlist.addFilter(sf);
        filterlist.addFilter(sf1);
        scan.setFilter(filterlist);
        ResultScanner scanner = table.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();
        while(iterator.hasNext())
            Result next = iterator.next();
            byte[] type = next.getValue("cf1".getBytes(), "type".getBytes());
            byte[] addres = next.getValue("cf1".getBytes(), "address".getBytes());
            byte[] name = next.getValue("cf1".getBytes(), "name".getBytes());
            byte[] phone = next.getValue("cf1".getBytes(), "phone".getBytes());

            System.out.println(new String(type,"utf8"));
            System.out.println(new String(addres,"utf8"));
            System.out.println(new String(phone,"utf8"));
//            System.out.println(new String(value,"utf8"));
        
    

    /**
     * @return 随机名字
     */
    public static String randomUsername() 
        String name = "";
        for (int i = 0; i < 1; i++) 
            String[] firsname = "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈",
                    "楮", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕",
                    "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢",
                    "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范",
                    "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任",
                    "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺",
                    "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于",
                    "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟",
                    "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛",
                    "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋",
                    "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮",
                    "蓝", "闽", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童",
                    "颜", "郭", "梅", "盛", "林", "刁", "锺", "徐", "丘", "骆", "高", "夏",
                    "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管",
                    "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣",
                    "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉",
                    "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊",
                    "於", "惠", "甄", "麹", "家", "封", "芮", "羿", "储", "靳", "汲", "邴",
                    "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗",
                    "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲",
                    "伊", "宫", "宁", "仇", "栾", "暴", "甘", "斜", "厉", "戎", "祖", "武",
                    "符", "刘", "景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎",
                    "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂", "索", "咸",
                    "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能",
                    "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申",
                    "扶", "堵", "冉", "宰", "郦", "雍", "郤", "璩", "桑", "桂", "濮", "牛",
                    "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", "温", "别",
                    "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾",
                    "鱼", "容", "向", "古", "易", "慎", "戈", "廖", "庾", "终", "暨", "居",
                    "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文", "寇", "广", "禄",
                    "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩",
                    "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简",
                    "饶", "空", "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关",
                    "蒯", "相", "查", "后", "荆", "红", "游", "竺", "权", "逑", "盖", "益",
                    "桓", "公", "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连",
                    "皇甫", "尉迟", "公羊", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔",
                    "申屠", "公孙", "仲孙", "轩辕", "令狐", "锺离", "宇文", "长孙", "慕容", "鲜于",
                    "闾丘", "司徒", "司空", "丌官", "司寇", "仉", "督", "子车", "颛孙", "端木", "巫马",
                    "公西", "漆雕", "乐正", "壤驷", "公良", "拓拔", "夹谷", "宰父", "谷梁", "晋", "楚",
                    "阎", "法", "汝", "鄢", "涂", "钦", "段干", "百里", "东郭", "南门", "呼延",
                    "归", "海", "羊舌", "微生", "岳", "帅", "缑", "亢", "况", "后", "有", "琴",
                    "梁丘", "左丘", "东门", "西门", "商", "牟", "佘", "佴", "伯", "赏", "南宫",
                    "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟";
            String[] namelist = "伟", "伟", "芳", "伟", "秀英", "秀英", "娜", "秀英", "伟",
                    "敏", "静", "丽", "静", "丽", "强", "静", "敏", "敏", "磊", "军", "洋",
                    "勇", "勇", "艳", "杰", "磊", "强", "军", "杰", "娟", "艳", "涛", "涛",
                    "明", "艳", "超", "勇", "娟", "杰", "秀兰", "霞", "敏", "军", "丽", "强",
                    "平", "刚", "杰", "桂英", "芳", " 嘉懿", "煜城", "懿轩", "烨伟", "苑博", "伟泽",
                    "熠彤", "鸿煊", "博涛", "烨霖", "烨华", "煜祺", "智宸", "正豪", "昊然", "明杰",
                    "立诚", "立轩", "立辉", "峻熙", "弘文", "熠彤", "鸿煊", "烨霖", "哲瀚", "鑫鹏",
                    "致远", "俊驰", "雨泽", "烨磊", "晟睿", "天佑", "文昊", "修洁", "黎昕", "远航",
                    "旭尧", "鸿涛", "伟祺", "荣轩", "越泽", "浩宇", "瑾瑜", "皓轩", "擎苍", "擎宇",
                    "志泽", "睿渊", "楷瑞", "子轩", "弘文", "哲瀚", "雨泽", "鑫磊", "修杰", "伟诚",
                    "建辉", "晋鹏", "天磊", "绍辉", "泽洋", "明轩", "健柏", "鹏煊", "昊强", "伟宸",
                    "博超", "君浩", "子骞", "明辉", "鹏涛", "炎彬", "鹤轩", "越彬", "风华", "靖琪",
                    "明诚", "高格", "光华", "国源", "冠宇", "晗昱", "涵润", "翰飞", "翰海", "昊乾",
                    "浩博", "和安", "弘博", "宏恺", "鸿朗", "华奥", "华灿", "嘉慕", "坚秉", "建明",
                    "金鑫", "锦程", "瑾瑜", "晋鹏", "经赋", "景同", "靖琪", "君昊", "俊明", "季同",
                    "开济", "凯安", "康成", "乐语", "力勤", "良哲", "理群", "茂彦", "敏博", "明达",
                    "朋义", "彭泽", "鹏举", "濮存", "溥心", "璞瑜", "浦泽", "奇邃", "祺祥", "荣轩",
                    "锐达", "睿慈", "绍祺", "圣杰", "晟睿", "思源", "斯年", "泰宁", "天佑", "同巍",
                    "奕伟", "祺温", "文虹", "向笛", "心远", "欣德", "新翰", "兴言", "星阑", "修为",
                    "旭尧", "炫明", "学真", "雪风", "雅昶", "阳曦", "烨熠", "英韶", "永贞", "咏德",
                    "宇寰", "雨泽", "玉韵", "越彬", "蕴和", "哲彦", "振海", "正志", "子晋", "自怡",
                    "德赫", "君平";
            int a = (int) Math.abs(firsname.length * Math.random());
            int b = (int) Math.abs(namelist.length * Math.random());
            name = firsname[a] + namelist[b];
        
        return name;
    

    /**
     * 返回手机号码
     */
    public static String[] telFirst = "134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153".split(",");

    public static int getNum(int start, int end) 
        return (int) (Math.random() * (end - start + 1) + start);
    

    public static String randomPhone() 
        int index = getNum(0, telFirst.length - 1);
        String first = telFirst[index];
        String second = String.valueOf(getNum(1, 888) + 10000).substring(1);
        String thrid = String.valueOf(getNum(1, 9100) + 10000).substring(1);
        return first + second + thrid;
    


    /**
     * 地址
     */
    public static String randomAddres() 
        String[] address = "北京", "上海", "湖南", "深圳";
        String result = address[ra.nextInt(4)];
        return result;
    


    /**
     * 类型
     */
    public static String randomType() 

        return ra.nextInt(2) == 1 ? "1" : "0";
    


以上是关于Hbase JavaAPi介绍和使用示例(待更新)的主要内容,如果未能解决你的问题,请参考以下文章

Hbase-1.2.4 javaAPI实现简单的类CRUD操作

HBase Filter 过滤器之QualifierFilter详解

HBase Filter 过滤器之QualifierFilter详解

HBase JavaAPI

HBase的JavaAPI

HBase单节点下JavaAPI连接