HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。
Hbase官网:https://hbase.apache.org/
官方文档:https://hbase.apache.org/2.3/book.html
下载地址:https://archive.apache.org/dist/hbase/
部署的hbase 版本为1.2.0
# 拉取镜像
docker pull harisekhon/hbase:1.2
# 创建容器
docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p 16020:16020 -p 16030:16030 harisekhon/hbase:1.2
docker容器运行后,直接在浏览器访问16010
端口:
Hbase部署成功了。
在Linux环境部署Hbase,需要Java环境。
解压Hbase压缩包,进入解压后的/etc
目录:
hbase-site.xml
配置<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>
<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>
</configuration>
vim /etc/profile
export HBASE_HOME=/data/hbase/hbase-1.2.0
export PATH=$PATH:$JAVA_HOME/bin:$HBASE_HOME/bin
source /etc/profile
hbase version
# 直接使用 start-habse.sh 命令
start-habse.sh
启动报错了:
解决方法:修改hbase-env.sh
配置,找到这两行,将其注释掉即可。
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
再次启动即可,访问浏览器16010端口看到web页面表示部署成功。
同样在Mac本地部署Hbase也需要Java环境。
配置 hbase-env.sh 脚本中的Java环境变量,同时需要注释掉HBASE_MASTER_OPTS和 HBASE_REGIONSERVER_OPTS配置。
修改hbase-site.xml
配置
由于home目录下创建文件夹没有权限,所以我在此处更改了文件目录位置。
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///Users/LiuShihao/hbase/</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/Users/LiuShihao/zookeeper</value>
</property>
<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>
</configuration>
docker 部署的Hbase需要通过docker exec -it hbase /bin/bash
进入Hbase容器内部执行hbase shell
命令:
如果是Linux或者MacOS部署的,因为配置了环境变量,所以可以直接用hbase shell
命令使用hbase 命令行。
注意:1版本删除命令需要加上Ctrl键,2版本不需要。
# 输入help显示hbase命令行
help
COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve
# 表名first ,一个列族 cf1
create 'first','cf1'
# 表名second ,三个列族 cf1,cf2,cf3
create 'second','cf1','cf2','cf3'
# 使用put命令插入数据 user为表名 cf1 为列族名 zhangsan2为值
put 'user',1,'cf1:name','zhangsan2'
# 使用scan查看表数据
scan 'user'
# 不能直接删除表,在删除表之前,需要表禁用
disable 'first
drop 'first'
在/hbase-data/data/default/test/ac13d86e488d18593ca5f3c86db42287/cf
目录下查看:
此时发现cf中已经有数据了,是因为默认数据是在内存中,到达64M
的时候才会进行异步写入到磁盘中。我们可以使用flush
命令手动刷新。
使用命令查看这个列族中的数据:
hbase hfile -p -f file:///hbase-data/data/default/test/ac13d86e488d18593ca5f3c86db42287/cf/2ec8665d6258433ca0966f33460ca9d8
配置两台服务器免密登录
# node01 和 node04 节点配置免密登录
# 在node04节点
ssh-kengen
ssh-copy-id -i .ssh/id_rsa.pub node01
# 输入node01密码 完成配置
# 配置完成后 ,连接node01
ssh node01
SpringBoot 版本 2.3.7.RELEASE
HbaseClient版本 1.2.6
引入依赖:
由于一系列的依赖冲突和版本问题,我排除hbase-client
依赖包中的slf4j-log4j12
和guava
,引入了低版本的guava
和protobuf-java
依赖。
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
server:
port: 8099
hbase:
config:
hbase.zookeeper.quorum: localhost
hbase.zookeeper.port: 2181
/**
* @author :LiuShihao
* @date :Created in 2022/6/23 11:47 下午
* @desc :读取配置文件hbase的配置
*/
@ConfigurationProperties(prefix = "hbase")
public class HbaseProperties {
private Map<String,String> config;
public void setConfig(Map<String, String> config) {
this.config = config;
}
public Map<String, String> getConfig() {
return config;
}
}
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.Map;
/**
* @author :LiuShihao
* @date :Created in 2022/6/23 11:48 下午
* @desc :配置Hbase
*/
@Configuration
@EnableConfigurationProperties(HbaseProperties.class)
public class HbaseConfig {
private final HbaseProperties props;
public HbaseConfig(HbaseProperties props) {
this.props = props;
}
@Bean
public org.apache.hadoop.conf.Configuration configuration(){
org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
Map<String, String> config = props.getConfig();
config.forEach(conf::set);
return conf;
}
@Bean
public Connection getConnection() throws IOException{
return ConnectionFactory.createConnection(configuration());
}
@Bean
public HBaseAdmin hBaseAdmin() throws IOException {
return (HBaseAdmin) getConnection().getAdmin();
}
}
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.HBaseAdmin;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
/**
* @author :LiuShihao
* @date :Created in 2022/6/25 10:13 下午
* @desc :
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class HbaseTestDemo {
//表名
TableName tableName = TableName.valueOf("phone");
@Autowired
HBaseAdmin hBaseAdmin;
@Test
public void createTable() throws IOException {
//在高版本中HTableDescriptor,已经过时了,使用 HTableDescriptorBuilder
//1.创建表
HTableDescriptor table = new HTableDescriptor(tableName);
//2.创建列族
//在高版本中创建列族使用ColumnFamilyDescriptorBuilder.newBuilder("cf".getBytes())
table.addFamily(new HColumnDescriptor("cf").setCompressionType(Compression.Algorithm.SNAPPY));
System.out.print("Creating table. ");
createOrOverwrite(hBaseAdmin, table);
System.out.println(" Done.");
}
public void createOrOverwrite(Admin admin, HTableDescriptor table) throws IOException {
if (admin.tableExists(table.getTableName())) {
admin.disableTable(table.getTableName());
admin.deleteTable(table.getTableName());
}
admin.createTable(table);
}
}
由于使用Docker环境或者是Linux环境部署的Hbase,本地使用IDEA连接总是超时,不知道是什么原因,我尝试了很多种办法都没有解决,所以最后只能子啊本地的Mac环境部署,最后成功连接。
给大家说一下我走的弯路(虽然最终也没有解决):
hbase-site.xml
文件中配置: <property>
<name>hbase.zookeeper.quorum</name>
<!-- 注意在hosts文件映射-->
<value>主机域名</value>
</property>
但最后我还是没有解决连接超时的问题。。。最后把hbase部署在了本地连接。