HBase JAVA WEB客户端

实现一个Hbase的java版本的客户端

1、目的:实现URL get传入数据或者Post方式传输数据,进而操作Hbase

2、实现客户端是引子,我们要实现的是如果通过这种方式,从而避开Thrift或者Rest 来对Hbase进行操作

步骤:

1、可以建一个web工程,方便在应用服务器加载,并方便使用

可以建一个jsp 或者servlet 来接受传入的数据,我本地实现了一个servlet 来处理请求的数据

仅列出doGet方法的内容:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
bodyBefore(out);//body前面的页面展示
HbaseBase base = new HbaseBase();
String method = request.getParameter("method");
String tableName = null;
//create table
if (method != null && !method.equals("")&& method.equals(CommonUtils.TABLE_CREATE)) {
tableName = request.getParameter("tablename");
String tmpColumns = request.getParameter("columns");
if (tmpColumns != null && !tmpColumns.equals("")) {
boolean isTrue = base.createTable(tableName, tmpColumns.split(","));
out.print("create table is "+isTrue);
} else
out.print("please input columns 1 least");
// isnert data
} else if (method != null && !method.equals("")&& method.equals(CommonUtils.TABLE_INSERT)) {
tableName = request.getParameter("tablename");
String rowkey = request.getParameter("rowkey");
String column = request.getParameter("column");
String qualifiers = request.getParameter("qualifiers");
String values = request.getParameter("values");
try {
base.insertData(tableName, rowkey, column,
qualifiers.split(","), values.split(","));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print("insert tabledata success!");
//drop table
}else if (method != null && !method.equals("")&& method.equals(CommonUtils.TABLE_DROP)) {
tableName = request.getParameter("tablename");
base.dropTable(tableName);
out.print("drop table " + tableName + " success!");
//delete data
} else if (method != null && !method.equals("")&& method.equals(CommonUtils.TABLE_DELETE)) {
tableName = request.getParameter("tablename");
String rowKey = request.getParameter("rowkey");
base.deleteRow(tableName, rowKey);
out.print("delete table data " + tableName + " success!");
} else if (method != null && !method.equals("")&& method.equals(CommonUtils.TABLE_QUERY)) {
tableName = request.getParameter("tablename");
HashMap<String, String> map = base.QueryAll(tableName);
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
System.out.println("size========"+map.size());
out.print("<table>");
out.print("<tr><td>column</td><td>value</td></tr>");
while(iter.hasNext()){
Entry<String, String> entry = iter.next();
out.print("<tr>");
out.print("<td>");
out.print(entry.getKey());
out.print("</td>");
out.print("<td>");
out.print(new String(entry.getValue().getBytes(),"GBK"));
out.print("</td>");
out.print("</tr>");
}
out.print("</table>");
out.print("query table data " + tableName + " success!");
}
bodyFollow(out);//body 后面的html展示

}

上面用到了具体的操作 也就是我们分的另外一层,也仅仅列出了简单的操作方法

/**
* create table
* @param tableName
*/
public boolean createTable(String tableName,String[] columns) {
System.out.println("create table ...start...");
try {
HBaseAdmin hBaseAdmin = new HBaseAdmin(configuration);
if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
hBaseAdmin.disableTable(tableName);
hBaseAdmin.deleteTable(tableName);
System.out.println(tableName + " is exist,detele....");
}
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
for(String family:columns){
tableDescriptor.addFamily(new HColumnDescriptor(family));//base on we need how many families
}
hBaseAdmin.createTable(tableDescriptor);
} catch (MasterNotRunningException e) {
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("create table ...end...");
return true;
}

/**
* insert data
* @param tableName
* @throws Exception
*/
public boolean insertData(String tableName,String rowkey,String column,String[] qualifiers,String[] values) throws Exception {
System.out.println("insert data ...start...");
if(qualifiers.length==0||values.length==0){
throw new Exception("array length is not right!,please check");
}
if(qualifiers.length!=values.length){
throw new Exception("qualifiers's length must equal values's length!,please check");
}
HTablePool pool = new HTablePool(configuration, 1000);
HTable table = (HTable) pool.getTable(tableName);
Put put = new Put(rowkey.getBytes());// 一个PUT代表一行数据,再NEW一个PUT表示第二行数据,每行一个唯一的ROWKEY,此处rowkey为put构造方法中传入的值
for(int i=0;i<qualifiers.length;i++){
put.add(column.getBytes(), qualifiers[i].getBytes(), values[i].getBytes());// 本行数据的第一列
}
try {
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("insert data ...end...");
return true;
}

/**
* 删除一张表
* @param tableName
*/
public boolean dropTable(String tableName) {
try {
HBaseAdmin admin = new HBaseAdmin(configuration);
admin.disableTable(tableName);
admin.deleteTable(tableName);
} catch (MasterNotRunningException e) {
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
/**
* 根据 rowkey删除一条记录
* @param tablename
* @param rowkey
*/
public boolean deleteRow(String tablename, String rowkey) {
try {
HTable table = new HTable(configuration, tablename);
List<Delete> list = new ArrayList<Delete>();
Delete d1 = new Delete(rowkey.getBytes());
list.add(d1);

table.delete(list);
System.out.println("删除行成功!");

} catch (IOException e) {
e.printStackTrace();
}
return true;

}

为此几个方法,具体用法参考如下API

具体访问路径

http://192.168.*.*:8380/HbasePrj/servlet/HbaseHandler

目前仅支持post或者get 方法传递参数

后期或考虑传递json串。

可传参数代表可以以何种方式操作Hbase

method=create|insert|drop|delete|query表示通过何种方式操作hbase 需传上述5中操作中的一种

create: 创建表方法,必须含有的参数

1、 tablename=tablename 表示要创建的表名称

2、 columns = family1,family2… 至少有一个family如果有多个,中间必须用,隔开

drop: 删除表方法,必须含有的参数

1、 tablename=tablename 表示要删除的表名称

insert: 新增数据方法,必须含有的参数

1、 tablename = tablename 表示要添加数据的表

2、 rowkey=rowkey 表示此数据的rowkey

3、 column = family 表示添加数据的列族注意此处仅支持单列族添加一条或多条数据

4、 qualifiers = qualifier1, qualifier2 此处是此列族中要添加的具体列数据,多个列用,隔开

5、 values = value1,value2 具体对应qualifiers数据必须和qualifiers 数据一一对应,如果不一致,无法添加数据

delete: 删除一条数据目前仅支持删除单条数据

1、 tablename = tablename 要删除数据的表明

2、 rowkey = rowkey 要删除数据的行号

query: 查询一个表所有数据

1tablename=tablename要查询的表

示例:

http://192.168.*.*:8380/HbasePrj/servlet/HbaseHandler?method=create&tablename=new_table&columns=info,col

你可能感兴趣的:(Java Web)