大数据基础之HBase学习

本文介绍了HBase的基本原理,包括其分布式存储系统的特性,以及HBase的架构组件,如Client、Zookeeper、HMaster和HRegionServer。接着详细描述了HBase的环境搭建过程,包括系统配置、版本选择、安装步骤和配置文件设置。最后,通过简单的编程实例展示了如何使用Java进行HBase的建表、查询、插入和删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这周主要学习了Hbase的原理以及Hbase的编程实例,还有MapReduce实例,这篇文章主要简单的介绍HBase的原理,详细的介绍环境的搭建以及编程的实例。MapReduce实例开发会作为单独的一篇文章来写。

一、HBase原理

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价的PC Server上搭建起大规模集群,它是一个可以随机访问的存储和检索数据的平台。它不介意数据类型,允许动态的,灵活的数据类型。以上关于HBase的定义来自学习的课件中。以下关于自己的理解,HBase为一个可分布式的存储系统,弥补了HDFS不可随机访问的不足,数据是以Byte表的形式存储,所以不介意数据的类型,即任何数据类型均可存储。它的架构图如下所示:


以上为HBase的一个架构图,包含client、Zookeeper、HMaster、HRegionServer等

Client:包含HBase的访问接口,RegionServer等信息

RegionServer:为HBase中一个较为核心的模块,主要负责相应用户的IO请求,如HDFS中文件读写,管理多个Region对象

HRegion:HBase内包含多个HRegion,相当于HBase中的一个单位

Store:封装了HFile,存储于HDFS中

MemStore:内存中的数据缓存,类似Oracle的Buffer Cache

HMaster:为RegionServer分配region,负责RegionServer的负载均衡

Zookeeper:主要负责管理集群,存储所有Region的寻址入口,实时监控RegionServer的状态

HBase的逻辑模型如下图所示,有行和列组成,列划分为若干个列族,一般情况下用一个列族,多行列,行健(rowkey)为表的主键,可以通过rowkey来检索数据。时间戳为存储数据的时间,行和列为一个单元(cell),一般每个cell都保存同一份数据的多个版本,因此时间戳可以确定数据的版本。rowkey一般是通过字典排序,采用倒叙的方式。因此最前面的为最新的数据。


二、Hbase环境搭建

在上篇文章Hadoop搭建的基础上搭建HBase。

系统:centos6.8 64位

java:jdk1.7 64位

Hadoop:hadoop2.7.3

HBase:HBase1.2.3

以上为系统环境及相关版本

1、从镜像:https://mirrors.tuna.tsinghua.edu.cn/apache 下载相应的HBase版本,下载前先在HBase官方文档查看与Hadoop兼容的HBase版本:http://hbase.apache.org/book.html 。下载完成后拷贝入虚机环境中。

2、解压缩hbase安装包到/usr/下。

3、设置环境 变量,设置在当前用户(hadoop用户)下的.bashrc,使用source命令使配置生效。

4、配置hbase/conf/hbase-env.sh

	export JAVA_HOME=/usr/java/jdk1.7.0_25/  #配置Java路径
	export HBASE_CLASSPATH=/usr/hadoop-2.7.3/etc/hadoop  #配置hadoop路径
	export HBASE_MANAGES_ZK=true  #HBASE_MANAGES_ZK设置为true表示使用hbase自身的zookeeper

5、配置hbase/conf/hbase-site.xml

<span style="white-space:pre">	</span><configuration>
	<span style="white-space:pre">	</span><property>
	<span style="white-space:pre">	</span><name>hbase.rootdir</name>
	<span style="white-space:pre">	</span><value>hdfs://hadoop:9000/hbase</value>
	<span style="white-space:pre">	</span></property>
	<span style="white-space:pre">	</span><property>
        <span style="white-space:pre">	</span><name>hbase.cluster.distributed</name>
        <span style="white-space:pre">	</span><value>true</value>
        <span style="white-space:pre">	</span></property>
<span style="white-space:pre">	</span></configuration>

6、替换hbase\lib下的相关hadoop包,默认下hbase\lib中的Hadoop包为2.5.6版本,需将hadoop下jar包拷贝至hase\lib下进行替换

7、启动hadoop

8、启动hbase


9.进入hbase shell,则安装成功


安装成功后可通过浏览器查看hbase状态,一般默认端口号为16010

三、Hbase编程实例

hbase安装成功之后,可在虚机中安装Eclipse,并使用Java编程操作HBase,包含建表,查询,插入,删除等。

<span style="white-space:pre">	</span>//全局方法,设置hbase的连接,这里也可以设置hbase的zookeeper地址和端口号
	public static Configuration configuration;
	static {
		configuration = HBaseConfiguration.create();		
	}

	public static void main(String[] args) throws IOException
	{
		System.out.print("hello123");
		String tablename = "study-hbase";
//		createTable(tablename);
//		putData(tablename);
		getData(tablename);
	}	 
	
	
	//建表
	public static void createTable(String tablename)
	{
		System.out.println("creat table begin--------");
		try {
			//连接到hbase
			Connection conn = ConnectionFactory.createConnection(configuration);
			//Admin获取数据库的表信息
			Admin admin = conn.getAdmin();
			//将表名String类型转化为TableName类型
			TableName tableName = TableName.valueOf(tablename);
			//如果表名不存在,则建表
			if(!admin.tableExists(tableName)){
				//HTableDescriptor包含了表的详细信息,如表名,rowkey和列族等
				HTableDescriptor hbaseTable = new HTableDescriptor(TableName.valueOf(tablename));
				//添加列族,HColumDescriptor包含了列族的详细信息
				hbaseTable.addFamily(new HColumnDescriptor("column1"));
				hbaseTable.addFamily(new HColumnDescriptor("column2"));
				//将表加进数据库
				admin.createTable(hbaseTable);
				System.out.println("on-------");
			}
			admin.close();//关闭数据
			conn.close();//关闭连接
		} catch (IOException e) {
			e.printStackTrace();
		}		
		System.out.println("creat table end--------");
	}
	
	//在建好的表中插入一行数据
	public static void putData(String tablename)
	{
		try {
			TableName tableName = TableName.valueOf(tablename);
			Connection conn = ConnectionFactory.createConnection(configuration);
			//获取tablename表
			Table htable = conn.getTable(tableName);
			//Put 单个插入,rowkey为row1
			Put put = new Put("row1".getBytes());
			//列族为column1,列为a,可有多行,value值为value1,这里值都需要转化为bytes类型,hbase都是以bytes存储
			put.addColumn("column1".getBytes(), "a".getBytes(), "value1".getBytes());
			//插入
			htable.put(put);
			htable.close();
			conn.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//通过rowkey获取数字
	public static void getData(String tablename)
	{
		TableName tableName = TableName.valueOf(tablename);
		try {
			Connection conn = ConnectionFactory.createConnection(configuration);
			Table table = conn.getTable(tableName);
			//Get获取单个行的信息
			Get get = new Get("row1".getBytes());
			//将获取到的结果存储在result中,最后的结果为map结构
			Result result = table.get(get);
			//测试结果
			System.out.println(result.getRow());
			//每一行和每一列组成一个cell
			Cell[] cells = result.rawCells();
			for(Cell cell:cells) {
				//打印rowkey
				System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");  
	            //打印时间戳
				System.out.println("Timetamp:"+cell.getTimestamp()+" ");  
				//打印列族
	            System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");  
	            //打印行名
	            System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");  
	            //打印value值
	            System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
			}			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

结果:

1、建表成功


2.插入数据成功



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值