Wasp上手实例

Wasp是阿里开源的类似MegaStore和F1的分布式关系型数据库,本文将简要介绍如何快速部署Wasp及使用JDBC的方式连接和操作Wasp

准备

1.一个分布式部署的hbase集群,hbase已经启动

2.编译代码的机器上已经安装好Maven和JDK6

编译代码

1.使用如下命令从github克隆最新代码

1
git clone https://github.com/alibaba/wasp.git

2.进入wasp目录,并确保当前目录为JDK6

1
2
3
4
5
 ~/workspace/java$: cd wasp/
~/workspace/java/wasp$: java -version
java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-457-11M4509)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-457, mixed mode)

3.执行如下命令进行编译

1
mvn -DskipTests assembly:assembly

4.编译完成后,target目录下的wasp-0.10-bin.tar.gz就是我们稍后将会用的压缩包

配置

1.将wasp-0.10-bin.tar.gz上传到服务器指定的目录

1
~/workspace/java/wasp$: scp target/wasp-0.10-bin.tar.gz haosong.hhs@10.232.98.96:develop/soft/

2.登录服务器后,解压wasp-0.10-bin.tar.gz并进入解压后的目录

1
~/develop/soft$: tar -zxvf wasp-0.10-bin.tar.gz

3.编辑conf目录下的wasp-site.xml,加上如下配置:

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
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!-- 设置wasp在zk中的父目录 -->
<name>zookeeper.wasp.znode.parent</name>
<value>/wasp</value>
</property>
<property>
<!-- 设置wasp使用的zk地址,该地址必须是依赖的存储引擎hbase使用的zk地址 -->
<name>wasp.zookeeper.quorum</name>
<value>10.232.98.94,10.232.98.72,10.232.98.40</value>
</property>
<property>
<!-- 设置wasp使用的zk端口号 -->
<name>wasp.zookeeper.property.clientPort</name>
<value>40060</value>
</property>
<property>
<!-- 设置hbase在zk中的父目录 -->
<name>zookeeper.znode.parent</name>
<value>/hbase-cdh4</value>
</property>
<property>
<!-- 设置hbase使用的zk地址 -->
<name>hbase.zookeeper.quorum</name>
<value>10.232.98.94,10.232.98.72,10.232.98.40</value>
</property>
<property>
<!-- 设置hbase使用的zk端口号 -->
<name>hbase.zookeeper.property.clientPort</name>
<value>40060</value>
</property>
<property>
<!-- 设置系统为分布式模式 -->
<name>wasp.cluster.distributed</name>
<value>true</value>
</property>
<property>
<!-- master节点的服务端口 -->
<name>wasp.master.port</name>
<value>45050</value>
</property>
<property>
<!-- master的web页面的服务端口 -->
<name>wasp.master.info.port</name>
<value>45051</value>
</property>
<property>
<!-- 数据服务节点的服务端口 -->
<name>wasp.fserver.port</name>
<value>45052</value>
</property>
<property>
<!-- 数据服务节点的web页面的服务端口 -->
<name>wasp.fserver.info.port</name>
<value>45053</value>
</property>
</configuration>

4.编辑conf目录下的wasp-env.sh,禁用Wasp自动启动zookeeper集群:

1
export WASP_MANAGES_ZK=false

5.编辑conf目录下的fservers,加上fservers的地址,需确保已经配置fservers的免认证登录

1
2
3
10.232.98.60
10.232.98.61
10.232.98.62

部署及启动

1.完成配置后,将wasp-0.10同步到所有fservers服务器上,注意保持一样访问结构

2.使用如下命令启动Wasp

1
~/develop/soft$: ./wasp-0.10/bin/start-wasp.sh

3.启动Wasp Shell,使用status命令检查是否成功启动,若出现如下的提示信息,则表明已成功启动Wasp:

1
2
3
~/develop/soft$: ./wasp-0.10/bin/wasp shell
wasp(main):061:0> status
3 servers, 0 dead, 0.3333 average load

使用JDBC操作数据库

经过前面那么多的准备步骤后,我们现在终于可以使用Wasp来存储我们的数据了。而Wasp提供了我们非常熟悉的JDBC连接方式,下面将介绍如何以JDBC连接和操作Wasp。

1.在代码中需配置Wasp的zookeeper相关信息

1
2
3
4
5
6
7
Properties props = new Properties();
/*
* 配置wasp对应的zookeeper属性
*/

props.setProperty("wasp.zookeeper.quorum",
"10.232.98.94,10.232.98.72,10.232.98.40");
props.setProperty("wasp.zookeeper.property.clientPort", "40060");

2.载入Wasp的JDBC驱动

1
2
3
4
5
6
/*
* 载入wasp的jdbc和初始化相关对象
*/

com.alibaba.wasp.jdbc.Driver.load();
Connection conn = DriverManager.getConnection("jdbc:wasp:", props);
Statement stat = conn.createStatement();

OK,下面我们就可以通过直接执行SQL语句来操作Wasp,比如

1.创建表

1
2
3
4
5
6
7
8
9
/*
* 创建user表,主键为user_id
*/

String sql = "CREATE TABLE user {REQUIRED INT64 user_id;"
+ " REQUIRED STRING name; }"
+ " PRIMARY KEY(user_id),"
+ " ENTITY GROUP ROOT,"
+ " ENTITY GROUP KEY(user_id);";
stat.execute(sql);

2.插入记录

1
2
3
4
5
/*
* 插入id为1,name为'test'的记录
*/

sql = "INSERT INTO user(user_id,name) values(1,'test');";
stat.execute(sql);

3.查询记录

1
2
3
4
5
6
7
8
9
/*
* 查询user_id为1的记录信息
* 最终控制台结果为:1,test
*/

sql = "SELECT * FROM user WHERE user_id=1;";
ResultSet rs = stat.executeQuery(sql);
for (; rs.next(); ) {
System.out.println(rs.getString("user_id") + "," + rs.getString("name"));
}

整个完整的代码为:

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
package me.haosdent.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class WaspExample {
public static void main(String[] args) {
Properties props = new Properties();
/*
* 配置wasp对应的zookeeper属性
*/

props.setProperty("wasp.zookeeper.quorum", "10.232.98.94,10.232.98.72,10.232.98.40");
props.setProperty("wasp.zookeeper.property.clientPort", "40060");

/*
* 载入wasp的jdbc
*/

com.alibaba.wasp.jdbc.Driver.load();
Connection conn = null;
Statement stat = null;
try {
conn = DriverManager.getConnection("jdbc:wasp:", props);
stat = conn.createStatement();
/*
* 创建user表,主键为user_id
*/

String sql = "CREATE TABLE user {REQUIRED INT64 user_id;"
+ " REQUIRED STRING name; }"
+ " PRIMARY KEY(user_id),"
+ " ENTITY GROUP ROOT,"
+ " ENTITY GROUP KEY(user_id);";
stat.execute(sql);
Thread.sleep(2000);

/*
* 插入id为1,name为'test'的记录
*/

sql = "INSERT INTO user(user_id,name) values(1,'test');";
stat.execute(sql);

/*
* 查询user_id为1的记录信息
* 控制台结果:1,test
*/

sql = "SELECT * FROM user WHERE user_id=1;";
ResultSet rs = stat.executeQuery(sql);
for (; rs.next(); ) {
System.out.println(rs.getString("user_id") + "," + rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
stat.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

写好代码导出为jar包后,使用如下命令运行程序,运行时需将之前解压wasp-0.10-bin.tar.gzlib目录加到CLASSPATH中:

1
java -cp /tmp/wasp-0.10/lib/*:/tmp/WaspExample.jar me.haosdent.test.WaspExample

控制台结果如下,说明已经成功插入记录到Wasp并查询到相关数据:

1
1,test

而登录上服务器后,进入Wasp Shell,也可以查询到之前创建的user表信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 显示所有表
wasp(main):062:0> show_tables
TABLE
user
1 row(s) in 0.0130 seconds

## 查看user表的结构
wasp(main):065:0> describe_table 'user'
+---------------------------+----------+----------+-----+-----+
| Field | Type | REQUIRED | Key | EGK |
+---------------------------+----------+----------+-----+-----+
| user_id | INT64 | REQUIRED | PRI | EGK |
| name | STRING | REQUIRED | | |
+---------------------------+----------+----------+-----+-----+
1 row(s) in 0.0050 seconds

上手示例到这里已经结束,关于Wasp更多有趣的功能你可以从此wiki的其他文章中更进一步了解。若操作过程中有任何疑问或需求,欢迎到此处提issue