1. 软件版本 & 部署:

maven:3.3.9,jdk:1.7 ,Struts2:2.3.24.1,Hibernate:4.3.6,Spring:4.2.5,MySQL:5.1.34,Junit:4,Myeclipse:2014;

Hadoop2.6.4,HBase1.1.2

源码下载:https://github.com/fansy1990/ssh_v3/releases

部署参考:http://blog.csdn.net/fansy1990/article/details/51356583

2. 系统功能及核心实现

2.1系统菜单

HBase表管理系统主要是对表以及表数据的相关操作;

2.2 表管理

直接打开Table管理界面,即可看到所有表的简要信息,包括数据库(namspace)、表名、简单表描述等;

这个查询的信息直接基于Admin的listTableNames方法,具体调用如下:

/*** 获取所有表* * @return* @throws IOException*/public List<HBaseTable> getTables() throws IOException {List<HBaseTable> list = new ArrayList<>();Admin admin = HadoopUtils.getHBaseConnection().getAdmin();TableName[] tables = admin.listTableNames();HBaseTable hTable = null;for (TableName t : tables) {hTable = new HBaseTable();hTable.setNameSpace(t.getNamespaceAsString());hTable.setTableName(t.getNameAsString());// HTableDescriptor htableDes = admin.getTableDescriptor(t);// System.out.println(htableDes.toString());// System.out.println(htableDes.toStringTableAttributes());// System.out.println(htableDes.getFamilies().toString());// System.out.println(htableDes.toStringCustomizedValues());hTable.setDescription(admin.getTableDescriptor(t).toStringCustomizedValues());setRegions(hTable, admin.getTableRegions(t));list.add(hTable);}return list;}

2.2.1 表详细

表详细功能需要先选定一行记录,否则会提示:

选择一个记录后,点击表详细即可弹出表详细信息:

后台实现通过admin.getTableDescriptor即可获得表的详细信息,但是需要提供表名,表名可以从前天传入即可,如下:

/*** 获取指定表详细信息* * @param tableName* @return* @throws IOException*/public String getTableDetails(String tableName) throws IOException {Admin admin = HadoopUtils.getHBaseConnection().getAdmin();HTableDescriptor tableDescriptors = admin.getTableDescriptor(getTableName(tableName));System.out.println(tableDescriptors.toStringCustomizedValues());System.out.println(tableDescriptors.toString());return admin.getTableDescriptor(getTableName(tableName)).toString();}

2.2.2 表新增

表新增功能只是提供一个简单的新增,即只提供表名、列簇名即可,如下:

同时提交后台后,如果表已经存在则会进行对应的提示,后台通过遍历所有表名实现此功能,效率不高,实现如下:

public boolean checkTableExists(String tableName) throws IOException {Admin admin = HadoopUtils.getHBaseConnection().getAdmin();TableName[] tables = admin.listTableNames();for (TableName t : tables) {if (t.getNameAsString().equals(tableName)) {return true;}}return false;}

新增表,通过admin的createTable实现:

public boolean saveTable(String tableName, String cfs) throws IOException {Admin admin = HadoopUtils.getHBaseConnection().getAdmin();HTableDescriptor hTableDescriptor = new HTableDescriptor(getTableName(tableName));String[] cfsArr = StringUtils.split(cfs, Utils.COMMA);for (String cf : cfsArr) {hTableDescriptor.addFamily(new HColumnDescriptor(cf));}admin.createTable(hTableDescriptor);return true;}

2.2.3 表删除

表删除,同样需要选择一条记录,如果没有选择记录,同样会提示选择表,选择表后,点击删除,会进行下面的提示:

如果点击OK,则删除,Cancel则取消;

删除实现,同样使用Admin的disableTable, deleteTable方法

public boolean deleteTable(String tableName) throws IOException {Admin admin = HadoopUtils.getHBaseConnection().getAdmin();admin.disableTable(getTableName(tableName));admin.deleteTable(getTableName(tableName));return true;}

备注: 这里应该先判断此表是否是enable状态,如果不是则直接删除;如果是disable状态,则执行上述代码会有问题;

2.3 表数据管理

在打开表数据管理页面后,会初始化表名的下拉框,下拉框中数据的获取采用AJax的方式访问后台获取,方法同样使用Admin的listTableNames方法;

在选择一个表后,会初始化列簇名下拉框数据和start rowkey ,如下:

在查询数据时,可以选择多个列簇名,同时可以修改Start rowkey ,选择记录数以及版本数;

根据表名获取列簇名后台代码实现如下(通过HTableDescriptor的getColumnFamilies方法获取):

public List<TextValue> getTablesColumnFamily(String tableName)throws IOException {List<TextValue> list = new ArrayList<>();Admin admin = HadoopUtils.getHBaseConnection().getAdmin();HTableDescriptor tableDescriptor = admin.getTableDescriptor(getTableName(tableName));HColumnDescriptor[] columnDescriptors = tableDescriptor.getColumnFamilies();for (HColumnDescriptor t : columnDescriptors) {list.add(new TextValue(t.getNameAsString()));}return list;}

以及start rowKey的后台代码如下(即,只读取第一行数据,然后返回其rowkey):

public String getTableRowKey(String tableName) throws IOException {Table table = HadoopUtils.getHBaseConnection().getTable(getTableName(tableName));Scan scan = new Scan();ResultScanner scanner = table.getScanner(scan);Result firstRow = scanner.next();scanner.close();table.close();if (firstRow == null)return "-1";return new String(firstRow.getRow());}

根据表名、列簇名、start rowkey、版本数、记录数,获取数据的后台代码如下:

public List<HBaseTableData> getTableData(String tableName, String cfs,String startRowKey, int limit, int versions) throws IOException {List<HBaseTableData> datas = new ArrayList<>();Table table = HadoopUtils.getHBaseConnection().getTable(getTableName(tableName));Scan scan = new Scan();scan.setMaxVersions(versions);if (startRowKey != "-1") {scan.setStartRow(startRowKey.getBytes());}String[] cfsArr = cfs.split(Utils.COMMA, -1);for (String cf : cfsArr) {scan.addFamily(cf.getBytes());}ResultScanner scanner = table.getScanner(scan);Result[] rows = scanner.next(limit);for (Result row : rows) {// Cell[] cells = row.rawCells();datas.addAll(getFromCells(row.rawCells()));}scanner.close();table.close();return datas;}

通过设置Scan的maxVersions以及startRow 来限定版本数和开始遍历位置,通过设置scanner.next来限定获取的记录数;

3.1 新增

数据新增,通过指定表名、列簇名即可,如果列簇名指定多个,会提示错误:

数据新增使用window弹出框,为了把表名和列簇名传递到该window,使用了url加参数的方法(比较别扭的方式),具体如下:

var win_table_add_data_ = $('#win_table_add_data').window({    width:450,    height:350,    modal:true,left:400,top:150,title:'数据新增',collapsible:false,minimizable:false,maximizable:false,
//      content: '<div style="padding:30px 20px 10px 20px;">' + "a" +'</div>'content: '<iframe id="tabIframe" src="hbaseCommand/data_add.jsp?tableName='+tableName_+'&cf='+cf_+'" frameborder="0" style="border:0;width:100%;height:100%;">',
//      href:"hbaseCommand/data_add.jsp",onOpen:function(){    // 修改对应的值;
//          $('#data_add_ff_tableName').val(getFakeData('cc_data_retrieve_tableName'));
//          $('#data_add_ff_family').val(cf_);
//          $('#data_add_ff_family').textbox('setValue',cf_);  }});

在弹出框中,用户可以输入rowkey,column,vlaue :

表名、列簇名不可编辑,用户点击添加后,直接put数据到表中;

public boolean saveTableData(String tableName, String cfs, String rowkey,String column, String value) throws IOException {Table table = HadoopUtils.getHBaseConnection().getTable(getTableName(tableName));Put put = new Put(Bytes.toBytes(rowkey));put.addColumn(Bytes.toBytes(cfs), Bytes.toBytes(column),Bytes.toBytes(value));table.put(put);table.close();return true;}

3.3.2数据删除

直接根据提供的数据使用checkAndDelete进行删除,防止在删除的时候数据被修改:

public boolean deleteTableData(String tableName, String family,String qualifier, String rowkey, String value, long timestamp)throws IOException {Table table = HadoopUtils.getHBaseConnection().getTable(getTableName(tableName));Delete delete = new Delete(Bytes.toBytes(rowkey));delete.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier),timestamp);boolean flag = table.checkAndDelete(Bytes.toBytes(rowkey),Bytes.toBytes(family), Bytes.toBytes(qualifier),Bytes.toBytes(value), delete);table.close();return flag;}

3.3.3 数据更新

数据更新,同样需要选择一条记录,弹出框的方式类似数据新增(比较别扭的方式),不过可修改的内容只有值而已:

除了值之外,其他输入框都是只读的;后台实现,同样使用checkAndPut 方法:

public boolean updateTableData(String tableName, String cfs, String rowkey,String column, String value, long timestamp, String oldValue)throws IOException {Table table = HadoopUtils.getHBaseConnection().getTable(getTableName(tableName));Put put = new Put(Bytes.toBytes(rowkey));put.addColumn(Bytes.toBytes(cfs), Bytes.toBytes(column), timestamp,Bytes.toBytes(value));table.checkAndPut(Bytes.toBytes(rowkey), Bytes.toBytes(cfs),Bytes.toBytes(column), Bytes.toBytes(oldValue), put);table.close();return true;}

4. 总结

1)HBase的相关API的使用不是很难,主要是如果是插入或者更新操作,需要保持记录前后一致,需要进行row lock,这时就需要用到checkAndXxx 操作了,具体可以参考:http://blog.csdn.net/fansy1990/article/details/51451583 ;

2) 数据新增和数据更新弹出框的方式比较别扭,可以考虑使用新的方式(因为要进行参数的传递);

分享,成长,快乐

脚踏实地,专注

转载请注明blog地址:http://blog.csdn.net/fansy1990

HBase表管理系统相关推荐

  1. hbase 用户名密码_HBase开源 | HBase表管理系统HBaseManager2.0.2

    1. 前言 在之前的文章中已经为大家简单介绍过HBaseManager,它提供界面化的方式来帮助我们有效地管理我们集群的HBase表信息.在HBase的维护工作中,绝大多数需要在HBase Shell ...

  2. 超简化版HBASE图书管理系统

    超简化版HBASE图书管理系统 参考博客:https://blog.csdn.net/mounwater/article/details/103734711 后面有源码截图* 简单点的话可以直接就一个 ...

  3. HBase表设计介绍

    概述 在不久的过去,大数据的应用越来越多.为了支持这些应用以及扩展老的应用,很多新的数据管理系统被开发出来,被称作大数据革命.这些系统中很多都是开源和社区驱动的.Apache Hbase就是这样的一个 ...

  4. HBase表结构设计(结构、创建、压缩、分区、命名空间等)

    HBase表结构设计(结构.创建.分区.命名空间等) 任务表述: 如果用户点击某一行数据则触发接口写数据进入HBase.那么当用户再次读取数据的时候数据A和数据B返回的数据就需要给返回的数据另外增加一 ...

  5. 16进制 hbase phoenix_【建议收藏】HBase表的RowKey设计

    Hello,大家好,我是勾叔.今天和大家谈一下HBase表的RowKey设计,谈HBase表的RowKey设计之前,先来认识RowKey. RowKey简介 RowKey,即每行数据的主键.Rowke ...

  6. HBase表创建、删除、清空

    HBase shell窗口进入 执行命令hbase shell rowkey(行键) product(列簇) food(列簇) name(列标识符) price(列标识符) name price(列标 ...

  7. java导出hbase表数据_通用MapReduce程序复制HBase表数据

    编写MR程序,让其可以适合大部分的HBase表数据导入到HBase表数据.其中包括可以设置版本数.可以设置输入表的列导入设置(选取其中某几列).可以设置输出表的列导出设置(选取其中某几列). 原始表t ...

  8. Phoenix 关联映射 Hbase表 获取不到数据,upsert hbase 列名为16进制字符

    创建Hbase表 create 'phoenix_hbase_test','cf1','cf2' put 'phoenix_hbase_test', 'key1','cf1:name','zhangs ...

  9. Phoenix 关联hbase表历史数据

    Phoenix 基本使用 进入Phoenix phoenix-sqlline.py 10.248.161.18:2181:/hbase 或者进入目录下执行 cd /opt/cloudera/parce ...

最新文章

  1. 彻底理解H5的DOM事件
  2. python计算机结构_python06--计算机内存结构与存储管理(P27)
  3. 一次系统调用开销到底有多大?
  4. Appointment detail page loading never ends in Zeiss
  5. php 派生类 构造,C++派生类的构造函数和析构函数
  6. 使用recyclerView实现无限循环banner效果
  7. python脚本打包rpm_python程序打包rpm包
  8. 基于FPGA实现Camera Link接口
  9. linux 环境下的进程间的通信——消息队列传输结构体
  10. UNIX环境高级编程之第1章:UNIX基础知识
  11. 百度网盘终于不限速了!?
  12. cmd命令查询电脑序列号_如何查看台式电脑序列号
  13. 【原创】St2-057检测工具(Apache Struts2远程代码执行高危漏洞)
  14. 不重启刷新win7环境变量(注册表)
  15. 【LabVIEW】基于LabVIEW的俄罗斯方块小游戏
  16. 镁光闪存颗粒对照表_最全的内存颗粒编码规则说明,教你看穿内存条到底用的什么颗粒...
  17. 双一次算法作业hhhhhhhhh
  18. 三个人的友谊显的有些拥挤了...
  19. java实现附件预览(openoffice+swftools+flexpaper)
  20. 用降群的方法来解算还原魔方的步骤C++

热门文章

  1. ArcGIS 实验理论基础十五 空间查询
  2. “北大数学系扫地僧” 等十人获奖,均分1000万元,达摩院2021青橙奖出炉
  3. axure图标元件库icons满足不了需求?[一分钟教会你在axure下使用各式各样炫酷icons]!! 仅限谷歌浏览器
  4. 跨平台SIP 客户端-linphone下载、使用
  5. img标签 src路径正确 但图片不显示
  6. 计算机数学的外文翻译,计算机 数学 外文翻译 外文文献 英文文献 模糊随机森林.doc...
  7. 使用C#进行串口通信开发上位机软件
  8. Three.js从入门到放弃
  9. 四川省全国计算机考试一年可以考几次,四川网络教育统考科目没通过怎么办,一年可以考几次?...
  10. Django二级域名路由配置方案django-hosts