【问题标题】:QuestDB mass CSV import - java process Out Of MemoryQuestDB 大量 CSV 导入 - java 进程内存不足
【发布时间】:2021-07-06 04:38:20
【问题描述】:

我正在通过 bash 脚本将 CSV 文件(200M+ 记录)大量导入在 docker 中运行的 QuestDB(循环文件列表)。随着时间的推移,我可以看到 java 进程的内存使用量逐渐增加到 OOM (16GB)。即使提前终止了导入脚本,java 进程的内存使用量也保持在同一水平,直到我重新启动容器。

Bash 导入脚本:

for table in "${tickdb_tables[@]}"; do
  
  symbol=$(echo $table| cut -d'_' -f 1)

  curl  -i -F \
  schema='[{"name":"ts", "type": "TIMESTAMP", "pattern": "yyyy-MM-dd HH:mm:ss"},{"name":"symbol", "type": "SYMBOL"},{"name":"open","type":"FLOAT"},{"name":"high","type":"FLOAT"},{"name":"low","type":"FLOAT"},{"name":"close","type":"FLOAT"},{"name":"volume","type":"INT"},{"name":"timeframe","type":"SYMBOL"}]' \
   -F data=@$symbol.csv "http://localhost:9000/imp?name=CANDLES&timestamp=ts"

  rm $symbol.csv

  sleep 5
done

表创建语句:

create table CANDLES (ts TIMESTAMP, symbol SYMBOL, open FLOAT, high FLOAT, low FLOAT,
                      close FLOAT, volume INT, timeframe SYMBOL) 
timestamp(ts) partition by MONTH;

这里有什么我遗漏的吗,还是 QuestDb 中存在一些潜在的错误/内存泄漏? (在确定自己没有做错之前不想打开问题)

【问题讨论】:

  • 这一切看起来都有效,我建议打开 Github issue 或去 QuestDB slack。从表面上看,QuestDB 进程似乎无法足够快地刷新到磁盘,并且内存被操作系统 / docker 占用太久,在尝试回答/提出任何建议之前,我需要更多的设置细节
  • 您的脚本看起来不错,问题可能是缺乏对来自 REST API 的无序参数的控制。我添加了一个问题来跟踪这个问题:github.com/questdb/questdb/issues/1181
  • @VladIlyushchenko , AlexdesPelagos - 非常感谢,我会密切关注 github 问题。

标签: questdb


【解决方案1】:

我认为发生的事情是您按MONTH 分区,并且一个月的数据不适合您的 RAM。当您逐个符号地摄取数据时发生乱序时,摄取过程必须在每次加载新符号文件时重写每月分区。可能在某些时候分区不适合 RAM 并且 QuestDB 失败。

尝试将分区更改为DAY。如果可能的话,每天将您的 csv 文件拆分并按每日部分加载它们。或者,如果您不打算一起查询它们,则为每个符号创建一个表。

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多