HBase的安装部署与学习

HBase

简介

Hive与HBase的比较

在这里插入图片描述

Hbase 特点

1)海量存储

Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下, 能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。正式因为 Hbase 良好的 扩展性,才为海量数据的存储提供了便利。

2)列式存储

这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。列族下面可以 有非常多的列,列族在创建表的时候就必须指定。

3)极易扩展

Hbase 的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩 展,一个是基于存储的扩展(HDFS)。 通过横向添加 RegionSever 的机器,进行水平扩展,提升 Hbase 上层的处理能力,提升 Hbsae 服务更多 Region 的能力。 备注:RegionServer 的作用是管理 region、承接业务的访问,这个后面会详细的介绍通 过横向添加 Datanode 的机器,进行存储层扩容,提升 Hbase 的数据存储能力和提升后端存 储的读写能力。

4)高并发

由于目前大部分使用 Hbase 的架构,都是采用的廉价 PC,因此单个 IO 的延迟其实并不 小,一般在几十到上百 ms 之间。这里说的高并发,主要是在并发的情况下,Hbase 的单个 IO 延迟下降并不多。能获得高并发、低延迟的服务。

5)稀疏

稀疏主要是针对 Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空 的情况下,是不会占用存储空间的。

HBase架构

在这里插入图片描述
从图中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等 几个组件组成,下面来介绍一下几个组件的相关功能:

1)Client

Client 包含了访问 Hbase 的接口,另外 Client 还维护了对应的 cache 来加速 Hbase 的访 问,比如 cache 的.META.元数据的信息。

2)Zookeeper

HBase 通过 Zookeeper 来做 master 的高可用、RegionServer 的监控、元数据的入口以及 集群配置的维护等工作。

具体工作如下:

①通过 Zoopkeeper 来保证集群中只有 1 个 master 在运行,如果 master 异常,会通过竞争 机制产生新的 master 提供服务 ;

②通过 Zoopkeeper 来监控 RegionServer 的状态,当 RegionSevrer 有异常的时候;

③通过回 调的形式通知 Master RegionServer 上下线的信息 通过 Zoopkeeper 存储元数据的统一入口地址

3)Hmaster

master 节点的主要职责如下:

①为 RegionServer 分配 Region

②维护整个集群的负载均衡

③维护集群的元数据信息

④发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上

⑤当 RegionSever 失效的时候,协调对应 Hlog 的拆分

4)HregionServer

HregionServer 直接对接用户的读写请求,是真正的“干活”的节点。

它的功能概括如下:

①管理 master 为其分配的 Region

②处理来自客户端的读写请求

③负责和底层 HDFS 的交互,存储数据到 HDFS

④负责 Region 变大以后的拆分

⑤负责 Storefile 的合并工作

5)HDFS HDFS 为 Hbase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(Hlog 存储在 HDFS)的支持,

具体功能概括如下:

①提供元数据和表数据的底层分布式存储服务

②数据多副本,保证的高可靠和高可用性

Zookeeper的部署


1、下载上传

从官网上下载zookeeper的安装包zookeeper-3.4.14.tar.gz,并上传到hadoop集群上

建议:不要下载太新的版本,很容易有bug

https://downloads.apache.org/zookeeper/

2、解压

解压到对应目录 /usr/local

tar -zvxf zookeeper-3.4.14.tar.gz -C /usr/local/
3、修改配置文件

①zoo.cfg文件

cd /usr/local/zookeeper-3.4.14/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

dataDir=/usr/local/zookeeper-3.4.14/data
dataLogDir=/usr/local/zookeeper-3.4.14/logs

在clientPort=2181下添加
# server.1 这个1是服务器的标识,可以是任意有效数字,标识这是第几个服务器节点,这个标识要写到dataDir目录下面myid文件里
# 指名集群间通讯端口和选举端口
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

在这里插入图片描述

4、创建文件夹

创建上面所述的两个文件夹

cd /usr/local/zookeeper-3.4.14
mkdir data
mkdir logs
5、将配置好的zookeeper传给slave1,slave2
scp -r zookeeper-3.4.14/ slave1:/usr/local/
scp -r zookeeper-3.4.14/ slave2:/usr/local/
6、配置myid

在三台机子上分别配置myid

cd /usr/local/zookeeper-3.4.14

master:
echo "1" > data/myid

slave1:
echo "2" > data/myid

slave2:
echo "3" > data/myid

检查一下
cd /usr/local/zookeeper-3.4.14/data
cat myid

在这里插入图片描述

7、启动zookeeper

PS:三台机子都要启动

cd /usr/local/zookeeper-3.4.14
./bin/zkServer.sh start

查看是否启动成功(机子的状态)
./bin/zkServer.sh status
查看的同时可以看到该机子是leader还是follower
Debug:

但是启动时遇到了一个bug

一直显示为单机模式
在这里插入图片描述
原因:上面的zoo.cfg的配置修改错误

解决方法:

将配置内容更改为

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

注意:最前面的server是固定,不用变!!

修改之后启动zookeeper

8、查看jps

在这里插入图片描述

9、查看机子的状态

master:
在这里插入图片描述
slave1:
在这里插入图片描述
slave2:
在这里插入图片描述

HBase的部署


1、下载上传

从官网上下载安装包 hbase-2.2.5-bin.tar.gz 并传到hadoop集群上

https://mirrors.bfsu.edu.cn/apache/hbase/

2、解压

将安装包解压到 /usr/local

tar -zxvf hbase-2.2.5-bin.tar.gz -C /usr/local

在这里插入图片描述

3、配置环境变量
vi ~/.bashrc
#hbase
export HBASE_HOME=/usr/local/hbase-2.2.5
export PATH=$PATH:$HBASE_HOME/bin

使其生效

source ~/.bashrc

查看版本

hbase version

在这里插入图片描述

4、修改配置文件

①在hbase-env.sh添加JAVA_HOME路径

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64

②配置hbase-site.xml文件

<configuration>
<property>
<--! hbase存放数据目录 -->
<name>hbase.rootdir</name>
<value>hdfs://server1:9000/hbase/hbase_db</value>
<--! 端口要和hadoop的fs.defaultFS端口一致 -->
</property>
<property>
<--! 是否分布式部署 -->
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<--! zookeeper 服务启动的节点,只能为奇数个 -->
<name>hbase.zookeeper.quorum</name>
<value>server1,server2,server3</value>
</property>
<property>
<!--zookooper配置、日志等的存储位置,必须为以存在-->
<name>hbase.zookeeper.property.dataDir</name>
<value>/data/hbase/zookeeper</value>
</property>
<property>
<--! hbase web 端口 -->
<name>hbase.master.info.port</name>
<value>16610</value>
</property>
</configuration>
vi hbase-site.xml

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase/hbase_db</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</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>
</configuration>

③配置 regionservers(添加为你所用的集群机子)

vi regionservers

master
slave1
slave2
5、将配置好的HBase传给slave1,slave2
scp -r hbase-2.2.5/ slave1:/usr/local/
scp -r hbase-2.2.5/ slave2:/usr/local/

并在slave1,slave2配置环境变量

vi ~/.bashrc

#hbase
export HBASE_HOME=/usr/local/hbase-2.2.5
export PATH=$PATH:$HBASE_HOME/bin

source ~/.bashrc
hbase version
6、在master上启动HBase

启动之前得先启动Hadoop和Zookeeper,然后再启动HBase(有两种方式)

①第一种启动方法

bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver

对应关闭:

bin/hbase-daemon.sh stop master
bin/hbase-daemon.sh stop regionserver

提示:如果集群之间的节点时间不同步,会导致 regionserver 无法启动,抛出 ClockOutOfSyncException 异常。

修复提示:

a、同步时间服务

b、属性:hbase.master.maxclockskew 设置更大的值

<property>
 <name>hbase.master.maxclockskew</name>
 <value>180000</value>
 <description>Time difference of regionserver from
master</description>
</property>

②第二种启动方法

bin/start-hbase.sh
bin/stop-hbase.sh 

一般第二种停止还是要按第一种停止那样逐个操作

7、查看jps

master机子上:
在这里插入图片描述
slave1,slave2机子上:
在这里插入图片描述

8、查看 HBase 页面

启动成功后,可以通过“host:port”的方式来访问 HBase 管理页面

例如: http://192.168.100.11:16610

http://{IP地址}:{端口号}

端口号看上面的hbase-site.xml配置

如图所示:
在这里插入图片描述

HMaster和HRegionServer的功能
HMaster 功能 :

1)监控 RegionServer

2)处理 RegionServer 故障转移

3)处理元数据的变更

4)处理 region 的分配或转移

5)在空闲时间进行数据的负载均衡

6)通过 Zookeeper 发布自己的位置给客户端

RegionServer 功能 :

1)负责存储 HBase 的实际数据

2)处理分配给它的 Region

3)刷新缓存到 HDFS

4)维护 Hlog

5)执行压缩

6)负责处理 Region 分片

HBase Shell操作


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

1、启动hbase shell

去到HBase的目录下

bin/hbase shell

在这里插入图片描述
2、查看帮助命令

hbase(main):001:0> help

3、查看数据库中有哪些表

list

在这里插入图片描述
4、创建表

create ‘表名’,‘列族名’.‘列族名’…

create 'student','info'

在这里插入图片描述
5、插入表数据

put 'student','1','info:name','Sartin'
put 'student','1','info:sex','female'
put 'student','1','info:age','20'
put 'student','2','info:name','Board'
put 'student','2','info:sex','male'
put 'student','2','info:age','21'
put 'student','3','info:name','John'

在这里插入图片描述
6、查看表数据

scan 'student'

在这里插入图片描述
7、指定查看表数据

STARTROW => ‘开始’, STOPROW => ‘结束’

scan 'student',{STARTROW => '1', STOPROW => '1'}

在这里插入图片描述
8、查看表结构

describe 'student'

在这里插入图片描述
9、更新指定字段的数据

put 'student','1','info:age','50'

在这里插入图片描述

10、查看“指定行”或“指定列族:列”的数据

get 'student','1'
get 'student','1','info:name'

在这里插入图片描述

11、统计表数据的行数

count 'student'

在这里插入图片描述

12、删除数据

删除表

drop 'student'

删除rowkey的全部数据(即删除整行)

deleteall 'student','1'

删除某一列数据

delete 'student','3','info:name'

在这里插入图片描述
13、清空表数据

truncate 'student'

提示:清空表的操作顺序为先 disable,然后再 truncate。

14、删除表

首先需要先让该表为disable状态:

disable 'student'

然后才能drop这个表

drop 'student'

15、变更表信息

alter 'student',{NAME=>'info',VERSIONS=>3}
get 'student','1',{COLUMN=>'info:name',VERSIONS=>3}

HBase的Java API

创建一个名为HBase的Maven项目

环境准备

在pom.xml里添加相关依赖

版本问题参考Maven仓库:https://mvnrepository.com/

<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
	<dependency>
	    <groupId>org.apache.hbase</groupId>
	    <artifactId>hbase-server</artifactId>
	    <version>2.2.5</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
	<dependency>
	    <groupId>org.apache.hbase</groupId>
	    <artifactId>hbase-client</artifactId>
	    <version>2.2.5</version>
	</dependency>

	
	<dependency>
		<groupId>jdk.tools</groupId>
		<artifactId>jdk.tools</artifactId>
		<version>1.8</version>
		<scope>system</scope>
		<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
	</dependency>

HBaseDemo.java

package com.hadoop.HBase;

import java.io.IOException;

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.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

public class HBaseDemo {
	
	/**
	 * hadoop配置
	 */
	private static Configuration configuration;
 
	/**
	 * hbase客户端连接
	 */
	private static Connection connection;
 
	private static Admin admin;
 
	private static final String HBASE_ROOT_DIR = "hdfs://master:9000/hbase/hbase_db";
 
	/**
	 * HBase初始化,创建连接
	 */
	public static void init() {
		configuration = HBaseConfiguration.create();
		configuration.set("hbase.rootdir", HBASE_ROOT_DIR);
		configuration.set("hbase.zookeeper.quorum", "192.168.100.11");
		configuration.set("hbase.zookeeper.property.clientPort", "2181");
		try {
			// 创建连接
			connection = ConnectionFactory.createConnection(configuration);
			admin = connection.getAdmin();
			System.out.println("创建连接成功");
		} catch (IOException e) {
			System.out.println("创建连接失败");
			e.printStackTrace();
		}
	}
 
	public static void close() {
		if (null != admin) {
			try {
				admin.close();
				System.out.println("关闭admin");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (null != connection) {
			try {
				connection.close();
				System.out.println("关闭connection");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
 
	/**
	 * 创建表
	 * 
	 * @param tableName:表名
	 * @param columnFamily:列簇
	 */
	public static void createTable(String tableName, String[] columnFamily) {
		init();
		TableName table = TableName.valueOf(tableName);
		try {
			
			if (admin.tableExists(table)) {
				System.out.println("表:" + tableName + "存在");
			} else {
				HTableDescriptor hTableDescriptor = new HTableDescriptor(table);
				for (String col : columnFamily) {
					HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(col);
					hTableDescriptor.addFamily(hColumnDescriptor);
				}
				admin.createTable(hTableDescriptor);
				System.out.println("创建表:" + tableName + "成功");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// close();
		}
	}
 
	public static void main(String[] args) {
		// init();
		String[] colFamily = { "sname", "course" };
		createTable("Score", colFamily);
		close();
	}

}

运行过程中遇到了一个bug:

报错信息:
can not resolve hostname
Can’t get the location for replica 0

解决方法:
去C:\Windows\System32\drivers\etc\hosts 里配置一下这个hostname和对应的IP
注意:hosts有权限问题,在属性位置添加修改权限,并去除只读

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值