Hbase搭建-基本操作

mysql:关系型数据库    RDBMS
hive: 数据仓库        进行数据分析,没有实时性
hbase:基于文档的数据库 nosql  not only sql


hive和hbase的区别:
    hbase:数据库,不支持分析
    hive:数据仓库,用作数据分析


hbase:基于hdfs的非关系型数据库,基于google的bigtable技术实现的。
       实时性,低延迟,分布式、可伸缩、大数据存储。

       数量级:十亿行 x 百万列 x 上千个版本

       读未提交:
        第一个会话修改的数据没有进行提交
        另一个会话进行读取        =====> 读取的是修改后的数据
        第一个会话进行回滚        =====> 回滚之后,没有修改


    总结:hbase是基于hadoop的一个提供随机定位和实时读写的大表数据库


配置hbase本地模式:
=================================
    1、tar开
        tar -xzvf hbase-1.2.6.tar.gz -C /soft

    2、创建符号链接
        ln -s hbase-1.2.6 hbase

    3、配置环境变量
        sudo nano /etc/profile,添加
        # hbase环境变量
        export HBASE_HOME=/soft/hbase
        export PATH=$PATH:$HBASE_HOME/bin

    3.5、使环境变量生效:
        source /etc/profile

    4、hbase-env.sh
        export JAVA_HOME=/soft/jdk


    5、hbase-site.xml
        <configuration>
            <property>
                <name>hbase.rootdir</name>
                <value>file:///home/centos/hbase</value>
            </property>
            <property>
                <name>hbase.zookeeper.property.dataDir</name>
                <value>/home/centos/hbase/zk</value>
            </property>
        </configuration>


    6、启动hbase:
        start-hbase.sh

    7、打开hbase的webUI:
        http://s101:16010

    8、停止hbase进程:
        stop-hbase.sh


配置hbase的完全分布式:
========================================================
1、修改hbase-site.xml
<configuration>
    <!-- 开启hbase的集群模式 -->
    <property>
         <name>hbase.cluster.distributed</name>
         <value>true</value>
    </property>
    <!-- 将hbase的工作目录放在hdfs中 -->
    <property>
         <name>hbase.rootdir</name>
         <value>hdfs://mycluster/user/hbase</value>
    </property>
    <!-- zk的工作目录,指定搭建zk指定的工作目录 -->
    <property>
         <name>hbase.zookeeper.property.dataDir</name>
         <value>/home/centos/zk</value>
    </property>
    <!-- 指定zk客户端的地址 -->
    <property>
         <name>hbase.zookeeper.quorum</name>
         <value>s102:2181,s103:2181,s104:2181</value>
    </property>
</configuration>


2、编辑hbase-env.sh        //配置hbase不使用内置zk

    export HBASE_MANAGES_ZK=false

3、编辑conf/regionservers文件,修改为
    s102
    s103
    s104

4、将hadoop配置文件夹下的core-site.xml和hdfs-site.xml
    拷贝到hbase/conf文件夹

5、分发hbase符号链接以及hbase安装目录
    xsync.sh /soft/hbase
    xsync.sh /soft/hbase-1.2.6


hbase含有两个进程:
    HMaster        //master节点
    HRegionServer    //slave节点



启动hadoop生态圈各个组件的启动步骤:
======================================================
    1、启动zk
        第一种方式:zkServer.sh start
        第二种方式:xzk.sh start

    2、启动hadoop:
        1)先启动zk
            xzk.sh start
        2)启动hadoop
            start-all.sh = start-dfs.sh + start-yarn.sh

    3、启动hive:
        1)先启动zk
            xzk.sh start
        2)启动hadoop
            start-all.sh = start-dfs.sh + start-yarn.sh

        3)启动hive或hiveserver2
            hive    ||    hiveserver2

    4、启动hbase:
        1)先启动zk
            xzk.sh start
        2)启动hdfs
            start-dfs.sh
        3)启动hbase
            start-hbase.sh


hbase的HA模式:
========================================
    备份主节点(backup-masters)在hbase/conf文件夹下的backup-masters文件中

    nano /soft/hbase/conf/backup-masters,添加
        s105




hbase错误处理:
========================================
    问题1:master节点挂掉,而regionserver节点还在启动
    解决1-1:hbase-daemons.sh stop regionserver
    解决1-2:编写脚本awk,使用kill -9 命令直接杀掉进程
         kill -9 `jps | grep HRegionServer | awk '{print $1}'`
          > /dev/null 2>&1        //输出重定向为空(输出,如错误信息,不打印)
        
         0、切换到root权限
          
         1、脚本编写/usr/local/bin/skill.sh
            #!/bin/bash
            kill -9 `jps | grep $1 | awk '{print $1}'`  > /dev/null 2>&1
         
         注意:脚本需要添加执行权限

         2、将skill.sh脚本分发至其他主机
            xsync.sh /usr/local/bin/skill.sh

         3、在s101中编写/usr/local/bin/xkill.sh
            #!/bin/bash
            if [ $# -gt 1 ] ; then echo use only one param ; exit ; fi
            if [ $# -lt 1 ] ; then echo use only one param ; exit ; fi
            for (( i=101 ; i<=105 ; i++ )); do
                tput setaf 2
                echo ================ s$i $1 ================
                tput setaf 9
                ssh s$i skill.sh $1
            done

         注意:脚本需要添加执行权限

         4、使用方法:
            xkill.sh + PName
            eg:
                xkill.sh HRegionServer

    awk:
        awk '{print $1}'    //以'\t'对每行进行切割,输出第一个数据
        awk -F ',' '{print $1}'    //将分隔符变为,


        
        
        

    杀死进程:kill PID
          eg: kill 10529

          kill -9 PID    //绝杀



    查看进程方式:
          1、netstat -anop | grep xxx    //网络进程
          2、jps            //java进程
          3、ps -Af | grep master    //linux进程




start-hbase.sh = hbase-daemon.sh start master
             + hbase-daemons.sh start regionserver
         + hbase-daemons.sh start master-backup

hbase数据结构:
====================
        hbase        RDBMS
    1、namespace        database
    2、table        table
    3、row            row
    4、col            col
    5、column family    x

        id    name    age
    row1    1    tom    10

    hbase中每行自带主键,称之为row id



hbase 客户端操作:
====================================
    hbase shell        //进入hbase客户端

        hbase                                                RDBMS
1、列出数据库    list_namespace                                show databases;
2、查看帮助    help 'command'                                    help show;
3、创建数据库    create_namespace 'ns1'                        create database d1;
4、删除数据库   drop_namespace 'ns1'                        drop database d1;
5、创建表    create 'ns1:t1', 'f1', 'f2'                        create table n1(id int, name varchar(20))
6、列出表    list_namespace_tables 'ns1'                        show tables;
7、删除表    drop 'ns1:t1'                                    drop table n1;
8、禁用表    disable 'ns1:t1'                                x
9、表描述    describe 'ns1:t1'                                desc n1;
10、添加数据    put 'ns1:t1','row1','f1:id','1'                insert into n1 values(1,'tom');
11、查看数据    scan 'ns1:t1'                                select * from n1;    
12、清空表    truncate 'ns1:t1'                                truncate n1;


HBase的API编程:
========================
注意:编程之前将hbase-site.xml\core-site.xml\hdfs-site.xml放置在项目中的resource目录下
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.2.6</version>
    </dependency>


hbase中的数据格式:byte[]

    /**
     * 创建数据库
     */
    @Test
    public void createDB() throws Exception {
        //初始化配置信息
        //Configuration conf = new Configuration();
        Configuration conf = HBaseConfiguration.create();
        //入口点,创建连接
        Connection conn = ConnectionFactory.createConnection(conf);
        //得到集群管理员权限,可以对数据库和表进行增删改查
        Admin admin = conn.getAdmin();
        //通过构建器模式,创建NamespaceDescriptor实例,并设置库名ns2
        NamespaceDescriptor nds = NamespaceDescriptor.create("ns2").build();  //NamespaceDecriptor nds = NamespaceDescriptor.create("ns2").build();
        //通过管理员创建数据库
        admin.createNamespace(nds);//admin.createNamespace(nds);
        admin.close();
        System.out.println("ok");

    }

    /**
     * 创建表
     */
    @Test
    public void createTable() throws Exception {
        //初始化配置信息
        //Configuration conf = new Configuration();
        Configuration conf = HBaseConfiguration.create();
        //入口点,创建连接
        Connection conn = ConnectionFactory.createConnection(conf);//Connection conn = ConnectionFactory.createConnection(conf);
        //得到集群管理员权限,可以对数据库和表进行增删改查
        Admin admin = conn.getAdmin(); //Admin admin = conn.getAdmin();

        //初始化tablename对象
        TableName tn = TableName.valueOf("ns2:t2");   //TableName tn = TableName.valueOf("ns2:t2");
        //得到表描述符
        HTableDescriptor table = new HTableDescriptor(tn);  HtableDescriptor table = new HTableDesriptor(tn);

        //得到列族的描述符
        HColumnDescriptor cf = new HColumnDescriptor("f1");  HColumnDesciptor cf = new HColumnDescriptor("f1");
        HColumnDescriptor cf2 = new HColumnDescriptor("f2");

        //在表中添加列族
        table.addFamily(cf);
        table.addFamily(cf2);

        //开始创建
        admin.createTable(table);  //admin.createTable(table);

        admin.close();
        System.out.println("ok");

    }

    /**
     * 添加数据到指定表
     */
    @Test
    public void putData() throws Exception {
        //初始化配置信息
        //Configuration conf = new Configuration();
        Configuration conf = HBaseConfiguration.create();
        //入口点,创建连接
        Connection conn = ConnectionFactory.createConnection(conf);  //Connection conn = ConnectionFactory.createConnection(conf);

        //通过getTable方法获取表的实例
        Table table = conn.getTable(TableName.valueOf("ns2:t2"));  //Table table = conn.getTable(TableName.valueOf("ns2:t2"));

        //创建put实例
        //hbase中任何值,都是以字节数组形式存在的
        Put put = new Put(Bytes.toBytes("row1"));   //Put = put = new Put(Bytes.toBytes("row1"));
        //添加列数据
        put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom"));
        
        //put.addColum(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom"));
        

        //创建数据
        table.put(put);   //table.put(put)
        System.out.println("ok");

        conn.close();//conn.coles();

    }

猜你喜欢

转载自www.cnblogs.com/zyde/p/9015528.html
今日推荐