生成大表数据优化建议

2022-03-31 10:27:17 +08:00
 zer0fire

问下大佬, 要用 java 通过逻辑运算生成一张表格(数据量大概 10 亿), 后面需要对该表格做统计分析, 有没有好的建议

配置: 系统: windows10 内存: 20G cpu: i710 代 硬盘: 5900rpm 写入 10m/s

目前的做法是如下:

  1. 生成期间尽可能不查询数据库在内存中做过滤等处理(有 5 个 for 循环, 还是不可避免调用了 4 次数据库查询 + 1 次数据库插入), 在存到 mysql
  2. 使用并行开了 128 个线程去处理
  3. mysql 连接数设置到 150

目前情况:

  1. cpu 使用 10%不到
  2. 内存使用不到 3G
  3. 硬盘平均写入 3m/s

由于数据后期需要做很多类似 count, sum 之类的运算 es, map reduce 可能不适合,

能想到的优化方案:

  1. 考虑 mysql 放到 ssd 盘中
  2. 增加线程数
2665 次点击
所在节点    Java
19 条回复
ihehe
2022-03-31 10:37:12 +08:00
把这 10 亿数据生成 parquet 格式,丢到本地文件大概 10g 以内, 找个 mmp 工具,单机版的就够用,10g 内存 sql 撸几次就可以了,结果存文件,这不就随便唆嘛
ihehe
2022-03-31 10:38:48 +08:00
更正:mmp --> mpp
Itoktsnhc
2022-03-31 10:44:48 +08:00
这个场景 clickhouse 不是挺好
zer0fire
2022-03-31 10:46:11 +08:00
@ihehe 原先 mysql 要查询的数据表就有 1 亿多条记录, 如何转成 parquet 格式(mysqsl->Hadoop), 内存 sql, 是让我使用内存数据库吗?
zer0fire
2022-03-31 10:49:17 +08:00
@Itoktsnhc clickhouse 这个只有 Linux 系统的版本, windows 系统要使用得用 docker
ihehe
2022-03-31 10:52:46 +08:00
写个程序把 mysql 数据读出来,生成 parquet 格式,就 1 亿条,上面的方案看错了,看成 10 亿,1 亿 条转成 parquet 大概 1g 大小以内;那就不用那么麻烦,你这单机丢到 duckdb 里去, 然后撸 sql 把
zer0fire
2022-03-31 10:59:59 +08:00
@ihehe 这里面的优化思路是在把数据全放到内存中, 在内存中做 sql 查询对吧?
ihehe
2022-03-31 11:08:14 +08:00
@zer0fire 可以这么理解吧,前提是转好格式,提升几十倍的扫描速度,减少 10 多倍的数据大小,你可以试试单机的 spark/ flink/drill/presto 都可以直接扫文件,不用先导成表
liprais
2022-03-31 11:13:11 +08:00
生成文件 load 完事
另外为啥你要用 java 生成...随便找个 spark 都快得很好吧
zer0fire
2022-03-31 11:17:18 +08:00
@ihehe mysql 支持 memory 引擎, 我把表换成用这个引擎, 是不是也能到达同样的效果(确实可以不考虑事务方面的问题)
zer0fire
2022-03-31 11:18:16 +08:00
@liprais 因为数据是从一张表取出来做逻辑处理, 在存到另一张表的
zmal
2022-03-31 11:24:02 +08:00
mysql 的使用不太对吧,并行写入同一张表对写入性能不会有提升,线程开那么多也没啥用啊。可以考虑不用 mysql ,数据放 kafka 。
看起来这个场景用大数据工具解决会简单很多,spark/flink 之类的。
zer0fire
2022-03-31 11:27:00 +08:00
@ihehe 那我还要搞个 linux 虚拟机环境?
X0ray
2022-03-31 11:33:58 +08:00
先定位瓶颈呗,看着像是读数据慢?
还有 count sum 这类的聚合运算,为啥 es, map reduce 就不适合了?
ihehe
2022-03-31 11:34:53 +08:00
@zer0fire mysql 的 memory 引擎对这 1 亿处理应该没啥问题,如果 10 亿百亿的你就没这么多 memory 给它用了;
上面的那些组件都是 java 的,win 上应该是可以跑的,不用再虚拟一层 linux ;(不过我没有在 win 上用过它们)
BeijingBaby
2022-03-31 11:53:46 +08:00
推荐 clickhouse ,轻松处理。
clf
2022-03-31 12:10:32 +08:00
drill 可以看看这个。
encro
2022-03-31 19:51:23 +08:00
你以为 mysql memory table 的 sum,cout 就快了吗?

mysql 就是只能作 oltp 业务,作 olap 还是不行的。
akira
2022-03-31 23:45:41 +08:00
不管是啥,无脑上 固态 总是对的

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

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

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

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

© 2021 V2EX