常量接口
public interface Constant {
//命名空间
String NAMESPACE="weibo";
//内容表
String CONTENT="weibo:content";
//用户关系表
String RELATIONS="weibo:relations";
//收件箱表
String INBOX="weibo:inbox";
}
工具类及测试代码代码
- WeiBoUtil
public class WeiBoUtil {
private static Configuration cfg = HBaseConfiguration.create();
static {
cfg.set("hbase.zookeeper.quorum", "hcmaster:2181,hcslave1:2181,hcslave2:2181");
}
}
public class WeiBoUtilTest {
}
连接池工具类
public class HBasePoolUtil {
private static Configuration conf = null;
// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
private static ExecutorService executor = null;
private static Connection conn = null;
static {
try {
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hcmaster:2181,hcslave1:2181,hcslave2:2181");
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("hbase.defaults.for.version.skip", "true");
executor = new ThreadPoolExecutor(5, 15, 1000,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue(10), // 使用有界队列,避免OOM
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
conn = ConnectionFactory.createConnection(conf, executor);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConn() {
return conn;
}
}
具体代码
创建命名空间以及表名的定义
public static void createNamespace(String namespace) throws IOException {
Connection conn = HBasePoolUtil.getConn();
Admin admin = conn.getAdmin();
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(namespace).build();
admin.createNamespace(namespaceDescriptor);
admin.close();
}
测试代码:
@Test
public void createNamespace() throws IOException {
WeiBoUtil.createNamespace("weibo");
}
结果:
创建表public static void creteaTable(String tableName, int version, String... columnFamily) throws IOException {
Connection conn = HBasePoolUtil.getConn();
Admin admin = conn.getAdmin();
boolean tableExists = admin.tableExists(TableName.valueOf(tableName));
if (tableExists) {
System.out.println(tableName + " exists!");
return;
}
TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
for (String cf : columnFamily) {
ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder(cf.getBytes()).setMaxVersions(version).build();
builder.setColumnFamily(columnFamilyDescriptor);
}
admin.createTable(builder.build());
admin.close();
}
测试代码:
@Test
public void creteaTable() throws IOException {
//创建内容表
WeiBoUtil.creteaTable(Constant.CONTENT, 1, "info");
//创建用户关系表
WeiBoUtil.creteaTable(Constant.RELATIONS, 1, "attends", "fans");
//创建收件箱表
WeiBoUtil.creteaTable(Constant.INBOX, 3, "info");
}
运行程序发现在weibo命名空间下创建了weibo:contet、weibo:relations、webo:inbox三个表。
发布微博内容
发布微博时,首先需要往微博内容表中添加数据,然后需要更新收件箱表fans的数据,它包括: 1. 获取当前uid的fans 2. 更新收件箱表中fans的数据
public static void createData(String uid, String content) throws IOException {
Connection conn = HBasePoolUtil.getConn();
long currentTimeMillis = System.currentTimeMillis();
String rowKey = uid + "_" + currentTimeMillis;
//往内容表中添加数据
Table contentTable = conn.getTable(TableName.valueOf(Constant.CONTENT));
Put put = new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("content"), currentTimeMillis, Bytes.toBytes(content)); //手动指定时间戳
contentTable.put(put);
//用户发了微博,要同时更新它的fans的微博收件列表
//1.获取关注了微博发送者的用户列表
Table relationsTable = conn.getTable(TableName.valueOf(Constant.RELATIONS));
//获取关系表中fans
Get get = new Get(Bytes.toBytes(uid));
get.addFamily(Bytes.toBytes("fans"));
Result result = relationsTable.get(get);
List cells = result.listCells();
//如果用户没有关注者,不需要更新微博收件列表表
if (cells == null || cells.size()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?