列(column)是最基本的存储单位
列的名称规范:列族名:列名
hbase 会尽量将属于同一个列族的列放在一台机器上面
多个列可以组成一个列族(column family)
表的属性定义在列族上,如:过期时间、数据块缓存、是否压缩等
因此,同一个表的列族可以有完全不同的属性,
但是,同一个列族内的列具有相同的属性
每个行都拥有唯一的一个行键(rowkey),行键是一串不可重复的字符串
hbase中无法根据column来排序,只能根据rowkey进行排序,排序规则是根据字典
如:key1 key2 key11
结果:key1 key11 key2
单元格
一个列上面可能存储多个版本的值
多个版本的值被存储在多个单元格中
唯一确定一条结果的表达式应该是:行键:列族:列:版本号
版本号可以省略,如果不写版本号,hbase会默认使用最后一个版本的数据
每个列或者每个单元都会被赋予一个时间戳,
该时间戳默认由系统指定,也可以用户显示指定
注意:
行与行的列可以完全不一样
上一行和下一行的数据也可以存储在不同的机器上
同一行内的列可以存储在完全不同的机器上
提示:
一个表设置多少列族比较好?官方建议越少越好
虽然hbase是分布式数据库,但是数据在同一台物理机上依然会加速数据的查询速度
所以列族太多会极大的降低数据库性能,并且列族定义太多容易出现bug
Region
region是一段数据的集合
region是基于searchserver的,它的所有数据存取操作都是调用hdfs客户端来实现
一个region就是多个行
zookeeper、hbase、hdfs的关系
hbase中的regionServer存储实际的表数据信息
这些数据信息存储在hdfs上面
zookeeper管理这些regionServer,
包括具体的数据字段存储在哪个regionServer上面,
客户端每次与hbase连接,其实先和zookeeper通信,
查询出需要先和哪个regionServer通信,然后再连接该regionServer
1、拷贝服务器上 hadoop core-site.xml 和hbase hbase-site.xml 文件放到项目的resource目录下面
2、即使是连接远程的 hadoop,也需要在本地安装 hadoop
下载winutils的windows版本 https://github.com/srccodes/hadoop-common-2.2.0-bin
下载后文件名为 hadoop-common-2.2.0-bin-master.zip ,然后再解压
3、配置环境变量
4、代码
public class HBaseAdminUtil {
private static Logger logger = LoggerFactory.getLogger(HBaseAdminUtil.class);
/**
* 获取一个hbase的连接
* @return 返回一个连接
*/
public static Connection getConnection(){
Connection connection = null;
try {
//1、创建一个Configuration 加载hbase的配置项
Configuration configuration = HBaseConfiguration.create();
//2、加载配置文件放入 Configuration
Path basePath = new Path(ClassLoader.getSystemResource("hbase-site.xml").toURI());
Path hadoopPath = new Path(ClassLoader.getSystemResource("core-site.xml").toURI());
configuration.addResource(basePath);
configuration.addResource(hadoopPath);
//3、加载配置类创建一个hbase的连接
connection = ConnectionFactory.createConnection(configuration);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
/**
* 创建表,创建表的时候需要指定列族
* @param connection hbase连接
* @param tableName hbase表名
* @param columnFamily hbase列族名
*/
public static void createTable(Connection connection,String tableName,String columnFamily){
//1、定义一个表名
TableName hTableName = TableName.valueOf(tableName);
//2、定义表属性
HTableDescriptor hTableDescriptor = new HTableDescriptor(hTableName);
//3、定义列族
HColumnDescriptor column_family = new HColumnDescriptor(columnFamily);
//4、将表属性作用于列族
hTableDescriptor.addFamily(column_family);
//5、使用Admin对象创建表
Admin admin;
try {
admin = connection.getAdmin();
//如果表存在删除,不存在创建
if (admin.tableExists(hTableName)){
deleteTable(connection,tableName);
}
admin = connection.getAdmin();
admin.createTable(hTableDescriptor);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 删除表
* @param connection hbase连接
* @param tableName hbase表名
*/
public static void deleteTable(Connection connection, String tableName){
try {
TableName table_name = TableName.valueOf(tableName);
Admin admin = connection.getAdmin();
admin.disableTable(table_name);
admin.deleteTable(table_name);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 给指定表添加列
* @param connection hbase连接
* @param tableName 表名
* @param columnFamily 列族名
*/
public static void addColumnFamily(Connection connection, String tableName, String columnFamily){
TableName hTableName = TableName.valueOf(tableName);
HTableDescriptor hTableDescriptor = new HTableDescriptor(hTableName);
HColumnDescriptor column_family = new HColumnDescriptor(columnFamily);
hTableDescriptor.addFamily(column_family);
try {
Admin admin = connection.getAdmin();
admin.addColumn(hTableName,column_family);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class HBaseTableUtil {
/**
* 获取hbase的连接
* @return 返回一个hbase的连接
*/
public static Connection getConnection(){
Connection connection = null;
try {
Configuration configuration = HBaseConfiguration.create();
Path basePath = new Path(ClassLoader.getSystemResource("hbase-site.xml").toURI());
Path hadoopPath = new Path(ClassLoader.getSystemResource("core-site.xml").toURI());
configuration.addResource(basePath);
configuration.addResource(hadoopPath);
connection = ConnectionFactory.createConnection(configuration);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
/**
* 向表中插入数据内容
* 如果输入的表名、列族、列相同,内容会被覆盖
* @param connection hbase连接
* @param tableName 表名
* @param columnFamily 列族
* @param rowkey 行键
* @param value 内容
*/
public static void addColumn(Connection connection, String tableName, String rowkey, String columnFamily, String column, String value){
try {
TableName table_name = TableName.valueOf(tableName);
Table table = connection.getTable(table_name);
Put put = new Put(Bytes.toBytes(rowkey));
put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 向指定的行键、列族、列中追加指定内容
* @param connection hbase连接
* @param tableName hbase表名
* @param rowkey 行键
* @param columnFamily 列族
* @param column 列
* @param value 值
*/
public static void appendContent(Connection connection,String tableName, String rowkey, String columnFamily, String column, String value){
try {
TableName table_name = TableName.valueOf(tableName);
Table table = connection.getTable(table_name);
Append append = new Append(Bytes.toBytes(rowkey));
append.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
table.append(append);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 使用某个rowkey、某个列族、某列对应的值
* @param connection 获取hbase连接
* @param tableName hbase表名
* @param rowkey hbase的行键
*/
public static String getContent(Connection connection,String tableName, String rowkey, String columnFamily, String column){
String resultStr = null;
try {
TableName table_name = TableName.valueOf(tableName);
Table table = connection.getTable(table_name);
Get get = new Get(Bytes.toBytes(rowkey));
Result result = table.get(get);
byte[] resultBytes = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
resultStr = new String(resultBytes);
} catch (IOException e) {
e.printStackTrace();
}
return resultStr;
}
/**
* 删除指定的行键 列族 列
* @param connection 连接
* @param tableName 表名
* @param rowKey 行键
* @param columnFamily 列族
* @param column 列
*/
public static void deleteContent(Connection connection, String tableName, String rowKey, String columnFamily, String column){
try {
TableName table_name = TableName.valueOf(tableName);
Table table = connection.getTable(table_name);
Delete delete = new Delete(Bytes.toBytes(rowKey));
delete.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
table.delete(delete);
} catch (IOException e) {
e.printStackTrace();
}
}
}