Hbase的shell客户端操作
Group name: general 一般的命令
processlist : 进程列表
status : 集群状态
table_help : 表的帮助(X)
version : hbase的版本
whoami : 当前用户是谁
Group name: ddl 数据定义语言
- alter : 修改表结构(列族 列族属性 多个列族)
- 修改列族属性
2) 添加列族
3) 删除列族
- create, 建表 预分region
- describe, 表信息
- disable, 禁用 disable_all, 禁用多张表
2. is_disabled, 是否是禁用
3. enable, 启用表 enable_all 启用多张表
4. is_enabled, 是否是启用
5. drop, 删除表 drop_all, 删除多张表 disable_all ‘tb.’ — drop_all 'tb.’(先禁用再删除)
(因为只禁用了两张表所以有一个表没有成功删除)
6. list_regions, 列出一个表的所有region
- locate_region, 某行(行键)在哪个region
Group name: namespace 等同于mysql中的数据库(database)
- list_namespace 查看系统中有几个命名空间
- list_namespace_tables 查看指定命名空间的表
- create_namespace 创建一个命名空间 带表
create_namespace ‘doit_199’
-
drop_namespace [命名空间必须为空]
-
describe_namespace 查看命名空间的信息
-
alter_namespace 修改命名空间的属性 set 为增加属性 unset 为删除属性
Group name: dml 数据管理语言
- put 插入数据 表名 行键 列族:属性 值
- scan 全表扫描数据
- get 获得行下的列族下的属性(单元格)
- delete 删除一个单元格
- deleteall 删除一行
- count 统计行数
- append 向已经有值的属性后面追加内容
- incr 计数器 累计计数
- get_counter 获取计数器的值
- get_splits 获得一张表的region分割点
- truncate 清空表中的数据
Group name: tools 工具
- flush 刷写数据
- hbase hfile -p -f hdfs特殊的结构路径
- 手动切分region
为什么要建立预分region表
在表还没有数据前预分了region表 解决了并发插入问题 如果只有一台机器同时插入大量数据可能会造成该机器内存溢出或者资源不够 导致宕机
把表拆分成多个region后在插入数据的时候插入请求就会被不同的机器接收从而解决了并发插入的热点问题。
Hbase的java客户端操作
创建Maven项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>hbase</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.2.5</version>
</dependency>
<!-- 使用mr程序操作hbase 数据的导入 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-mapreduce</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<!-- phoenix 凤凰 用来整合Hbase的工具 -->
<!-- <dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<!--<mainClass>util.Microseer</mainClass> -->
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
获取客户端连接核心对象
- HBaseConfiguration.create();配置对象
- conf.set(“hbase.zookeeper.quorum”, “linux01:2181,linux02:2181,linux03:2181”);设置参数 zookeeper的位置
- ConnectionFactory.createConnection(conf);获取连接对象
- conn.getTable(TableName.valueOf(“tb_b”)); hbase的表对象
- conn.getAdmin();获取Hbase的管理对象
package hbase.util;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
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;
import org.apache.hadoop.hbase.client.Table;
import java.io.IOException;
public class Hbase_Utils {
public static Admin getAdmin() throws IOException {
/**
* 获取Hbase的管理对象
* DDL Tools 有关的操作在 admin对象中
* Tools
* @return
* @throws IOException
*/
Connection conn = Hbase_Utils.getHbaseConnection();
Admin admin = conn.getAdmin();
return admin;
}
public static Table getTable() throws IOException {
/**
* 获取表对象
* @param name
* @return
* @throws Exception
*/
Connection conn = Hbase_Utils.getHbaseConnection();
Table tbname = conn.getTable(TableName.valueOf("name"));
return tbname;
}
public static Connection getHbaseConnection() throws IOException {
/**
* 获取Hbase的连接对象
* @return
* @throws IOException
*/
Configuration conf= HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum" , "linux01:2181,linux02:2181,linux03:2181");
Connection conn = ConnectionFactory.createConnection(conf);
return conn;
}
}
Java客户端查看所有表的名称
package hbase.client;
import hbase.util.Hbase_Utils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import java.io.IOException;
public class Client02 {
public static void main(String[] args) throws Exception {
listTableByNameSpace();
}
private static void listTableByNameSpace() throws IOException {
Admin admin = Hbase_Utils.getAdmin();
// admin.listTableNames(); // 获取系统中所有的表
// 获取指定namesapce中所有的表
TableName[] tableNames = admin.listTableNamesByNamespace("default");
for (TableName tableName : tableNames) {
byte[] name = tableName.getName();
byte[] namespace = tableName.getNamespace();
byte[] qualifier = tableName.getQualifier();
System.out.println(new String(name));
System.out.println(new String(namespace));
System.out.println(new String(qualifier));
}
admin.close();
}
}
Hbase的Java客户端建表预分region
Hbase在建表的时候指定表名和至少一个列族
package hbase.client;
import hbase.util.Hbase_Utils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.ArrayList;
import java.util.List;
public class Hbase_CreateTableWithRegion {
/**
* 创建一个表带有三个列族 并有3个region分区
预分region表 对表的数据进行合理的规划将数据存储再不同的region/上 避免插入热点
参数一:表的描述器
参数二:预分region的 splitkey
*/
public static void main(String[] args) throws Exception{
//获得一个hbase的管理对象
Admin admin = Hbase_Utils.getAdmin();
//表的构建器
TableDescriptorBuilder tb_region = TableDescriptorBuilder.newBuilder(TableName.valueOf("tb_region"));
//列族的构建器
ColumnFamilyDescriptorBuilder cf1builder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf1"));
ColumnFamilyDescriptorBuilder cf2builder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf2"));
ColumnFamilyDescriptorBuilder cf3builder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf3"));
//列族的描述器
ColumnFamilyDescriptor cf1 = cf1builder.build();
ColumnFamilyDescriptor cf2 = cf2builder.build();
ColumnFamilyDescriptor cf3 = cf3builder.build();
List<ColumnFamilyDescriptor> ls=new ArrayList<>();
ls.add(cf1);
ls.add(cf2);
ls.add(cf3);
tb_region.setColumnFamilies(ls);
//表的描述器
TableDescriptor build = tb_region.build();
//获取预分 region的splitkey
byte[][] splitKey = new byte[][]{"a".getBytes(),"e".getBytes()};
admin.createTable(build,splitKey);
admin.close();
}
}