官网地址:
http://hbase.apache.org/
下载列表:
http://hbase.apache.org/downloads.html
当前使用版本下载地址:
https://mirror.bit.edu.cn/apache/hbase/1.4.13/hbase-1.4.13-bin.tar.gz
进入安装目录(个人喜好):
# cd /alidata/server/hadoop
下载文件:
# wget https://mirror.bit.edu.cn/apache/hbase/1.4.13/hbase-1.4.13-bin.tar.gz
解压文件:
# tar -zxvf hbase-1.4.13-bin.tar.gz
查看 JAVA_HOME 环境变量:
# echo $JAVA_HOME
/alidata/server/java/jdk1.8.0_65
配置 hbase-env.sh 文件 :
# vim hbase-1.4.13/conf/hbase-env.sh
# 约 28 行 (设置 JDK 目录)
# export JAVA_HOME=/usr/java/jdk1.8.0/ 改为
export JAVA_HOME=/alidata/server/java/jdk1.8.0_65
# 46 行, 47 行 注释, JKD7 才需要
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
# 约 126 行 (改为不使用内置的 zookeeper )
# export HBASE_MANAGES_ZK=true 改为
export HBASE_MANAGES_ZK=false
配置 hbase-site.xml 文件
# vim hbase-1.4.13/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdirname>
<value>hdfs://localhost:9000/hbasevalue>
property>
<property>
<name>hbase.cluster.distributedname>
<value>truevalue>
property>
<property>
<name>hbase.master.portname>
<value>16000value>
property>
<property>
<name>hbase.zookeeper.quorumname>
<value>localhostvalue>
property>
<property>
<name>hbase.zookeeper.property.datadirname>
<value>/alidata/server/hadoop/zookeeper-3.4.14/datavalue>
property>
configuration>
服务器架构:
server-7 | server-8 | server-9 | |
---|---|---|---|
组件 | Master RegionServer |
RegionServer | RegionServer |
进入安装目录(个人喜好):
# cd /alidata/server/hadoop
下载文件:
# wget https://mirror.bit.edu.cn/apache/hbase/1.4.13/hbase-1.4.13-bin.tar.gz
解压文件:
# tar -zxvf hbase-1.4.13-bin.tar.gz
查看 JAVA_HOME 环境变量:
# echo $JAVA_HOME
/alidata/server/java/jdk1.8.0_65
配置 hbase-env.sh 文件 :
# vim hbase-1.4.13/conf/hbase-env.sh
# 约 28 行 (设置 JDK 目录)
# export JAVA_HOME=/usr/java/jdk1.8.0/ 改为
export JAVA_HOME=/alidata/server/java/jdk1.8.0_65
# 46 行, 47 行 注释, JKD7 才需要
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
# 约 126 行 (改为不使用内置的 zookeeper )
# export HBASE_MANAGES_ZK=true 改为
export HBASE_MANAGES_ZK=false
配置 hbase-site.xml 文件
# vim hbase-1.4.13/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdirname>
<value>hdfs://server-7:9000/hbasevalue>
property>
<property>
<name>hbase.cluster.distributedname>
<value>truevalue>
property>
<property>
<name>hbase.master.portname>
<value>16000value>
property>
<property>
<name>hbase.zookeeper.quorumname>
<value>server-7,server-8,server-9value>
property>
<property>
<name>hbase.zookeeper.property.datadirname>
<value>/alidata/server/hadoop/zookeeper-3.4.14/datavalue>
property>
configuration>
把Hadoop 的 core-site.xml 软连接到 HBase 的配置目录:
# ls -n /alidata/server/hadoop/hadoop-2.10.0/etc/hadoop/core-site.xml /alidata/server/hadoop/hbase-1.4.13/conf/core-site.xml
以上配置Server-7, Server-8, Server-9 都需要配置. 配置内容完全一致.
开启 Master :
# sh hbase-1.4.13/bin/hbase-daemon.sh start master
关闭 Master:
# sh hbase-1.4.13/bin/hbase-daemon.sh stop master
开启 RegionServer :
# sh hbase-1.4.13/bin/hbase-daemon.sh start regionserver
停止 RegionServer :
# sh hbase-1.4.13/bin/hbase-daemon.sh stop regionserver
集群群体开启命令:
# sh hbase-1.4.13/bin/start-hbase.sh
集群群体关闭命令:
# sh hbase-1.4.13/bin/stop-hbase.sh
使用server-7执行
http://127.0.0.1:16010/master-status
java.net.connectexception: call to localhost/127.0.0.1:16020 failed on connection exception
Master 把访问regionserver的本地IP返回给了客户端, 客户端当然无法访问本地IP.
# vim hbase-1.4.13/conf/hbase-site.xml
<property>
<name>hbase.regionserver.hostname.disable.master.reversednsname>
<value>truevalue>
property>
进入 Shell 操作模式
# sh hbase-1.4.13/bin/hbase shell
# 创建命名空间
# 格式 create_namespace '命名空间名'
> create_namespace 'np'
# 查看命名空间列表
# 格式 list_namespace
> list_namespace
# 删除命名空间
# 格式 drop_namespace '命名空间名'
> drop_namespace 'np'
# 创建表
# 格式 create '命名空间名:表明','列族名'
> create 'np:student','info'
# 创建多个列簇表
# 格式 create '命名空间名:表明','列族名1', '列簇名2'
> create 'np:student','info','detail'
# 创建表, 指定列簇和版本数
# create '命名空间名:表明',{NAME => '列族名1', VERSIONS => 2}
> create 'np:student', {NAME => 'info', VERSIONS => 2}
# 创建预分区
# 格式 create '命名空间名:表明','列族名1','列簇名2',SPLITS=>['分区1','分区2','分区3']
> create 'np:student','info','detail',SPLITS=>['100','500','999']
# 查看表列表
# 格式 list
> list
# 删除表 (删除表之前必须先 disable 表)
# 格式 disable '命名空间名:表名'
> disable 'np:student'
# 格式 drop '命名空间名:表名'
> drop 'np:student'
# 清空表数据 不保留预分区
# 格式 truncate '命名空间名:表名'
> truncate 'np:student'
# 清空表数据 保留预分区 建议使用此命令
# 格式 truncate_preserve '命名空间名:表名'
> truncate_preserve 'np:student'
# 查询表的详细信息
# 格式 desc '命名空间名:表名'
> desc 'np:student'
# 插入数据
# 格式 put '命名空间名:表名','Row_Key','列族名:字段名','数据'
> put 'np:student','1001','info:name','brando'
# 查询全部数据
# 格式 scan '命名空间名:表名'
> scan 'np:student'
# 查询单条数据
# 格式 get '命名空间名:表名','Row_key'
> get 'np:student','1001'
# 查询单条数据单个字段
# 格式 get '命名空间名:表名','Row_key','列族名:字段名'
> get 'np:student','1001','info:name'
# 查询单条数据-限定到列族
# 格式 get '命名空间名:表名','Row_key','列族名:字段名', '列族名:字段名'...
> get 'np:student','1001','info:name','info:age'...
# 查询单条数据多个字段
# 格式 get '命名空间名:表名','Row_key','列族名:字段名', '列族名:字段名'...
> get 'np:student','1001','info:name','info:age'...
<dependency>
<groupId>org.apache.hbasegroupId>
<artifactId>hbase-clientartifactId>
<version>1.4.13version>
dependency>
package org.brando;
import org.brando.tools.HBaseTools;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.Iterator;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
public class HBaseTools {
public static Connection createConnection() {
Configuration conf = HBaseConfiguration.create();
String quorum = "192.168.0.197";
String znode = "/hbase";
conf.set("hbase.zookeeper.quorum", quorum);
conf.set("zookeeper.znode.parent", znode);
conf.set("hbase.master", quorum + ":9001");
Connection conn = null;
try {
conn = ConnectionFactory.createConnection(conf);
Assert.assertNotNull(conn);
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void closeTable(Table table) {
try {
table.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Connection conn = HBaseTools.createConnection();
//设置表名, np(空间名):student(表名)
TableName tableName = TableName.valueOf("np:student");
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
//设置列簇, 可添加多个
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor("info");
tableDescriptor.addFamily(hColumnDescriptor);
// 建表时设置 预分区,
byte[][] splitKeys = { Bytes.toBytes("3000"), Bytes.toBytes("6000"), Bytes.toBytes("9000") };
// 不使用预分区可以使用: conn.getAdmin().createTable(tableDescriptor) 创建表
conn.getAdmin().createTable(tableDescriptor, splitKeys);
Table table = conn.getTable(tableName);
HBaseTools.closeTable(table);
HBaseTools.close(conn);
Connection conn = HBaseTools.createConnection();
TableName tableName = TableName.valueOf("np:student");
Table table = conn.getTable(tableName);
Connection conn = HBaseTools.createConnection();
TableName tableName = TableName.valueOf("np:student");
Table table = conn.getTable(tableName);
//设置rowkey
Put put = new Put(Bytes.toBytes("rowkey"));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("brando"));
// 注意:
// Bytes.toBytes(28) 是 int 类型
// Bytes.toBytes("28") 是 String 类型
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(28));
table.put(put);
Get get = new Get(Bytes.toBytes("rowkey"));
Result result = table.get(get);
//info: 列簇
NavigableMap<byte[], byte[]> navigableMap = result.getFamilyMap(Bytes.toBytes("info"));
Set<Map.Entry<byte[], byte[]>> entries = navigableMap.entrySet();
for(Map.Entry<byte[], byte[]> entry : entries) {
System.out.println(new String(entry.getKey()));
System.out.println(new String(entry.getValue()));
}
Get get = new Get(Bytes.toBytes("rowkey"));
Result result = table.get(get);
// info: 列簇, name: 列名
byte[] nameByte = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"));
String name = new String(nameByte);
System.out.println("name:" + name);
@Public
@Stable
public static enum CompareOp {
LESS, //小于
LESS_OR_EQUAL, //小于等于
EQUAL, //等于
NOT_EQUAL, //不等于
GREATER_OR_EQUAL, //大于等于
GREATER, //大于
NO_OP; //不操作
private CompareOp() {
}
}
作用: 比较一列值的大小, 或者是否相等.
//给出一个完整类, 后面就只给出 Filter 的使用.
package org.brando;
import org.brando.tools.HBaseTools;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.Iterator;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
public class Launcher {
public static void main(String[] args) throws Exception {
Connection conn = HBaseTools.createConnection();
// np:student: 空间名:表名
TableName tableName = TableName.valueOf("np:student");
Table table = conn.getTable(tableName);
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"), //列簇名
Bytes.toBytes("age"), //需要比较的列名
CompareFilter.CompareOp.LESS, //比较操作符, 小于
Bytes.toBytes("20") //比较的值
);
// 翻译成SQL: SELECT * FROM student t WHERE t.age < 20
Scan scan = new Scan();
scan.setFilter(singleColumnValueFilter);
ResultScanner resultScanner = table.getScanner(scan);
Iterator<Result> iterator = resultScanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
NavigableMap<byte[], byte[]> navigableMap = result.getFamilyMap(Bytes.toBytes("info"));
Set<Map.Entry<byte[], byte[]>> entries = navigableMap.entrySet();
for(Map.Entry<byte[], byte[]> entry : entries) {
System.out.println(new String(entry.getKey()));
System.out.println(new String(entry.getValue()));
}
}
HBaseTools.closeTable(table);
HBaseTools.close(conn);
}
}
package org.brando;
import com.atomic.tools.HBaseTools;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.Iterator;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
public class Launcher {
public static void main(String[] args) throws Exception {
Connection conn = HBaseTools.createConnection();
TableName tableName = TableName.valueOf("np:student");
Table table = conn.getTable(tableName);
SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("age"),
CompareFilter.CompareOp.LESS,
Bytes.toBytes(20)
);
SingleColumnValueFilter genderFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("gender"),
CompareFilter.CompareOp.EQUAL,
Bytes.toBytes(0)
);
// 翻译成SQL: SELECT * FROM student t WHERE t.age < 20 AND t.gender = 0
// 设置, 缺失值过滤.
ageFilter.setFilterIfMissing(true);
genderFilter.setFilterIfMissing(true);
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(ageFilter);
filterList.addFilter(genderFilter);
Scan scan = new Scan();
scan.setFilter(filterList);
ResultScanner resultScanner = table.getScanner(scan);
Iterator<Result> iterator = resultScanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
NavigableMap<byte[], byte[]> navigableMap = result.getFamilyMap(Bytes.toBytes("info"));
Set<Map.Entry<byte[], byte[]>> entries = navigableMap.entrySet();
for(Map.Entry<byte[], byte[]> entry : entries) {
System.out.println(new String(entry.getKey()));
System.out.println(new String(entry.getValue()));
}
}
HBaseTools.closeTable(table);
HBaseTools.close(conn);
}
}
该过滤器主要用于对 Rowkey 的过滤, 可以结合上面的多条件过滤器和下面的各种比较器来实现比较和过滤.
RowFilter rowFilter = new RowFilter(
CompareFilter.CompareOp.EQUAL, //比较操作符
new BinaryPrefixComparator(Bytes.toBytes("001_01"))
//二进制前缀比较器, 按字典顺序比较.
);
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, // 自定义比较器必须传 EQUAL
new RegexStringComparator("^Bran") // Bran 开头的正则表达式
);
// 翻译成SQL: SELECT * FROM student t WHERE t.name LIKE 'Bran%'
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, //自定义比较器必须传 EQUAL
new SubstringComparator("ran")
);
// 翻译成SQL: SELECT * FROM student t WHERE t.name LIKE '%ran%'
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, //自定义比较器必须传 EQUAL
new BinaryPrefixComparator(Bytes.toBytes("Bran"))
);
// 效率比正则快
// 翻译成SQL: SELECT * FROM student t WHERE t.name LIKE 'Bran%'
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, //可以传入其他比较方式, 按字典顺序比较
new BinaryComparator(Bytes.toBytes("Brando"))
);
// 单列值过滤 默认使用 二进制比较器 (BinaryComparator)
// 翻译成SQL: SELECT * FROM student t WHERE t.name = 'Brando'