一、概述
HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键、列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平台。HBase不限制存储的数据的种类,允许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase被设计成在一个服务器集群上运行,可以相应地横向扩展。
二、安装
2.1下载并解压
2.2配置环境变量
vim /etc/profile
export HBASE_HOME=/usr/local/hbase-1.4.9
export PATH=$PATH:$HBASE_HOME/bin
source /etc/profile
2.3验证
2.4配置hbase-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
export HBASE_CLASSPATH=/usr/local/hadoop-2.9.2/conf
#使用HBASE自带的zookeeper管理集群
export HBASE_MANAGES_ZK=true
2.5配置hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1</value>
</property>
2.6启动hbase
三、举例
3.1启动Hbase shell环境
3.2命令
新建一个名为test的表,其只包含一个名为data的列,表和列族属性为默认值
create 'test','data'
输出空间的所有表
list
输入表内容
put 'test','row1','data:1','value1'
put 'test','row2','data:2','value2'
put 'test','row3','data:3','value3'
禁用表
disable 'test'
删除表
drop 'test'
四、结合Java
//创建表并添加数据
public class ExampleClient {
public static void main(String[] args) throws IOException {
Configuration config = HBaseConfiguration.create();
// Create table
HBaseAdmin admin = new HBaseAdmin(config);
try {
TableName tableName = TableName.valueOf("test");
HTableDescriptor htd = new HTableDescriptor(tableName);
HColumnDescriptor hcd = new HColumnDescriptor("data");
htd.addFamily(hcd);
admin.createTable(htd);
HTableDescriptor[] tables = admin.listTables();
if (tables.length != 1 &&
Bytes.equals(tableName.getName(), tables[0].getTableName().getName())) {
throw new IOException("Failed create of table");
}
// Run some operations -- three puts, a get, and a scan -- against the table.
HTable table = new HTable(config, tableName);
try {
for (int i = 1; i <= 3; i++) {
byte[] row = Bytes.toBytes("row" + i);
Put put = new Put(row);
byte[] columnFamily = Bytes.toBytes("data");
byte[] qualifier = Bytes.toBytes(String.valueOf(i));
byte[] value = Bytes.toBytes("value" + i);
put.add(columnFamily, qualifier, value);
table.put(put);
}
Get get = new Get(Bytes.toBytes("row1"));
Result result = table.get(get);
System.out.println("Get: " + result);
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
try {
for (Result scannerResult : scanner) {
System.out.println("Scan: " + scannerResult);
}
} finally {
scanner.close();
}
// Disable then drop the table
admin.disableTable(tableName);
admin.deleteTable(tableName);
} finally {
table.close();
}
} finally {
admin.close();
}
}
}
//检索HBase表中某范围内气象站观测数据行
public class HBaseTemperatureQuery extends Configured implements Tool {
static final byte[] DATA_COLUMNFAMILY = Bytes.toBytes("data");
static final byte[] AIRTEMP_QUALIFIER = Bytes.toBytes("airtemp");
public NavigableMap<Long, Integer> getStationObservations(HTable table,
String stationId, long maxStamp, int maxCount) throws IOException {
byte[] startRow = RowKeyConverter.makeObservationRowKey(stationId, maxStamp);
NavigableMap<Long, Integer> resultMap = new TreeMap<Long, Integer>();
Scan scan = new Scan(startRow);
scan.addColumn(DATA_COLUMNFAMILY, AIRTEMP_QUALIFIER);
ResultScanner scanner = table.getScanner(scan);
try {
Result res;
int count = 0;
while ((res = scanner.next()) != null && count++ < maxCount) {
byte[] row = res.getRow();
byte[] value = res.getValue(DATA_COLUMNFAMILY, AIRTEMP_QUALIFIER);
Long stamp = Long.MAX_VALUE -
Bytes.toLong(row, row.length - Bytes.SIZEOF_LONG, Bytes.SIZEOF_LONG);
Integer temp = Bytes.toInt(value);
resultMap.put(stamp, temp);
}
} finally {
scanner.close();
}
return resultMap;
}
public int run(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Usage: HBaseTemperatureQuery <station_id>");
return -1;
}
HTable table = new HTable(HBaseConfiguration.create(getConf()), "observations");
try {
NavigableMap<Long, Integer> observations =
getStationObservations(table, args[0], Long.MAX_VALUE, 10).descendingMap();
for (Map.Entry<Long, Integer> observation : observations.entrySet()) {
// Print the date, time, and temperature
System.out.printf("%1$tF %1$tR\t%2$s\n", observation.getKey(),
observation.getValue());
}
return 0;
} finally {
table.close();
}
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(HBaseConfiguration.create(),
new HBaseTemperatureQuery(), args);
System.exit(exitCode);
}
}