环境安装
- java坏境
centos安装java - hadoop环境
hadoop安装 - hbase配置
vi /etc/profile.d/hadoop-eco.sh
写入:
HBASE_HOME=/opt/hbase
PATH=$HBASE_HOME/bin:$PATH
生效:
source /etc/profile.d/hadoop-eco.sh
HBASE安装
- 下载hbase到linux
- hbase模式
- 单机模式
创建data目录,这里放在/opt/hbase/data
mkdir data
进入hbase配置目录
cd hbase/conf
修改两个配置文件hbase-env.sh和hbase-site.xml
hbase-env.sh
hbase-site.xmlexport JAVA_HOME=/opt/jdk export HBASE_MANAGES_ZK=true
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.rootdir</name> <value>file://opt/hbase/data</value> </property> <!--HBase的运行模式。false是单机模式,true是分布式模式--> <property> <name>hbase.cluster.distributed</name> <value>false</value> </property> </configuration>
- 分布式模式
- 进入conf目录
cd /opt/hbase/conf
- 编辑regionservers
vi regionservers
- 添加从机的ip slaver1 slaver2
- 更改hbase-site.xml文件,把hbase.cluster.distributed设置为true
- 把hbase文件克隆到从机
- 把/etc/profile.d/hadoop-eco.sh克隆到从机,并执行
source /etc/profile.d/hadoop-eco.sh
- 进入conf目录
- 单机模式
运行
开启服务
start-hbase.sh
查看版本:
hbase version
jps:
能看到HMaster
web端访问:16010
Hbase shell
对hbase的表的理解,在mysql的基础上,在列的基础上多了列簇,列簇是列的集合;存储数据的数据结构是map,key是时间戳,val才是真正的值
命名空间:命名空间相当于myslq的库
- 创建自定义命名空间
create_namespace 'my_ns'
- 显示所有命名空间
list_namespace
- 更改命名空间属性
alter_namespace 'my_ns',{METHOD=>'set','PROPERTY_NAME'=>'PROPERTY_VALUE'}
- 查看命名空间属性
describe_namespace 'my_ns'
- 删除命名空间
drop_namespace 'my_ns'
表操作
- 创建表
create '表名称', '列簇1', '列簇2', ….'列簇n'
- 指定命名空间
create 'my_ns:my_table', 'my_col1'
- 查看表属性
describe 'my_ns:my_table'
- 启用/禁用表
enable/disable 'my_ns:my_table'
- 检查表是否启用
is_enabled 'my_ns:my_table'
- 改变表属性,改变my_table表列簇my_col1的版本号
alter 'my_ns:my_table', {NAME=>'my_col1', VERSION=>5}
- 添加列簇,该列簇维护3个版本
alter 'my_ns:my_table', {NAME=>'my_col3', VERSIONS=>3
- 删除列簇
alter 'my_ns:my_table', {NAME=>'my_col3', METHOD=>'delete'}
- 删除表数据,删除前先禁用表
truncate 'my_ns:my_table'
- 删除表,删除前先禁用表
drop 'my_ns:my_table'
- 查看指定命名空间下的表
list_namespace_tables 'default'
数据操作
- 写数据
put '库名:表名称', 'rowkey值', '列簇:列名','值'
- 读数据
get '库名:表名称', 'rowkey值'
- 删除整行
deleteall '表名称', 'rowkey值'
- 删除指定行的指定列簇的值
delete '表名称', 'rowkey值', '列簇'
- 查看所有记录
scan '表名称'
- 查看某列簇所有记录
scan '表名称', '列簇'
- 统计记录数
count '表名称'
- 制作快照,先停用表
snapshot 'my_ns:my_table', 'myTableSnapShot'
- 从快照克隆数据
clone_snapshot 'myTableSnapShot', 'my_ns:my_new_table'
- 删除快照
delete_snapshot 'myTableSnapShot'
java操作hbase
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
public class HbaseConn {
public static void main(String[] args) throws IOException {
// 创建配置文件
Configuration conf = HBaseConfiguration.create();
// 从zookeeper的管理中调用hbase
conf.set("hbase.zookeeper.quorum", "192.168.137.122");
// 创建连接
Connection conn = ConnectionFactory.createConnection(conf);
// 获取Admin对象:可以对表进行操作
Admin admin = conn.getAdmin();
// 判断表是否存在,如果不存在则会创建,如果存在则删除
// 表名: my_ns:my_054yxd
TableName tableName = TableName.valueOf("my_ns:stu");
if (admin.tableExists(tableName)){
System.out.println("存在表");
// 1.判断表是否启用
boolean state = admin.isTableEnabled(tableName);
System.out.println(tableName + (state?"启用":"禁用"));
// 2.如果启用就禁用
if (state){
admin.disableTable(tableName);
}
// 3.禁用之后删除
admin.deleteTable(tableName);
System.out.println("删除成功");
}else {
System.out.println("不存在");
// todo 不存在则创建表
// 创建表
TableDescriptorBuilder builder =
TableDescriptorBuilder.newBuilder(tableName);
// 创建列簇
ColumnFamilyDescriptor cfd =
ColumnFamilyDescriptorBuilder
.newBuilder("info".getBytes()).build();
// 设置列簇
builder.setColumnFamily(cfd);
// 构建表结构
TableDescriptor table = builder.build();
// 创建
admin.createTable(table);
// 4.判断是否创建成功
System.out.println(
admin.tableExists(tableName) ? "创建成功" : "创建失败");
}
}
}