其实导入数据确实是最麻烦的,我花了 4 个小时,方法是这样的,不知道大家有没有更好的方法:
数据是公开的,压缩的是 11G,解压是 ~129G,每一行是一个 json,就 ip,domain,type 这几个字段。
我是先 split -l 1000000 file,1 千万行一个文件,大约 130 个文件。
然后批量转换成 mysql load 需要的 csv,(让 server 直接去 load 本地的文件应该是最快的,文档说比 insert 快 20 倍左右 https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html ,一开始尝试一行一行 insert,大约 20 行/s,实在太慢了,然后一次 insert 一万行,依然很慢)。
先写好这个脚本:
cat scripts/json2csv.py
import fileinput
import json
import ipaddress
import csv
import sys
writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL)
for line in fileinput.input():
data = json.loads(line)
ip = int(ipaddress.IPv4Address(data.get('name')))
value = data.get('value')
t = data.get('type')
writer.writerow([ip, value, t])
然后开 130 个进程一起跑,毕竟是 64C 机器
for sf in $(ls source_file)
do
cat source_file/$sf | python3 scripts/json2csv.py > target_csv/$sf.csv &
done
最后在 mysql server 上执行 load data infile 语句,大约跑了 4 个小时。
然后我以为建索引毕竟也是顺序写,估计也有 4 个小时。就去 twitter 求助了... 结果半个小时竟然神器地跑完了...