搭建hadoop+Hbase,JAVA API操作HBase

搭建hadoop+Hbase,JAVA API操作HBase

一、实验背景

​ 了解HBase的存储形式https://blog.csdn.net/worldchinalee/article/details/82692185 HBase基于列的而不是基于行的模式。

​ Hbase 全称为 Hadoop Database,即 Hbase 是 Hadoop 的数据库,是一个分布式的存储系统。Hbase 利用 Hadoop 的 HDFS 作为其文件存储系统,利用 Hadoop 的 MapReduce 来处理 Hbase 中的海量数据。利用 ZooKeeper 作为其协调工具。 HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

二、实验环境

· 一台1核2G的主机,两台1核1G的从机

· 镜像系统为Centos6.4

· 三台主机都已经安装JDK1.8.0,并在 /etc/profile 配置了环境变量

· 三台主机配置好SSH免密码登录

· 三台主机搭建好的Hadoop集群环境,版本为2.7.7

三、实验步骤

步骤一:搭建hbase的环境

1.下载解压

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/hbase-2.2.4-bin.tar.gz
 tar xzvf hbase-2.2.4-bin.tar.gz  -C /bigdata

2.配置环境

cd /bigdata/hbase-2.2.4

cd conf/

(1)配置vi hbase-env.sh

JAVA_HOME=/bigdata/jdk1.8.0_241

(2)配置vi hbase-site.xml

<property>
	<name>hbase.rootdir</name>
	<value>hdfs://server1:9000/hbase/hbase_db</value>
</property>

<property>
	<name>hbase.cluster.distributed</name>
	<value>true</value>
</property>
<property>
	<name>hbase.zookeeper.quorum</name>
	<value>server1,server2,server3</value>
</property>
<property>
	<name>hbase.zookeeper.property.dataDir</name>
	<value>/data/hbase/zookeeper</value>
</property>
<property>
	<name>hbase.master.info.port</name>
	<value>16610</value>
</property>

(3)配置vi regionservers

server1

server2

server3

将文件复制给server2,server3

scp -r hbase-2.2.4 server2:/bigdata/

scp -r hbase-2.2.4 server3:/bigdata/

3.启动hbase

cd /bigdata/hbase-2.2.4

./bin/start-hbase.sh

./bin/hbase shell

步骤二:启动hadoop和hbase,关于一些hbase的操作

  1. 启动hadoop和 hbase

#启动hadoop

cd /bigdata/hadoop-2.7.7/

./sbin/start-dfs.sh

./sbin/start-yarn.sh

#启动hbase

./bin/start-hbase.sh

./bin/hbase shell

2.运行一些简单的命令

名称命令表达式
创建表create ‘表名称’, ‘列族名称1’,‘列族名称2’,‘列族名称N’
添加记录put ‘表名称’, ‘行名称’, ‘列名称:’, ‘值’
查看记录get ‘表名称’, ‘行名称’
查看表中的记录总数count ‘表名称’
删除记录delete ‘表名’ ,‘行名称’ , ‘列名称’
删除一张表先要屏蔽该表,才能对该表进行删除,第一步 disable ‘表名称’ 第二步 drop ‘表名称’
查看所有记录scan “表名称”
查看某个表某个列中所有数据scan “表名称” , {COLUMNS=>‘列族名称:列名称’}
更新记录就是重写一遍进行覆盖

存储的方式

img

(1)创建表格:

hbase(main):001:0> create 'x','cf1','cf2'

(2)插入数据

插入数据的内容

img

第一行
put 'x','r001','cf1:name','xiyangyang'
put 'x','r001','cf1:addr','yangcun'
put 'x','r001','cf2:age','5'
put 'x','r001','cf2:sex','man'
第二行
put 'x','r002','cf1:name','huitailang'
put 'x','r002','cf1:addr','langwo'
put 'x','r002','cf2:age','15'
put 'x','r002','cf2:sex','man'

(3)查看记录

hbase(main):014:0> get 'x','r001'

(4)查看表中的记录总数

hbase(main):013:0> count 'x'

(5) 删除记录

hbase(main):015:0> delete 'x','r001','cf1:name'

(6)删除一张表

hbase(main):019:0> disable 'tt'
hbase(main):021:0> drop 'tt'

(7)查看所有记录

hbase(main):002:0> scan 'x'

(8)查看某个表某个列中所有数据

hbase(main):003:0> scan 'x',{COLUMNS=>'cf1:name'}

步骤三:java API访问hbase

1.创建一个maven文件,在pom.xml加入hbase需要的jar包

	<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.hbase</groupId>
    	<artifactId>hbase-client</artifactId>
    	<version>1.3.6</version>
	</dependency>
    <dependency>

2.java API操作hbase

(1)创建表

package xgs.xgs11;
import org.apache.hadoop.conf.Configuration;
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.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.Table;
import org.junit.Test;
import org.junit.Before;

public class HBase {
	Configuration config = null;
    private Connection connection = null;
    private Table table = null;
    

    @Before
    public void init() throws Exception {
        config = HBaseConfiguration.create();// 配置
        config.set("hbase.zookeeper.quorum", "192.168.2.131,192.168.1.132,192.168.2.133");// zookeeper地址
        config.set("hbase.zookeeper.property.clientPort", "2181");// zookeeper端口
        connection = ConnectionFactory.createConnection(config);
        table = connection.getTable(TableName.valueOf("users"));
        System.out.println("hhh");
    }
    @Test
    //创建表
    public void testCreateTable() throws Exception{
        //创建表管理类
        HBaseAdmin admin = new HBaseAdmin(config);
        //创建表描述类
        TableName tableName = TableName.valueOf("test2");
        HTableDescriptor descriptor = new HTableDescriptor(tableName);
        //创建列族描述类
        HColumnDescriptor info1 = new HColumnDescriptor("info1");
        //列族加入表中
        descriptor.addFamily(info1);
        HColumnDescriptor info2 = new HColumnDescriptor("info2");
        descriptor.addFamily(info2);
        System.out.println("woliochenggonghaichayibu");
        //创建表
        admin.createTable(descriptor);
        System.out.println("-----create-----");
    }

}

(2)删除表

@Test
    public void testDeleteTable() throws Exception{
        HBaseAdmin admin = new HBaseAdmin(config);
        admin.disableTable("test2");
        admin.deleteTable("test2");
        System.out.println("----delete----");
}

(3)单条插入(修改)

 @Test
    //单条插入(修改)
    public void testPut() throws Exception{
        //rowkey
        Put put = new Put(Bytes.toBytes("r0003"));
        //列族,列,值
        put.add(Bytes.toBytes("cf1"), Bytes.toBytes("addr"), Bytes.toBytes("yangcun"));
        put.add(Bytes.toBytes("cf1"), Bytes.toBytes("name"), Bytes.toBytes("lanyangyang"));
        table.put(put);
        System.out.println("----put-----");
        //提交
        //table.flushCommits();
}

(4)多条查询

@Test
    //多条查询
    public void testGetMany() throws Exception{

        Scan scan = new Scan();
        //字典序   类似于分页
        //scan.setStartRow(Bytes.toBytes("cf1"));
        //scan.setStopRow(Bytes.toBytes("'cf2"));
        ResultScanner resultScanner = table.getScanner(scan);
        System.out.println(resultScanner);
        for (Result result : resultScanner) {
            //Single row result of a Get or Scan query. Result
            //Result 一次获取一个rowkey对应的记录
            //列族,列名
            byte[] addr = result.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("addr"));
            byte[] name = result.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("name"));
            System.out.print(Bytes.toString(addr)+",");
            System.out.print(Bytes.toString(name));
            System.out.println();
        }
        System.out.println("----GetMany----");
    }

四、实验分析

1.java API创建表的时候卡住admin.createTable(descriptor);

解决方法:

(1)hadoop 关闭安全模式:hadoop dfsadmin -safemode leave

(2)在C:\Windows\System32\drivers\etc\hosts中,加上虚拟机的ip 主机名

192.168.2.131 server1
192.168.2.132 server2
192.168.2.133 server3
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值