• HBase入门教程


    # 背景

    最近看到公司一个项目用到hbase, 之前也一直想看下hbase。个人理解Hbase作为一个nosql数据库,逻辑模型感觉跟关系型数据库有点类似。一个table,有row即行,列。不过列是一个列族,可以放多个字段,类似下面这种格式

    table users

    行   | 列族      | value     |   列族   |   value

    rows1  | info:name    | zhangsan   |   ....    |  ...

    rows1  | info:address  |  wudaokou   |   ....    |  ...   

    # 安装

    说下安装吧,有三种模式:单机、伪分布式、集群。这里我用的单机,官网:https://hbase.apache.org/downloads.html

    下载,解压

    安装步骤一定要安装官网说明来,博客这些都太老了

    1. hbase-env.sh设置JAVA_HOME

    2. hbase-site.xml

    <configuration>
      <property>
        <name>hbase.rootdir</name>
        <value>file:///Users/gxf/hbase</value>
      </property>
      <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/Users/gxf/zookeeper</value>
      </property>
      <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>false</value>
        <description>
          Controls whether HBase will check for stream capabilities (hflush/hsync).
    
          Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
          with the 'file://' scheme, but be mindful of the NOTE below.
    
          WARNING: Setting this to false blinds you to potential data loss and
          inconsistent system state in the event of process and/or node failures. If
          HBase is complaining of an inability to use hsync or hflush it's most
          likely not a false positive.
        </description>
      </property>
    </configuration>

    这里,安装和单机部署基本完成

    $HBASE_HOME/bin/start-hbase.sh启动hbase

    http://localhost:16010/master-status这个能正确显示即启动成功

    # 使用

    hbaset提供了一个命令行客户端,我们可以使用命令行客户端,创建、删除、修改、查询表,插入记录,插叙记录,删除记录,修改记录

    $HBASE_HOME/bin/hbase shell

    启动客户端,基本命令在官网也可以看,建议在官网看。我也是搬运工,顺便熟悉一下,做个备忘录

    1. list命令,列出所有的表

    list

    2. 新建user表,列族为info,存放用户的基本信息

    create 'user', 'info'

    3. 删除表,要先disable,再drop

    disable 'user'
    drop 'user'

    4. 插入数据, put 'tablename', 'row', 'cf:col', 'value'

    put 'user', 'row1', 'info:name', 'guanxianseng'

    5. 查询数据 scan tablenanme

    scan 'user'

    # java客户端

    pom.xml

    <dependencies>
        <dependency>
          <groupId>org.apache.hbase</groupId>
          <artifactId>hbase-client</artifactId>
          <version>1.4.8</version>
        </dependency>
        <dependency>
          <groupId>org.apache.hbase</groupId>
          <artifactId>hbase</artifactId>
          <version>1.4.8</version>
        </dependency>
    
        <!-- log -->
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.25</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.8.0-beta2</version>
        </dependency>
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-slf4j-impl</artifactId>
          <version>2.11.0</version>
        </dependency>
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-core</artifactId>
          <version>2.11.1</version>
        </dependency>
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
          <version>2.11.1</version>
        </dependency>
    
      </dependencies>

    这里我用了log,所有加了log4j等log依赖

    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Delete;
    import org.apache.hadoop.hbase.client.Get;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.client.ResultScanner;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.client.Table;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class HBaseTest {
    
      private static Configuration conf = null;
      private static Connection connection = null;
      private static Admin admin = null;
      private static Logger logger = LoggerFactory.getLogger(HBaseTest.class);
    
      static {
        //设置连接信息
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "localhost");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        conf.setInt("hbase.rpc.timeout", 2000);
        conf.setInt("hbase.client.operation.timeout", 3000);
        conf.setInt("hbase.client.scanner.timeout.period", 6000);
        try {
          connection = ConnectionFactory.createConnection(conf);
          admin = connection.getAdmin();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
      public static void main(String[] args) throws Exception {
        String tableName = "test3";
        String[] colFam = new String[]{"colFam"};
    //    createTable(tableName, colFam);
    //    deleteTable(tableName);
    //    listTables();
    //    addData("users", "row3", "info", "name", "guanxianseng");
    //    deleteData("users", "row1", "info", "name");
    //    query("users", "row2", "info", "name");
        scan("users", "row1", "row2");
      }
    
      /**
       * scan数据
       * */
      public static void scan(String tableNameStr, String startRowKey, String stopRowKey)
          throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableNameStr));
        Scan scan = new Scan();
        ResultScanner resultScanner = table.getScanner(scan);
        for(Result result : resultScanner){
          showCell(result);
        }
      }
    
      /**
       * 查询数据
       * */
      public static void query(String tableNameStr, String rowkey, String colFam, String col)
          throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableNameStr));
        Get get = new Get(rowkey.getBytes());
        Result result = table.get(get);
        showCell(result);
      }
    
      /**
       * 打印一个cell所有数据
       * */
      private static void showCell(Result result){
        for(Cell cell : result.rawCells()){
          logger.info("rawname:{}, timestamp:{}, colFam:{}, colName:{}, value:{}", new String(CellUtil.cloneRow(cell)), cell.getTimestamp(),
                      new String(CellUtil.cloneFamily(cell)), new String(CellUtil.cloneQualifier(cell)), new String(CellUtil.cloneValue(cell)));
        }
      }
    
      /**
       * 删除数据
       * */
      public static void deleteData(String tableNameStr, String row,  String colFam, String col) throws IOException {
        Table table = connection.getTable(TableName.valueOf(tableNameStr));
        Delete delete = new Delete(row.getBytes());
        table.delete(delete);
        logger.info("delete tablename: {}, row:{}, colFam:{}, col:{}", tableNameStr, row, colFam, col);
      }
    
      /**
       * 向表中插入数据
       * */
      public static void addData(String tableNameStr, String rowkey, String colFam, String col, String value)
          throws IOException {
        TableName tableName = TableName.valueOf(tableNameStr);
        Table table = connection.getTable(tableName);
        Put put = new Put(rowkey.getBytes());
        put.addColumn(colFam.getBytes(), col.getBytes(), value.getBytes());
        table.put(put);
        table.close();
        logger.info("put table:{}, rowkey:{}, colFam:{}, col:{}, value:{}", tableNameStr, rowkey, colFam, col, value);
      }
    
      /**
       * 列出所有的表
       * */
      public static void listTables() throws IOException {
        HTableDescriptor[] hTableDescriptors = admin.listTables();
        for(HTableDescriptor hTableDescriptor : hTableDescriptors){
          logger.info("table :{}", hTableDescriptor.getTableName());
        }
      }
    
      /**
       * 创建表
       */
      public static void createTable(String tableNameStr, String[] colFam) {
        try {
          TableName tableName = TableName.valueOf(tableNameStr);
          Table table = connection.getTable(tableName);
          if (admin.tableExists(tableName)) {
            //表已经存在
            logger.info("table {} already exist", tableNameStr);
          } else {
            //表不存在
            HTableDescriptor hTableDescriptor = new HTableDescriptor(tableNameStr);
            for (String colStr : colFam) {
              HColumnDescriptor columnDescriptor = new HColumnDescriptor(colStr);
              hTableDescriptor.addFamily(columnDescriptor);
            }
            admin.createTable(hTableDescriptor);
            logger.info("creat table success");
            admin.close();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
      /**
       * 删除表 1. disable 2. delete
       */
      public static void deleteTable(String tableNameStr) throws Exception {
        TableName tableName = TableName.valueOf(tableNameStr);
        if (!admin.tableExists(tableName)) {
          logger.error("table :{} not exist", tableNameStr);
        } else {
          admin.disableTable(tableName);
          admin.deleteTable(tableName);
          logger.info("delete table:{}", tableNameStr);
        }
      }
    }

    这个java demo也参考了网上的demo

  • 相关阅读:
    深度解密Go语言之sync.map
    Golang常用框架
    fclist :lang=zh
    linux常用硬件故障排查工具之dmesg
    Go进阶53:从零Go实现WebsocketH5RDP/VNC远程桌面客户端
    wsl 2 设置静态 DNS 服务地址及 Linux 和 Windows 主机网络互相访问设置
    go.定时邮件发送
    使用arthas定位问题
    在kubernetes中定义覆盖docker中的命令和参数
    NGINX转发端口后却跳转到80端口的解决方法
  • 原文地址:https://www.cnblogs.com/luckygxf/p/10046381.html
Copyright © 2020-2023  润新知