HBase的基础

一、HBase的概念

HBase的基础

二、HBase的体系结构

    

HBase的基础

 

三、HBase的基本原理

四、HBase的安装配置

1、本地模式(不需要HDFS(先stop-all.sh),保存在Linux的文件系统)

1)事先需要在/training/hbase-1.3.1目录下创建data目录: mkdir /training/hbase-1.3.1/data

2)进入到/training/hbase-1.3.1/conf目录下,

    (1)vi hbase-env.sh,修改如下信息:

         export JAVA_HOME=/training/jdk1.8.0_171

    (2)vi hbase-site.xml,在<configuration></configuration>之间添加如下信息:

                <property>

                  <name>hbase.rootdir</name>

                  <!--这个data事先需要创建-->

                  <value>file:///training/hbase-1.3.1/data</value>

                </property>

        3)启动HBase:start-hbase.sh

            starting master, logging to /training/hbase-1.3.1/logs/hbase-root-master-niit00.out

            只有HMaster

        4)hbase shell 登录到hbase上

            (*)创建学生表

                create 'student','info','grade'

            (*)登录到web Console上查看:http://niit00:16010

2、伪分布模式(需要HDFS环境)

0)需要将hadoop启动起来(如果已经启动了,就不需要执行这个命令):

    start-all.sh

1)上传hbase-1.3.1-bin.tar.gz到/tools目录下

2)将hbase-1.3.1-bin.tar.gz文件解压并安装到/training目录下

    tar -zvxf hbase-1.3.1-bin.tar.gz -C /training/

3)配置环境变量

    vi ~/.bash_profile

    在打开的.bash_profile文件中添加如下信息:

        export HBASE_HOME=/training/hbase-1.3.1

        export PATH=$HBASE_HOME/bin:$PATH

4)让环境变量生效

    source ~/.bash_profile

5)验证配置hbase的环境变量是否生效

    hbase       ----- 看看是否有Usage: hbase [<options>] <command> [<args>]信息,如果有则生效了,否则,配置有误

6)进入到/training/hbase-1.3.1/conf目录下

    cd /training/hbase-1.3.1/conf

    在该目录下找到如下文件进行修改:

    (a)vi hbase-env.sh,修改如下信息:

         (1)找到# export JAVA_HOME=/usr/java/jdk1.6.0/这句代码,将#号去掉,将/usr/java/jdk1.6.0改成你自己的JAVA_HOME路径

              我本机的JAVA_HOME的路径是:/training/jdk1.8.0_171,所以我修改好之后的样子如下:

              export JAVA_HOME=/training/jdk1.8.0_171

         (2)找到# export HBASE_MANAGES_ZK=true  将#号去掉即可

         (3)保存退出

    (b)vi hbase-site.xml,在<configuration></configuration>之间添加如下信息,

            注意下面的有IP的地址需要修改成你自己主机的IP地址或者主机名:

            

            <!--HBase的数据保存在HDFS对应目录-->

            <property>

              <name>hbase.rootdir</name>

              <value>hdfs://niit06:9000/hbase</value>

            </property>    

            <!--是否是分布式环境-->

            <property>

              <name>hbase.cluster.distributed</name>

              <value>true</value>

            </property>            

            <!--配置ZK的地址-->

            <property>

              <name>hbase.zookeeper.quorum</name>

              <value>niit06</value>

            </property>                

            <!--冗余度-->

            <property>

              <name>dfs.replication</name>

              <value>1</value>

            </property>    

    (c)vi regionservers,配置从节点地址(伪分布只有一台主机,所以配置一个即可):

            将localhost改成IP地址或者主机名:niit06

7)启动HBase:

    start-hbase.sh

8)使用jps命令查看,是否已经启动了如下三个进程(如果以下上个进程存在,则说明安装配置hbase成功了):

    HRegionServer

    HQuorumPeer

    HMaster

9)登录Web Console进程查看:

    http://niit01:16010

 

        

3、全分布模式(有三台主机:niit01(主节点)  niit02(从节点)  niit03(从节点))

    特别注意:如果没有特别说明的,以下所有的操作默认都是在主节点(niit01)上进行的

    

1)上传hbase-1.3.1-bin.tar.gz到/tools目录下

    2)将hbase-1.3.1-bin.tar.gz文件解压并安装到/training目录下

        tar -zvxf hbase-1.3.1-bin.tar.gz -C /training/

    3)配置环境变量(这里需要在三台主机上都要配置)

        vi ~/.bash_profile

        在打开的.bash_profile文件中添加如下信息:

            export HBASE_HOME=/training/hbase-1.3.1

            export PATH=$HBASE_HOME/bin:$PATH

    4)让环境变量生效

        source ~/.bash_profile

    5)验证配置hbase的环境变量是否生效

        hbase       ----- 看看是否有Usage: hbase [<options>] <command> [<args>]信息,如果有则生效了,否则,配置有误

    6)进入到/training/hbase-1.3.1/conf目录下

        cd /training/hbase-1.3.1/conf

        在该目录下找到如下文件进行修改:

        (a)vi hbase-env.sh,修改如下信息:

             (1)找到# export JAVA_HOME=/usr/java/jdk1.6.0/这句代码,将#号去掉,将/usr/java/jdk1.6.0改成你自己的JAVA_HOME路径

                  我本机的JAVA_HOME的路径是:/training/jdk1.8.0_171,所以我修改好之后的样子如下:

                  export JAVA_HOME=/training/jdk1.8.0_171

             (2)找到# export HBASE_MANAGES_ZK=true  将#号去掉即可 将true 改成false

             (3)保存退出

        (b)vi hbase-site.xml,在<configuration></configuration>之间添加如下信息,

                注意下面的有IP的地址需要修改成你自己主机的IP地址:

                

                <!--HBase的数据保存在HDFS对应目录-->

                <property>

                  <name>hbase.rootdir</name>

                  <value>hdfs://niit01:9000/hbase</value>

                </property>    

                <!--是否是分布式环境-->

                <property>

                  <name>hbase.cluster.distributed</name>

                  <value>true</value>

                </property>            

                <!--配置ZK的地址-->

                <property>

                  <name>hbase.zookeeper.quorum</name>

                  <value>niit01</value>

                </property>                

                <!--冗余度-->

                <property>

                  <name>dfs.replication</name>

                  <value>2</value>

                </property>    

                <!--主节点和从节点允许的最大时间误差-->

                <property>

                  <name>hbase.master.maxclockskew</name>

                  <value>180000</value>

                </property>    

        (c)vi regionservers,配置从节点地址:

                将localhost改成IP地址或者主机名:

                    niit02

                    niit03

    7)进入到/training目录下,将hbase-1.3.1整个目录复制到其他两个从节点上:

            scp -r hbase-1.3.1/ [email protected]:/training

            scp -r hbase-1.3.1/ [email protected]:/training

    7)启动HBase:

        start-hbase.sh

    8)使用jps命令查看,是否已经启动了如下三个进程(如果以下上个进程存在,则说明安装配置hbase成功了):

        HRegionServer

        HMaster

    9)登录Web Console进程查看:

        http://niit01:16010

 

4、HBase实现HA(在以上全分布模式的基础上,任意选择niit02或者niit03作为HMaster即可)

   假设我选择niit02作为备份的HMaster的话,我需要在niit02上手动启动一个HMaster进程即可:

hbase-daemon.sh start master

 

几种数据库的比较

Redis

mongdb

hbase

关系型数据库

特点:基于内存,key-value

基于文档式的nosql

基于列式的数据库

 

场景:

 

 

 

 

HBase的基础

五、HBase的基本操作

1、命令行

        创建表: create 'student','info','grade'

        插入数据: put 'student','stu001','info:name','Tom'

                  put 'student','stu001','info:age','24'

                  put 'student','stu001','info:gender','Male'

                  put 'student','stu001','grade:math','80'

                  put 'student','stu002','info:name','Mike'

        查询:scan 'student'

              get格式: get '表名','行键'

                       get 'student','stu001'

                       

        删除表:disable 'student'

                drop 'student'

2、Java API

注意:需要引入hbase安装目录下的所有的jar包,代码的中主机名需要在window下配置主机名与ip地址的映射关系    

package hbase.java;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.HTableDescriptor;

import org.apache.hadoop.hbase.MasterNotRunningException;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.ZooKeeperConnectionException;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HBaseAdmin;

import org.apache.hadoop.hbase.client.HTable;

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.util.Bytes;

import org.junit.Test;

 

public class TestHBaseDemo {

 

    public static void main(String[] args) throws Exception {

         createTable();

        // insertOne();

         //get();

        // scan();

        // dropTable();

        insertMultRecord();

    }

 

    private static void createTable() throws Exception {

        // 指定ZooKeeper地址,从zk中获取HMaster的地址

        // 注意:ZK返回的是HMaster的主机名, 不是IP地址 ---> 配置Windows的hosts文件

        // C:\Windows\System32\drivers\etc\hosts

        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum", "niit110");

        // 创建一个HBase的客户端

        HBaseAdmin client = new HBaseAdmin(conf);

        // 创建表: 通过表的描述符

        HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("students"));

        // 列族的信息

        HColumnDescriptor h1 = new HColumnDescriptor("info");

        HColumnDescriptor h2 = new HColumnDescriptor("grade");

        // 将列族加入表

        htd.addFamily(h1);

        htd.addFamily(h2);

        // 创建表

        client.createTable(htd);

        client.close();

    }

 

 

    private static void insertOne() throws Exception {

        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum", "niit110");

        // 指定表的客户端

        HTable table = new HTable(conf, "students");

        // 构造一条数据

        Put put = new Put(Bytes.toBytes("stu001"));

        put.addColumn(Bytes.toBytes("info"), // 列族的名字

                Bytes.toBytes("name"), // 列的名字

                Bytes.toBytes("Tom")); // 值

        // 插入

        table.put(put);

        table.close();

    }

 

    private static void dropTable() throws IOException {

        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum", "niit110");

        // 创建一个HBase的客户端

        HBaseAdmin client = new HBaseAdmin(conf);

        client.disableTable("students");

        client.deleteTable("students");

        client.close();

    }

 

    private static void scan() throws Exception {

        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum", "niit110");

        // 指定表的客户端

        HTable table = new HTable(conf, "students");

        // 创建一个扫描器 Scan

        Scan scanner = new Scan(); // ----> 相当于: select * from students;

        // scanner.setFilter(filter) ----> 过滤器

        // 执行查询

        ResultScanner rs = table.getScanner(scanner); // 返回ScannerResult --->

                                                        // Oracle中的游标

        for (Result r : rs) {

            String name = Bytes.toString(r.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));

            String age = Bytes.toString(r.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")));

            System.out.println(name + "   " + age);

        }

        table.close();

    }

 

 

    private static void get() throws Exception {

        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum", "niit110");

        // 指定表的客户端

        HTable table = new HTable(conf, "students");

        // 通过Get查询

        Get get = new Get(Bytes.toBytes("stu001"));

        // 执行查询

        Result record = table.get(get);

        // 输出

        String name = Bytes.toString(record.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));

        System.out.println(name);

        table.close();

    }

 

    private static void insertMultRecord() throws Exception {

        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum", "niit110");

        // 指定表的客户端

        HTable table = new HTable(conf, "students");

        // 构造集合,代表要插入的数据

        List<Put> listData = new ArrayList<Put>();

        for (int i = 0; i < 20; i++) {

            Put put = new Put(Bytes.toBytes("stu00" + i));

            put.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("Tom-" + i));

            int age = 20 + i;

            put.add(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(String.valueOf(age)));

            listData.add(put);

        }

        table.put(listData);

        table.close();

    }

}

3、Web Console: 端口 16010