【大数据技术底子 | 实验八】HBase实验:新建HBase表

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520



  

一、实验目标


  • 把握HBase数据模型(逻辑模型及物理模型);
  • 把握如何利用Java代码获得HBase连接,并纯熟Java对HBase数据库的根本利用,进一步加深对HBase表概念的理解。
二、实验要求

通过Java代码实现与HBase数据库连接,然后用Java API创建HBase表,向创建的表中写数据,末了将表中数据读取出来并展示。
三、实验原理

逻辑模型:HBase以表的形式存储数据,每个表由行和列组成,每个列属于一个特定的列族(Column Family)。表中的行和列确定的存储单元称为一个元素(Cell),每个元素保存了同一份数据的多个版本,由时间戳(Time Stamp)来标识。行健是数据行在表中的唯一标识,并作为检索记录的主键。在HBase中访问表中的行只有三种方式:通过单个行健访问、给定行键的范围扫描、全表扫描。行健可以是任意字符串,默认按字段顺序存储。表中的列定义为( <列族>: <限定符>),通过列族和限定符两部门可以唯一指定一个数据的存储列。元素由行健、列( <列族>: <限定符>)和时间戳唯一确定,元素中的数据以字节码的形式存储,没有范例之分。
物理模型:HBase是按照列存储的稀疏行/列矩阵,其物理模型实际上就是把概念模型中的一个行进行分割,并按照列族存储。
四、实验情况



  • 云创大数据实验平台:

  • Java 版本:jdk1.7.0_79
  • Hadoop 版本:hadoop-2.7.1
  • ZooKeeper 版本:zookeeper-3.4.6
  • HBase 版本:hbase-1.1.2
五、实验内容和步骤

本实验主要演示HBase Java API的一些根本利用,包括取得链接,创建表,写数据,查询等几个步骤,具体内容如下:
(一)启动HBase集群

首先,利用一键搭建启动Hbase集群。具体步骤参考:【大数据技术底子 | 实验七】HBase实验:摆设HBase。
  1. cd /usr/cstor/hbase/bin
  2. ./start-hbase.sh
复制代码

利用jps命令检察Java进程:

可以看到HBase集群启动成功。
(二)编写项目java代码

首先,在Eclipse中新建一个名为HbaseTest的Java Project。
其次,从HBase安装包的lib目次导入如下jar包到开辟工具(jar包的版本号以实际的安装中的版本号为主):
commons-codec-1.4.jar
commons-collections-3.2.2.jar
commons-configuration-1.6.jar
commons-lang-2.6.jar
commons-logging-1.2.jar
guava-12.0.1.jar
hadoop-auth-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-hdfs-2.7.2.jar
hbase-client-1.1.2.jar
hbase-common-1.1.2.jar
hbase-protocol-1.1.2.jar
htrace-core-3.1.0-incubating.jar
httpclient-4.4.jar
httpcore-4.4.jar
libfb303-0.9.2.jar
log4j-1.2.17.jar
metrics-core-2.2.0.jar
netty-all-4.0.23.Final.jar
protobuf-java-2.5.0.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.6.4.jar
zookeeper-3.4.6.jar
找到虚拟机内的HBase安装包的lib目次/usr/cstor/hbase/lib,然后将lib下的这些jar包导入到我们当地的项目lib目次内:

然后我们必要将这些jar包导入到我们的项目中,我们右键每一个jar包 -> Build Path -> Add to Build Path 即可导入成功:

导入成功后表现如下:

然后,获得HBase连接,代码实现:
  1. Configuration configuration = HBaseConfiguration.create();
  2. Connection connection;
  3. configuration.set("hbase.zookeeper.quorum", "slave1:2181,slave2:2181,master:2181");
  4. configuration.set("zookeeper.znode.parent", "/hbase");
  5. connection = ConnectionFactory.createConnection(configuration);
复制代码
然后,通过连接实现对HBase数据库的一些根本利用,如下:
新建HBase表,代码实现:
  1. //获得HBaseAdmin对象
  2. Admin admin = connection.getAdmin();
  3. //表名称
  4. String tn = "mytable";
  5. TableName tableName = TableName.valueOf(tn);
  6. //表不存在时创建表
  7. if(!admin.tableExists(tableName))
  8. {
  9.    //创建表描述对象
  10.    HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
  11.    //列簇1
  12.    HColumnDescriptor columnDescriptor1 = new HColumnDescriptor("c1".getBytes());
  13.    tableDescriptor.addFamily(columnDescriptor1);
  14.    //列簇2
  15.    HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("c2".getBytes());
  16.    tableDescriptor.addFamily(columnDescriptor2);
  17.    //用HBaseAdmin对象创建表
  18.    admin.createTable(tableDescriptor);
  19. }
  20. //关闭HBaseAdmin对象
  21. admin.close();
复制代码
向表put数据,代码实现:
  1. //获得table接口
  2. Table table = connection.getTable(TableName.valueOf("mytable"));
  3. //添加的数据对象集合
  4. List<Put> putList = new ArrayList<Put>();
  5. //添加10行数据
  6. for(int i=0; i<10; i++)
  7. {
  8.    //put对象(rowkey)
  9.    String rowkey = "mykey" + i;
  10.    Put put = new Put(rowkey.getBytes());
  11.    //列簇 , 列名, 值
  12.    put.addColumn("c1".getBytes(), "c1tofamily1".getBytes(), ("aaa"+i).getBytes());
  13.    put.addColumn("c1".getBytes(), "c2tofamily1".getBytes(), ("bbb"+i).getBytes());
  14.    put.addColumn("c2".getBytes(), "c1tofamily2".getBytes(), ("ccc"+i).getBytes());
  15.    putList.add(put);
  16. }
  17. table.put(putList);
  18. table.close();
复制代码
查询数据,代码实现:
  1. //获得table接口(这行代码注意取舍,如果查询的代码和插入代码在同一个类中,则可以不要下面的这行)
  2. Table table = connection.getTable(TableName.valueOf("mytable"));
  3. //Scan 对象
  4. Scan scan = new Scan();
  5. //限定rowkey查询范围
  6. scan.setStartRow("mykey0".getBytes());
  7. scan.setStopRow("mykey9".getBytes());
  8. //只查询c1:c1tofamily1列
  9. scan.addColumn("c1".getBytes(), "c1tofamily1".getBytes());
  10. //过滤器集合
  11. FilterList filterList = new FilterList();
  12. //查询符合条件c1:c1tofamily1==aaa7的记录
  13. Filter filter1 = new SingleColumnValueFilter("c1".getBytes(), "c1tofamily1".getBytes(),
  14. CompareFilter.CompareOp.EQUAL, "aaa7".getBytes());
  15. filterList.addFilter(filter1);
  16. scan.setFilter(filterList);
  17. ResultScanner results = table.getScanner(scan);
  18. for (Result result : results) {  
  19.     System.out.println("获得到rowkey:" + new String(result.getRow()));
  20.     for (Cell cell : result.rawCells()) {
  21.         System.out.println("列簇:" +
  22.             Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength()) + "列:" +
  23.             Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(),cell.getQualifierLength()) + "值:" +
  24.             Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
  25.     }
  26. }
  27. results.close();
  28. table.close();
复制代码
:完备代码如下:
  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.hbase.*;
  3. import org.apache.hadoop.hbase.client.*;
  4. import org.apache.hadoop.hbase.filter.CompareFilter;
  5. import org.apache.hadoop.hbase.filter.Filter;
  6. import org.apache.hadoop.hbase.filter.FilterList;
  7. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
  8. import org.apache.hadoop.hbase.util.Bytes;
  9. import java.io.IOException;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. public class Main {
  13.     public static void main(String[] args) {
  14.         Configuration configuration = HBaseConfiguration.create();
  15.         Connection connection;
  16.         configuration.set("hbase.zookeeper.quorum", "slave1:2181,slave2:2181,master:2181");
  17.         configuration.set("zookeeper.znode.parent", "/hbase");
  18.         try {
  19.             connection = ConnectionFactory.createConnection(configuration);
  20.             //获得HBaseAdmin对象
  21.             Admin admin = connection.getAdmin();
  22.             //表名称
  23.             String tn = "mytable";
  24.             TableName tableName = TableName.valueOf(tn);
  25.             //表不存在时创建表
  26.             if (!admin.tableExists(tableName)) {
  27.                 //创建表描述对象
  28.                 HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
  29.                 //列簇1
  30.                 HColumnDescriptor columnDescriptor1 = new HColumnDescriptor("c1".getBytes());
  31.                 tableDescriptor.addFamily(columnDescriptor1);
  32.                 //列簇2
  33.                 HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("c2".getBytes());
  34.                 tableDescriptor.addFamily(columnDescriptor2);
  35.                 //用HBaseAdmin对象创建表
  36.                 admin.createTable(tableDescriptor);
  37.             }
  38.             //关闭HBaseAdmin对象
  39.             admin.close();
  40.             //向表put数据,代码实现:
  41.             //获得table接口
  42.             Table table = connection.getTable(TableName.valueOf("mytable"));
  43.             //添加的数据对象集合
  44.             List<Put> putList = new ArrayList<Put>();
  45.             //添加10行数据
  46.             for (int i = 0; i < 10; i++) {
  47.                 //put对象(rowkey)
  48.                 String rowkey = "mykey" + i;
  49.                 Put put = new Put(rowkey.getBytes());
  50.                 //列簇 , 列名, 值
  51.                 put.addColumn("c1".getBytes(), "c1tofamily1".getBytes(), ("aaa" + i).getBytes());
  52.                 put.addColumn("c1".getBytes(), "c2tofamily1".getBytes(), ("bbb" + i).getBytes());
  53.                 put.addColumn("c2".getBytes(), "c1tofamily2".getBytes(), ("ccc" + i).getBytes());
  54.                 putList.add(put);
  55.             }
  56.             table.put(putList);
  57.             table.close();
  58.             //查询数据,代码实现:
  59.             //获得table接口
  60.             //Scan 对象
  61.             Scan scan = new Scan();
  62.             //限定rowkey查询范围
  63.             scan.setStartRow("mykey0".getBytes());
  64.             scan.setStopRow("mykey9".getBytes());
  65.             //只查询c1:c1tofamily1列
  66.             scan.addColumn("c1".getBytes(), "c1tofamily1".getBytes());
  67.             //过滤器集合
  68.             FilterList filterList = new FilterList();
  69.             //查询符合条件c1:c1tofamily1==aaa7的记录
  70.             Filter filter1 = new SingleColumnValueFilter("c1".getBytes(), "c1tofamily1".getBytes(), CompareFilter.CompareOp.EQUAL, "aaa7".getBytes());
  71.             filterList.addFilter(filter1);
  72.             scan.setFilter(filterList);
  73.             ResultScanner results = table.getScanner(scan);
  74.             for (Result result : results) {
  75.                 System.out.println("获得到rowkey:" + new String(result.getRow()));
  76.                 for (Cell cell : result.rawCells()) {                    
  77.                     System.out.println("列簇:" +
  78.                         Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) + "列:" +
  79.                         Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + "值:" +
  80.                         Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
  81.                 }
  82.             }
  83.             results.close();
  84.             table.close();
  85.         } catch (IOException e) {
  86.             e.printStackTrace();
  87.         }
  88.     }
  89. }
复制代码
末了,要点击菜单栏中的Run,选择Run As -> Java Application。这将主动创建一个默认的运行配置。

(三)将代码导出jar包

将上述代码打成jar包,注意要选择Runnable JAR file:

Launch configuration选择Main - HbaseTest:(注意:若上一步中,没有选择Run As -> Java Application创建运行配置,这里则没有Main - HbaseTest的选项)

用WinSCP工具上传到客户端节点:

末了,将Java代码打成jar包,并上传到客户端执行。
  1. java -jar HbaseTest.jar
复制代码

六、实验结果

表创建完,然后添加数据后,可以通过shell检察mytable表数据,共插入10条数据,数据内容如图所示。
  1. cd /usr/cstor/hbase/bin
  2. ./hbase shell
复制代码

  1. scan 'mytable'
复制代码

七、实验心得

  在本次实验中,我通过Java代码实现了与HBase数据库的连接,并进行了创建表、插入数据和查询数据的利用。这一过程中,我对HBase的逻辑模型和物理模型有了更深刻的理解。
  首先,HBase作为一个列式存储的数据库,以表的形式存储数据,每个表由行和列组成。通过实验,我相识到HBase中的行键是数据行的唯一标识,可以用于检索记录。在列的定义中,由列族和限定符组合唯一确定一个数据的存储位置。通过这些底子知识,我可以大概更好地理解HBase的数据构造方式,尤其是其多版本数据管理的独特优势。
  其次,实验中我学习了如何通过Java代码创建HBase表。通过连接HBase服务器,利用Java API获取HBase的管理对象,并在表不存在时创建表,定义列族。接下来,我利用了Put对象将数据插入表中。通过这种方式插入多行数据,验证了HBase在海量数据处置惩罚和存储上的效率与优势。
  末了,我完成了对数据的查询利用。在查询时,我利用了扫描和过滤器来限定查询条件。这种机动的查询方式让我体验到了HBase对于复杂数据分析和处置惩罚的支持。
  此次实验强化了我对HBase数据库利用的把握,使我认识到HBase在分布式情况下的应用潜力。通过Java代码与HBase的交互,我加深了对HBase表和列族概念的理解,把握了其增删查改的根本利用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表