Windows10环境下安装Hbase单机版

题记:


拉勾JAVA高薪训练营

1.下载安装包

hadoop官网地址:https://hadoop.apache.org/releases.html

hbase官网地址:http://archive.apache.org/dist/hbase

2.配置hadoop环境

在系统环境变量中增加HADOOP_HOME,并在path中增加%HADOOP_HOME%\bin

3.配置hbase环境

在hbase-1.2.10\conf下找到hbase-env.cmd

配置以下属性:

set HBASE_MANAGES_ZK=false
set JAVA_HOME=D:\DEV\env\jdk1.8.0_77

set HBASE_CLASSPATH=F:\hbase\hbase-1.2.10\conf

JAVA_HOME配置自己的jdk路径

HBASE_CLASSPATH配置自己的hbase中conf文件夹路径

在hbase-1.2.10\conf中找到hbase-site.xml

配置以下属性:

<configuration>
    <property>  
        <name>hbase.rootdir</name>  
        <value>file:///F:/hbase/hbase-1.2.10/root</value>  
    </property>  
    <property>  
        <name>hbase.tmp.dir</name>  
        <value>F:/hbase/hbase-1.2.10/tem</value>  
    </property>  
    <property>  
        <name>hbase.zookeeper.quorum</name>  
        <value>127.0.0.1</value>  
    </property>  
    <property>  
        <name>hbase.zookeeper.property.dataDir</name>  
        <value>F:/hbase/hbase-1.2.10/zoo</value>  
    </property>  
    <property>  
        <name>hbase.cluster.distributed</name>  
        <value>false</value>  
    </property>  
</configuration>

同样,涉及到路径的都配置自己的hbase中的路径,其中没有的文件夹,会自己创建

4.启动hbase

进入到hbase-1.2.10\bin目录下,启动start-hbase.cmd,看到控制台无报错信息,并启动停止即可

在cmd模式下,进入到hbase-1.2.10\bin目录下:

输入命令:hbase shell

出现hbase(main):001.0>

恭喜,成功搭建好单机版的hbase环境

5.java连接测试


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class HbaseClientUserRela {
    Configuration conf = null;
    Connection conn = null;

    final static String tableName = "user_relation";
    final static String fimilyName = "friends";

    @Before
    public void init() throws IOException {
        //获取一个配置文件对象
        conf = HBaseConfiguration.create();

        conf.set("hbase.zookeeper.quorum", "127.0.0.1");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        //通过conf获取到hbase集群的连接
        conn = ConnectionFactory.createConnection(conf);
    }

    //创建一张hbase表
    @Test
    public void createTable() throws IOException {
        //获取HbaseAdmin对象用来创建表
        HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
        //创建Htabledesc描述器,表描述器
        final HTableDescriptor userRelation = new HTableDescriptor(TableName.valueOf(tableName));
        //指定列族
        userRelation.addFamily(new HColumnDescriptor(fimilyName));
        admin.createTable(userRelation);
        System.out.println(tableName+"表创建成功!!");
    }

    //插入一条数据
    @Test
    public void putData() throws IOException {
        //需要获取一个table对象
        final Table worker = conn.getTable(TableName.valueOf(tableName));

        //准备put对象 uid = uid1
        final Put put = new Put(Bytes.toBytes("uid1"));//指定rowkey
        // 添加好友关系
        put.addColumn(Bytes.toBytes(fimilyName), Bytes.toBytes("rela1"),  Bytes.toBytes("uid2"));
        put.addColumn(Bytes.toBytes(fimilyName), Bytes.toBytes("rela2"),  Bytes.toBytes("uid5"));
        put.addColumn(Bytes.toBytes(fimilyName), Bytes.toBytes("rela3"),  Bytes.toBytes("uid7"));
        put.addColumn(Bytes.toBytes(fimilyName), Bytes.toBytes("rela4"),  Bytes.toBytes("uid9"));
        //插入数据,参数类型是put
        worker.put(put);

        //准备put对象 uid = uid1
        final Put put2 = new Put(Bytes.toBytes("uid2"));//指定rowkey
        // 添加好友关系
        put2.addColumn(Bytes.toBytes(fimilyName), Bytes.toBytes("rela1"),  Bytes.toBytes("uid1"));
        //插入数据,参数类型是put
        worker.put(put2);


        //准备list<puts>,可以执行批量插入
        //关闭table对象
        worker.close();
        System.out.println("插入数据成功!!");
    }

    // 关联删除数据
    @Test
    public void unionDeleteData() throws IOException {
        putData();

        scanData();

        //需要获取一个table对象
        final Table worker = conn.getTable(TableName.valueOf(tableName));

        //删除 uid2 数据
        final Delete delete = new Delete(Bytes.toBytes("uid2"));
        worker.delete(delete);

        //删除 删除uid1中引用uid2的数据
        final Delete delete2 = new Delete(Bytes.toBytes("uid1"));
        delete2.addColumn(fimilyName.getBytes(),"rela1".getBytes());
        worker.delete(delete2);

        //关闭table对象
        worker.close();
        System.out.println("删除数据成功!!");

        scanData();
    }


    //删除一条数据
    @Test
    public void deleteData() throws IOException {
        //需要获取一个table对象
        final Table worker = conn.getTable(TableName.valueOf(tableName));

        //准备delete对象: 删除一行数据
        final Delete delete = new Delete(Bytes.toBytes("uid1"));
        //执行删除
        worker.delete(delete);
        //关闭table对象
        worker.close();
        System.out.println("删除数据成功!!");
    }

    //删除某行一列数据
    @Test
    public void deleteColumnData() throws IOException {
        //需要获取一个table对象
        final Table worker = conn.getTable(TableName.valueOf(tableName));

        //准备delete对象: 删除一行数据
        final Delete delete = new Delete(Bytes.toBytes("uid1"));
        // 指定列族
//        delete.addFamily(fimilyName.getBytes());
        // 指定删除列
        delete.addColumn(fimilyName.getBytes(),"rela1".getBytes());
        //执行删除
        worker.delete(delete);
        //关闭table对象
        worker.close();
        System.out.println("删除数据成功!!");
    }

    //查询数据
    @Test
    public void getData() throws IOException {
        //准备table对象
        final Table worker = conn.getTable(TableName.valueOf(tableName));
        //准备get对象
        final Get get = new Get(Bytes.toBytes("uid1"));
        //指定查询某个列族或者列
        get.addFamily(Bytes.toBytes(fimilyName));
        //执行查询
        final Result result = worker.get(get);
        //获取到result中所有cell对象
        final Cell[] cells = result.rawCells();
        //遍历打印
        for (Cell cell : cells) {
            final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            final String f = Bytes.toString(CellUtil.cloneFamily(cell));
            final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
            final String value = Bytes.toString(CellUtil.cloneValue(cell));

            System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + "---;column--->" + column + "--;value-->" + value);
        }
        worker.close();
    }

    //全表扫描
    @Test
    public void scanData() throws IOException {
        //准备table对象
        final Table worker = conn.getTable(TableName.valueOf(tableName));
        //准备scan对象
        final Scan scan = new Scan();

        //执行扫描
        final ResultScanner resultScanner = worker.getScanner(scan);
        for (Result result : resultScanner) {
            //获取到result中所有cell对象
            final Cell[] cells = result.rawCells();
            //遍历打印
            for (Cell cell : cells) {
                final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
                final String f = Bytes.toString(CellUtil.cloneFamily(cell));
                final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
                final String value = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + ";column--->" + column + "--;value-->" + value);
            }
        }

        worker.close();
    }
//指定scan 开始rowkey和结束rowkey,这种查询方式建议使用,指定开始和结束rowkey区间避免全表扫描
@Test
public void scanStartEndData() throws IOException {
    //准备table对象
    final Table worker = conn.getTable(TableName.valueOf(tableName));
    //准备scan对象
    final Scan scan = new Scan();
    //指定查询的rowkey区间,rowkey在hbase中是以字典序排序
    scan.setStartRow(Bytes.toBytes("001"));
    scan.setStopRow(Bytes.toBytes("004"));
    //执行扫描
    final ResultScanner resultScanner = worker.getScanner(scan);
    for (Result result : resultScanner) {
        //获取到result中所有cell对象
        final Cell[] cells = result.rawCells();
        //遍历打印
        for (Cell cell : cells) {
            final String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            final String f = Bytes.toString(CellUtil.cloneFamily(cell));
            final String column = Bytes.toString(CellUtil.cloneQualifier(cell));
            final String value = Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("rowkey-->" + rowkey + "--;cf-->" + f + ";column--->" + column + "--;value-->" + value);
        }
    }

    worker.close();
}



    //释放连接
    @After
    public void close() {
        if (conn != null) {
            try {
                conn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

pom依赖

<dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
        </dependency>
    </dependencies>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342