Hbase客户端Api使用笔记
开发环境
系统 | 版本 | 下载地址 |
Idea | 1.4 | 下载 |
hbase | 1.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进行配置
返回值 | 函数 | 描述 |
void | addResource(Path file) | 通过给定的路径所指的文件来添加资源 |
void | clear() | 清空所有已设置的属性 |
string | get(String name) | 获取属性名对应的值 |
String | getBoolean(String name, boolean defaultValue) | 获取为boolean类型的属性值,如果其属性值类型部位boolean,则返回默认属性值 |
void | set(String name, String value) | 通过属性名来设置值 |
void | setBoolean(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数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。
返回值 | 函数 | 描述 |
void | addColumn(String tableName, HColumnDescriptor column) | 向一个已经存在的表添加咧 |
checkHBaseAvailable(HBaseConfiguration conf) | 静态函数,查看HBase是否处于运行状态 | |
createTable(HTableDescriptor desc) | 创建一个表,同步操作 | |
deleteTable(byte[] tableName) | 删除一个已经存在的表 | |
enableTable(byte[] tableName) | 使表处于有效状态 | |
disableTable(byte[] tableName) | 使表处于无效状态 | |
HTableDescriptor[] listTables() | 列出所有用户控件表项 | |
void | modifyTable(byte[] tableName, HTableDescriptor htd) | 修改表的模式,是异步的操作,可能需要花费一定的时间 |
boolean | tableExists(String tableName) | 检查表是否存在 |
用法示例:
HBaseAdmin admin = new HBaseAdmin(config);
admin.disableTable("tablename")
HTableDescriptor
关系:org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字极其对应表的列族
返回值 | 函数 | 描述 |
void | addFamily(HColumnDescriptor) | 添加一个列族 |
HColumnDescriptor | removeFamily(byte[] column) | 移除一个列族 |
byte[] | getName() | 获取表的名字 |
byte[] | getValue(byte[] key) | 获取属性的值 |
void | setValue(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表直接通信。此方法对于更新操作来说是非线程安全的。
返回值 | 函数 | 描述 |
void | checkAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put | 自动的检查row/family/qualifier是否与给定的值匹配 |
void | close() | 释放所有的资源或挂起内部缓冲区中的更新 |
Boolean | exists(Get get) | 检查Get实例所指定的值是否存在于HTable的列中 |
Result | get(Get get) | 获取指定行的某些单元格所对应的值 |
byte[][] | getEndKeys() | 获取当前一打开的表每个区域的结束键值 |
ResultScanner | getScanner(byte[] family) | 获取当前给定列族的scanner实例 |
HTableDescriptor | getTableDescriptor() | 获取当前表的HTableDescriptor实例 |
byte[] | getTableName() | 获取表名 |
static boolean | isTableEnabled(HBaseConfiguration conf, String tableName) | 检查表是否有效 |
void | put(Put put) | 向表中添加值 |
用法示例:
HTable table = new HTable(conf, Bytes.toBytes(tablename));
ResultScanner scanner = table.getScanner(family);
Put
关系:org.apache.hadoop.hbase.client.Put
作用:用来对单个行执行添加操作
返回值 | 函数 | 描述 |
Put | add(byte[] family, byte[] qualifier, byte[] value) | 将指定的列和对应的值添加到Put实例中 |
Put | add(byte[] family, byte[] qualifier, long ts, byte[] value) | 将指定的列和对应的值及时间戳添加到Put实例中 |
byte[] | getRow() | 获取Put实例的行 |
RowLock | getRowLock() | 获取Put实例的行锁 |
long | getTimeStamp() | 获取Put实例的时间戳 |
boolean | isEmpty() | 检查familyMap是否为空 |
Put | setTimeStamp(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
作用:用来获取单个行的相关信息
返回值 | 函数 | 描述 |
Get | addColumn(byte[] family, byte[] qualifier) | 获取指定列族和列修饰符对应的列 |
Get | addFamily(byte[] family) | 通过指定的列族获取其对应列的所有列 |
Get | setTimeRange(long minStamp,long maxStamp) | 获取指定取件的列的版本号 |
Get | setFilter(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";
}
}