近几年来, 人工智能逐渐火热起来, 特别是和大数据一起结合使用. 人工智能的主要场景又包括图像能力, 语音能力, 自然语言处理能力和用户画像能力等等. 这些场景我们都需要处理海量的数据, 处理完的数据一般都需要存储起来, 这些数据的特点主要有如下几点:
大: 数据量越大, 对我们后面建模越会有好处;
稀疏: 每行数据可能拥有不同的属性, 比如用户画像数据, 每个人拥有属性相差很大, 可能用户 A 拥有这个属性, 但是用户 B 没有这个属性; 那么我们希望存储的系统能够处理这种情况, 没有的属性在底层不占用空间, 这样可以节约大量的空间使用;
列动态变化: 每行数据拥有的列数是不一样的.
为了更好的介绍
在人工智能场景下的使用, 下面以某人工智能行业的客户案例进行分析如何利用 HBase 设计出一个快速查找人脸特征的系统.
目前该公司的业务场景里面有很多人脸相关的特征数据, 总共 3400 多万张, 每张人脸数据大概 3.2k. 这些人脸数据又被分成很多组, 每个人脸特征属于某个组. 目前总共有近 62W 个人脸组, 每个组的人脸张数范围为 1 ~ 1W 不等, 每个组里面会包含同一个人不同形式的人脸数据. 组和人脸的分布如下:
43% 左右的组含有 1 张人脸数据;
47% 左右的组含有 2 ~ 9 张人脸数据;
其余的组人脸数范围为 10 ~ 10000.
现在的业务需求主要有以下两类:
根据人脸组 id 查找该组下面的所有人脸;
根据人脸组 id + 人脸 id 查找某个人脸的具体数据.
文章目录
1 MySQL + OSS 方案
2 HBase 方案
3 使用 Spark 加速数据分析
MySQL + OSS 方案
之前业务数据量比较小的情况使用的存储主要为 MySQL 以及 OSS(对象存储). 相关表主要有人脸组表 group 和人脸表 face. 表的格式如下:
- face_idgroup_idfeature
- "c5085f1ef4b3496d8b4da050cab0efd2"1"cwI4S/HO/nm6H......"
- String CF_DEFAULT = "c";
- Put put = new Put(groupId.getBytes());
- put.addColumn(CF_DEFAULT.getBytes(),faceId1.getBytes(), feature1.getBytes());
- put.addColumn(CF_DEFAULT.getBytes(),faceId2.getBytes(), feature2.getBytes());
- ......
- put.addColumn(CF_DEFAULT.getBytes(),faceIdn.getBytes(), featuren.getBytes());
- table.put(put);
- Get get = new Get(groupId.getBytes());
- Result re=table.get(get);
- Get get = new Get(groupId.getBytes());
- get.addColumn(CF_DEFAULT.getBytes(), faceId1.getBytes())
- Result re=table.get(get);
来源: http://www.jianshu.com/p/1e2582b872f7