求友们帮助,每天亿级数据怎么储存

2020-05-27 09:06:19 +08:00
 rapperx2

项目是 GPS 业务,每天有约 2w+台车传数据到我们这里储存。每天数据量大概在 1 亿左右。

数据主要用于做报表,查询历史轨迹(查询频率高,基本上每次查出过万的数据)

没做过这么大数据量的业务场景,想问下这场景应该怎么做?感谢

7788 次点击
所在节点    问与答
51 条回复
dkerss
2020-05-27 16:29:05 +08:00
推荐 ClickHouse 神器!
rapperx2
2020-05-27 16:42:05 +08:00
@soulzz 大佬啊。哈哈,能加个 V 交流学习下吗?
soulzz
2020-05-27 17:44:18 +08:00
@rapperx2 不是大佬,架子别人搭的,我在这天天修修补补
Magic347
2020-05-27 17:46:56 +08:00
hive?
yjhatfdu2
2020-05-27 17:48:54 +08:00
这个场景,clickhouse 使用 mergetree 引擎,根据日期做分区,车辆 ID,timestamp 排序,clickhouse 对于 float 类型时序数据也有类似时序数据库的 Gorilla codec,有效压缩时序浮点数据。clickhouse 本身的话,支持分布式、高可用,支持 SQL (部分),可以用 http 接口直接访问,使用难度很低。性能的话,我们做过一些测试,单节点 64 核 epyc2+256G 内存,单表 15 亿行 20 多列的纽约出租车数据,单个全表级的 group by+sum 大概 200ms 左右,多个维度的 group by+多个聚合能在 700ms 内完成,基本上是现在分析库的上限了。https://clickhouse.tech/docs/en/getting-started/example-datasets/nyc-taxi/
yjhatfdu2
2020-05-27 17:50:30 +08:00
@yjhatfdu2 比 hive 或者 HBase+mr/spark 之类的的方案大概也就快几百倍把
yjhatfdu2
2020-05-27 17:52:51 +08:00
顺便,现在如果是少量数据的 update,clickhouse 可以使用 mutations 完美完成,如果量大的话,可以用 collaspemergetree 引擎,变相实现标记删除并且不影响查询结果
ahmcsxcc
2020-05-27 17:55:39 +08:00
同 clickhouse
yjhatfdu2
2020-05-27 20:06:48 +08:00
@rapperx2 我还真造了点数据来测试一下 clickhouse 。
表结构:
create table ts_test
(
ts DateTime64 CODEC(DoubleDelta),
car_id Int32,
lat Float32 CODEC(Gorilla),
log Float32 CODEC(Gorilla),
dir Float32 CODEC(Gorilla)
) engine MergeTree() order by (car_id, ts) partition by toDate(ts);
其中,方向 dir 平均 100s 随机刷新,速度 0-100 之间随机,ts 的间隔 1s±100ms 并加入随机抖动,20000 辆车,每辆车起始位置随机,然后模拟每辆车运动,生成 csv 数据导入 clickhouse 。共使用了 20 分钟导入了 983725233(9.8 亿)行数据,占用硬盘空间 9.45 GiB,大概每 1 亿行 1G 。
然后测试了一些简单的查询。
Q1: 查询某个车的完整轨迹: select * from ts_test where car_id=1;
行数和耗时:49187 rows in set. Elapsed: 0.041 sec.
Q2: 查询表总行数: select count(*) from ts_test;
行数和耗时:1 rows in set. Elapsed: 0.001 sec. (估计缓存了)
Q3: 查询每辆车的数据点数量: select car_id,count(*) from ts_test group by car_id;
行数和耗时:20000 rows in set. Elapsed: 0.129 sec.
Q4: 查询每辆车的活动范围(矩形):select car_id,min(lat),max(lat),min(log),max(log) from ts_test group by car_id;
行数和耗时:20000 rows in set. Elapsed: 0.568 sec.
Q5: 查询一辆车的活动范围(矩形):select min(lat),max(lat),min(log),max(log) from ts_test where car_id=100;
行数和耗时:1 rows in set. Elapsed: 0.003 sec.
Q6: 查询每小时的数据点(每小时约 7200w )数量: select count(*),toYYYYMMDD(ts)+toHour(ts) as hour from ts_test group by hour;
行数和耗时:14 rows in set. Elapsed: 0.347 sec.

测试硬件:单机 AMD EPYC 7702P 64-Core Processor 64 核,256G 内存,SSD
希望对楼主有帮助
gainsurier
2020-05-27 22:48:47 +08:00
歪个楼问下,为啥车每天要传那么对数据回来
calpiswater
2020-05-27 22:54:18 +08:00
可以考虑下清华的 IoTDB
likuku
2020-05-27 23:08:12 +08:00
aws s3,还有啥存不了的?

直接进大数据服务 EMR,要么数据湖,简单查询,直接来 Athena 查 s3 也没问题啊

实时处理分析? aws 有 kinesis 啊,各种并行实时处理,本来就是很适合搭配 IoT / GPS 业务场景的

非实时分析,还有 redshift 数据仓库服务可以用,更可以联合查询,操作型关系数据库。
跨一个或多个 Amazon RDS 和 Aurora PostgreSQL 数据库查询实时数据,支持大规模并行数据处理。

有兴趣欢迎继续交流~
wd
2020-05-28 07:43:00 +08:00
@gainsurier #30 一般都会认为,数据就是钱呀,越多的数据越多的钱。每天几亿出去和投资人好吹牛逼。
rapperx2
2020-05-28 08:39:08 +08:00
@yjhatfdu2 非常感谢大佬这么上心帮我,太感谢了,连性能测试都给我举例出来了。我现在还需要学习下 clickhouse 。从来没用过。
感觉这个方案不错,先参考你这个方案吧
rapperx2
2020-05-28 08:40:57 +08:00
@gainsurier 因为我们需要对车进行实时监控和历史轨迹回放。还要做一些报表之类的。
cqdx02
2020-05-28 08:53:55 +08:00
@yjhatfdu2 能否进行数据聚合呢,比如按分钟级,15 分钟级统计数据
rockcat
2020-05-28 09:29:58 +08:00
ClickHouse 或者 Green Plum 。
0987363
2020-05-28 09:35:27 +08:00
@soulzz 状态不存数据库的话,那要用状态排序岂不是凉😅
yjhatfdu2
2020-05-28 10:05:43 +08:00
@cqdx02 当然可以,group by 就可以,看上面的 Q6,使用对应的函数对时间进行处理就行
yjhatfdu2
2020-05-28 10:09:30 +08:00
@rapperx2 对了,时间戳精度要求不高的话,可以用不需要用 DateTime64,可以 DateTime (精确到秒),经度维度可以用 UInt32 CODEC(DoubleDelta),方向不需要的话可以不存,这样估计还能小一倍,也能快一些。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX