HBase常用Shell命令和基础开发

HBase常用Shell命令

HBase中用create命令创建表:

1
create 'Student','Num','Name','Sex','Age'

运行结果如下:

1
2
3
4
hbase(main):008:0> create 'Student','Num','Name','Sex','Age'
0 row(s) in 2.4910 seconds
=> Hbase::Table - Student
hbase(main):009:0>

此时,即创建了一个’Student’表,属性有:Num,Name,Sex,Age。因为HBase的表中会有一个系统默认的属性作为行键,无需自行创建,默认为put命令操作中表名后第一个数据。创建完“student”表后,可通过describe命令查看“student”表的基本信息。

HBase数据库基本操作:

添加数据-put:

HBase中用put命令添加数据,注意:一次只能为一个表的一行数据的一个列,也就是一个单元格添加一个数据,所以直接用shell命令插入数据效率很低,在实际应用中,一般都是利用编程操作数据。

在添加数据时,HBase会自动为添加的数据添加一个时间戳,故在需要修改数据时,只需直接添加数据,HBase即会生成一个新的版本,从而完成“改”操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表的时候指定。

当运行命令:put ‘Student’,’1001’,’ZhangSan’,male’,’23’时,即为Student表添加了学号为1001,姓名为ZhangSan,性别男,年龄23的一条数据。行键为1001.

1
put 'Student','1001','ZhangSan',male','23'

删除数据:

在HBase中用delete以及deleteall命令进行删除数据操作,它们的区别是:1. delete用于删除一个数据,是put的反向操作;2. deleteall操作用于删除一行数据。

1
2
3
4
5
delete 'Student','1001','Age'
#删除学号为1001的年龄。

delete 'Student','1001'
#删除学号为1001的所示数据。

查看数据:

HBase中有两个用于查看数据的命令:1. get命令,用于查看表的某一行数据;2. scan命令用于查看某个表的全部数据

1
2
3
4
5
get 'Student','1001'
#查看学生学号为1001的信息

scan 'student'
#查看整个Student表的信息。

删除表:

删除表有两步,第一步先让该表不可用,第二步删除表。

1
2
3
4
5
disable 'Student'
#先禁用表

drop 'Student'
#删除表

查询表历史数据:

查询表的历史版本,需要两步。
1、在创建表的时候,指定保存的版本数(假设指定为5)

1
create 'Student',{NAME=>'username',VERSIONS=>5}

2、插入数据然后更新数据,使其产生历史版本数据,注意:这里插入数据和更新数据都是用put命令

1
2
3
4
put 'Student','1001','username','Mary'
put 'Student','1001','username','Mary1'
put 'Student','1001','username','Mary2'
put 'Student','1001','username','Mary3'

3、查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)

1
get 'Student','1001',{COLUMN=>'username',VERSIONS=>5}

退出HBase数据库表操作:

最后退出数据库操作,输入exit命令即可退出,注意:这里退出HBase数据库是退出对数据库表的操作,而不是停止启动HBase数据库后台运行。

HBase API详解

写HBase程序,需导入hbase安装目录中的lib文件中的所有jar包就行。

HBase常用API介绍:

Admin:

HBase的管理API。从connecgetadmin()获取一个实例,然后调用close()。

Admin可用于创建、删除、列出、启用和禁用表、添加和删除表列家庭和其他行政操作。

Admin的常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//判断表是否存在
boolean tableExists(TableName tableName)
throws IOException

//这个对象使用的连接。
Connection getConnection()

//列出与给定模式匹配的所有用户空间表。
HTableDescriptor[] listTables(Pattern pattern)

//列出所有用户表的空间
TableName[] listTableNames(String regex)

//获得表描述符的方法
HTableDescriptor getTableDescriptor(TableName tableName)

//创建一个新表。同步操作
void createTable(HTableDescriptor desc)

//删除一个表。同步操作。
void deleteTable(TableName tableName)

Connection:

一个集群连接,将较低层次的个人连接封装到实际的服务器上,并连接到zookeeper。连接通过ConnectionFactory类实例化。连接的生命周期由调用者管理,后者必须close()连接以释放资源。

连接对象包含找到master的逻辑,定位集群上的区域,保留一个位置的缓存,然后知道如何在移动后重新校准。与服务器、元缓存、zookeeper连接等的个人连接都是由Table和Admin从该连接获得的管理实例共享的.

连接创建是一个重量级的操作。连接实现是线程安全的,因此客户端可以创建一次连接,并与不同的线程共享它。另一方面,Admin和Table实例是轻量级的,并且不是线程安全的。通常,每个客户端应用程序的单个连接被实例化,并且每个线程都将获得它自己的表实例。不建议对Table和Admin进行缓存或合用。

Connection的常用方法:

1
2
3
4
5
6
7
8
9
10
11
void close()//关闭连接
Admin getAdmin() //检索管理实现来管理HBase集群。

//这个连接实例正在使用的配置实例
org.apache.hadoop.conf.Configuration getConfiguration()

//检索表实现来访问表。返回的表不是线程安全的,应该为每个使用线程创建一个新的实例。这是一个轻量级的操作,既不需要也不需要对返回的表进行池或缓存。
Table getTable(TableName tableName)

//检索管理实现来管理HBase集群。返回的管理员不能保证是线程安全的。每一个使用线程都应该创建一个新的实例。这是一个轻量级操作。不建议对返回的管理员进行池或缓存。
Admin getAdmin()

Table:

用于与单个HBase表进行通信。从连接中获取一个实例,然后调用close().

表格可用于从表中获取、放置、删除或扫描数据。

HTableDescriptor:

HTableDescriptor包含关于HBase表的详细信息,例如所有列家族的描述符,是表a目录表,-根-或HBase:meta,如果表只读取,memstore的最大大小,当区域拆分时,与之关联的协处理器等等。

##HBase编程示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;

public class ExampleForHbase{
public static Configuration configuration;
public static Connection connection;
public static Admin admin;

//主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释
public static void main(String[] args)throws IOException{
//创建一个表,表名为Score,列族为sname,course
createTable("Score",new String[]{"sname","course"});

//在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空)
//等价命令:put 'Score','95001','sname','Mary'
//insertRow("Score", "95001", "sname", "", "Mary");
//在Score表中插入一条数据,其行键为95001,course:Math为88(course为列族,Math为course下的子列)
//等价命令:put 'Score','95001','score:Math','88'
//insertRow("Score", "95001", "course", "Math", "88");
//在Score表中插入一条数据,其行键为95001,course:English为85(course为列族,English为course下的子列)
//等价命令:put 'Score','95001','score:English','85'
//insertRow("Score", "95001", "course", "English", "85");

//1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math
//执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释
//等价命令:delete 'Score','95001','score:Math'
//deleteRow("Score", "95001", "course", "Math");

//2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除)
//执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释
//等价命令:delete 'Score','95001','score'
//deleteRow("Score", "95001", "course", "");

//3、删除Score表中指定行数据,其行键为95001
//执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释
//等价命令:deleteall 'Score','95001'
//deleteRow("Score", "95001", "", "");

//查询Score表中,行键为95001,列族为course,列为Math的值
//getData("Score", "95001", "course", "Math");
//查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空)
//getData("Score", "95001", "sname", "");

//删除Score表
//deleteTable("Score");
}

//建立连接
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
//关闭连接
public static void close(){
try{
if(admin != null){
admin.close();
}
if(null != connection){
connection.close();
}
}catch (IOException e){
e.printStackTrace();
}
}

/**
* 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
* @param myTableName 表名
* @param colFamily 列族名
* @throws IOException
*/
public static void createTable(String myTableName,String[] colFamily) throws IOException {

init();
TableName tableName = TableName.valueOf(myTableName);

if(admin.tableExists(tableName)){
System.out.println("talbe is exists!");
}else {
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
for(String str:colFamily){
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
hTableDescriptor.addFamily(hColumnDescriptor);
}
admin.createTable(hTableDescriptor);
System.out.println("create table success");
}
close();
}
/**
* 删除指定表
* @param tableName 表名
* @throws IOException
*/
public static void deleteTable(String tableName) throws IOException {
init();
TableName tn = TableName.valueOf(tableName);
if (admin.tableExists(tn)) {
admin.disableTable(tn);
admin.deleteTable(tn);
}
close();
}

/**
* 查看已有表
* @throws IOException
*/
public static void listTables() throws IOException {
init();
HTableDescriptor hTableDescriptors[] = admin.listTables();
for(HTableDescriptor hTableDescriptor :hTableDescriptors){
System.out.println(hTableDescriptor.getNameAsString());
}
close();
}
/**
* 向某一行的某一列插入数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名(如果其列族下没有子列,此参数可为空)
* @param val 值
* @throws IOException
*/
public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
table.put(put);
table.close();
close();
}

/**
* 删除数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名
* @throws IOException
*/
public static void deleteRow(String tableName,String rowKey,String colFamily,String col) throws IOException {
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(rowKey.getBytes());
//删除指定列族的所有数据
//delete.addFamily(colFamily.getBytes());
//删除指定列的数据
//delete.addColumn(colFamily.getBytes(), col.getBytes());

table.delete(delete);
table.close();
close();
}
/**
* 根据行键rowkey查找数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名
* @throws IOException
*/
public static void getData(String tableName,String rowKey,String colFamily,String col)throws IOException{
init();
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
showCell(result);
table.close();
close();
}
/**
* 格式化输出
* @param result
*/
public static void showCell(Result result){
Cell[] cells = result.rawCells();
for(Cell cell:cells){
System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
System.out.println("Timetamp:"+cell.getTimestamp()+" ");
System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
}
}
}


以上内容为听华为大数据培训课程和大学MOOC上厦门大学 林子雨的《大数据技术原理与应用》课程而整理的笔记。

大数据技术原理与应用https://www.icourse163.org/course/XMU-1002335004


坚持原创技术分享,您的支持将鼓励我继续创作!