统计结果、报表类数据:主要是运营、运力情况、收入等结果,通常需要配合Phoenix进行SQL查询。数据量较小,对查询的灵活性要求高,延迟要求一般。
原始事实类数据:如订单、司机乘客的GPS轨迹、日志等,主要用作在线和离线的数据供给。数据量大,对一致性和可用性要求高,延迟敏感,实时写入,单点或批量查询。
中间结果数据:指模型训练所需要的数据等。数据量大,可用性和一致性要求一般,对批量查询时的吞吐量要求高。
线上系统的备份数据:用户把原始数据存在了其他关系数据库或文件服务,把HBase作为一个异地容灾的方案。
这份数据使用过滴滴产品的用户应该都接触过,就是App上的历史订单。近期订单的查询会落在Redis,超过一定时间范围,或者当Redis不可用时,查询会落在HBase上。业务方的需求如下:
在线查询订单生命周期的各个状态,包括status、event_type、order_detail等信息。主要的查询来自于客服系统。
在线历史订单详情查询。上层会有Redis来存储近期的订单,当Redis不可用或者查询范围超出Redis,查询会直接落到HBase。
离线对订单的状态进行分析。
写入满足每秒10K的事件,读取满足每秒1K的事件,数据要求在5s内可用。

按照这些要求,我们对Rowkey做出了下面的设计,都是很典型的scan场景。
Rowkey:reverse(order_id) + (MAX_LONG - TS)
Columns:该订单各种状态
Rowkey:reverse(passenger_id | driver_id) + (MAX_LONG - TS)
Columns:用户在时间范围内的订单及其他信息
满足App用户或者后端分析人员的实时或准实时轨迹坐标查询;
满足离线大规模的轨迹分析;
满足给出一个指定的地理范围,取出范围内所有用户的轨迹或范围内出现过的用户。
单个用户按订单或时间段查询: reverse(user_id) + (Integer.MAX_LONG-TS/1000)
给定范围内的轨迹查询:reverse(geohash) + ts/1000 + user_id
模型训练通过Spark Job,每30分钟对各个城市训练一次;
模型训练第一阶段,在5分钟内,按照设定条件从HBase读取所有城市数据;
模型训练第二阶段在25分钟内完成ETA的计算;
HBase中的数据每隔一段时间会持久化至HDFS中,供新模型测试和新的特征提取。
Rowkey:salting+cited+type0+type1+type2+TS
Column:order, feature