目前需要存入spark的运算结果数据,对查询速度要求又比较高,因此选择了几种分布式数据库HBase,MongoDB,ElasticSearch分别从写入速度,查询速度和磁盘占用进行比较。
之前把结果存在了postgre里,采用了分表的方法,但是查询一次耗时1分半钟,无法接受...
-
写入速度
写入1年数据
Hbase:10分钟 MongoDB:17分钟 ES:8分钟 -
查询速度
根据经纬度查询,查询
500次,耗时如下(单位:毫秒)Hbase:平均在200-300毫秒,最大值7秒多
mean 375.526000 std 973.780084 min 136.000000 25% 192.000000 50% 214.000000 75% 256.000000 max 7534.000000MongoDB:平均在3-4秒,最大值14秒多
mean 4106.846000 std 2370.718396 min 2188.000000 25% 2597.750000 50% 2983.500000 75% 4721.250000 max 14680.000000ES:第一次查询速度比较慢,大概40秒,第二次查询3-4秒左右
-
磁盘占用
Hbase: 32年数据:36.1 G MongoDB: 32年数据:120g ES: 32年数据:110.9 GB -
总结
-
Hbase适合比较大的数据量,简单的查询条件,Hbase基本只能根据RowKey进行Get或Scan,或者利用二级索引查询少量数据,如果二级索引查询出来的数据量太大,再回Hbase查询速度也很慢
-
MongoDB能支持比Hbase更复杂的查询,适合schema不确定的场景,另外当数据量达到几千万后2个MongoDB的进程占用了了30G的内存……
-
ElasticSearch适合全文检索,只存查询用到的字段。如Hbase的二级索引可以用ES实现,将真正的数据存在Hbase中,如果需要较快的查询速度需要大内存的支持,比较耗资源
由于目前我们的数据查询场景只有两种,对速度要求又比较高,最终我采用了存两份HBase数据(共占70g),一份根据经纬度查询,一份用来根据时间查询,两种查询都保持在1秒左右
-