HBase安装与配置
1. 从Apache官网上下载适合的HBase版本,然后对其进行解压。
2. 配置hbase-env.sh文件:
export JAVA_HOME=/root/apps/jdk1.7.0_67 # 我在系统环境变量中已经配置了虚拟机的路径,所以我觉得这里可以不用配置了
export HBASE_MANAGES_ZK=false # 不使用hbase自带的zk集群
3. 配置hbase-site.xml文件:
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hdp01:9000/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hdp01:2181,hdp02:2181,hdp03:2181</value>
</property>
</configuration>
4. 配置regionservers文件:
hdp01
hdp02
hdp03
# 与hadoop集群中配置的salve相似,通过该配置文件,hbase集群启动命令可以启动所有节点上的hbase软件,另外master进程也可以通过其来感知各个hbase。
5. hbase软件相关命令:
bin/start-hbase.sh # 启动整个hbase集群,并且在该命令的输入节点上会启动一个master进程
bin/stop-hbase.sh # 关闭hbase集群
HBase shell命令行与API使用
命令行的使用
1. 进入hbase shell命令行:bin/hbase shell
2. 查看hbase中的表列表:list
3. 建表:create "tabelname","column1",'column2' # 在表tabelname中创建列族column1和column2
4. 删除整个表:disable "tabelname" 或者 drop "tabelname"
3. 插入数据:put "tabelname", "001", "column1:username", "zhangsan" # 在表tabelname中的column1列族中插入第001行数据,key为username, value为zhangsan
4. 查询整个表中的数据:scan "tabelname"
查询表中的单行数据:get "tabelname", ”001“
5. 删除表中某行的一个kv数据:delete "tabelname", "001", "column1:username"
删除整行数据:deleteall "tabelname", "001"
客户端API的使用
1、 创建一个连接
Connection conn = ConnectionFactory.createConnection(conf); # conf对象中有hbase的配置文件
2、拿到一个DDL操作器:表管理器admin
Admin admin = conn.getAdmin();
3、创建一个表:
HTableDescriptor htd= new HTableDescriptor(TableName.valueOf("usertable"));
4、创建一个列族:
HColumnDescriptor hcd = new HColumnDescriptor("base_info");
5、将创建的列族存入表中:
htd.addFamily(hcd);
6、用ddl操作器对象admin 来建表
admin.createTable(htd); # 上面只是创建了一个表对象,需要在这里将对象存入HBase数据库中
7、停用表和删除表
admin.disableTable(TableName.valueOf("usertabel"));
admin.deleteTable(TableName.valueOf("usertabel"));
8、修改表定义,例如在原来的表结构上添加一个新的列族
admin.modifyTable(TableName.valueOf("usertabel"), htd);
1、获取表对象:
Table user = conn.getTable(TableName.valueOf("usertabel"));
2、插入数据(修改数据):
Put put = new Put(Bytes.toBytes("001"));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("张三"));
user.put(put); # 将put对象存入user表中
# 如果列族中某个字段已经存在了,put效果是修改,否则是插入
3、删除数据:
Delete del = new Delete(Bytes.toBytes("001"));
user.delete(dels);
4、查询对象:
Get get = new Get("002".getBytes());
Result res = user.get(get); # 从user表中获取第002行的数据结果
byte[] value = result.getValue("base_info".getBytes(), "age".getBytes());
System.out.println(new String(value));
疑惑
1. HBase存储表之前需要创建数据库吗?为什么?
会有命名空间。命名空间是对表的逻辑分组,不同的命名空间类似于关系型数据库中的不同的Database数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。