阅读量:0
最近在某聊天群窥屏:又get了一个问题。群友问:服务器是5台64G的 ,doris写入300亿数据写不进去,爆内存怎么弄?
和上个问题类似, emm, 好久没接触这些了问题,我一时半会没反应过来,于是和昨天一样,查了一晚上资料,连夜肝了一篇。
看到这些问题就像死去的回忆在攻击我。为啥这么说呢,因为我现在转行啦哈哈,我本来是干大数据的,不过现在死磕云计算,还是云计算轻松,爽歪歪。
上个问题链接已附上如下: hh,不过我可不敢让他们知道我在diss某人,我怕他们真实我。为了防止被真实,我直接连夜改昵称。
在处理大规模数据写入时,遇到内存不足的问题是常见的挑战,怎么说呢,以前天天思考,干的头蒙。
一,以下是一些建议和优化策略,可以帮助你解决Doris写入300亿数据时的内存问题:
主要是:思路+例子,毕竟每个人的配置和存的数据五花八门,我暂时还没有能力总结所有概况。。。。
分批次写入:
- 将数据分成较小的批次进行写入,而不是一次性写入所有数据。这样可以减少单次写入的内存占用。
示例:
假设你有300亿条数据,可以将其分成300个批次,每批次写入1亿条数据。Copy
-- 批次1 INSERT INTO your_table (col1, col2, ...) VALUES (val1_1, val1_2, ...), (val2_1, val2_2, ...), ... (val100000000_1, val100000000_2, ...); -- 批次2 INSERT INTO your_table (col1, col2, ...) VALUES (val100000001_1, val100000001_2, ...), (val100000002_1, val100000002_2, ...), ... (val200000000_1, val200000000_2, ...);
调整内存参数:
- 检查并调整Doris的内存配置参数,如
be_config
文件中的mem_limit
参数,确保每台服务器的内存使用在合理范围内。 示例:
在be_config
文件中,找到mem_limit
参数并调整:Copy
mem_limit = 48G
确保这个值不会超过物理内存的75%-80%。
- 检查并调整Doris的内存配置参数,如
优化表结构:
- 确保表的结构和索引设计是高效的。避免不必要的索引和复杂的表结构。
示例:
如果你的表有很多不必要的索引,可以考虑去掉一些:Copy
CREATE TABLE your_table ( id INT PRIMARY KEY, name VARCHAR(255), age INT, -- 去掉不必要的索引 -- INDEX (some_column) );
分区表:
- 使用分区表将数据分散到不同的分区中,可以减少单个分区的内存占用。
示例:
按日期分区:Copy
CREATE TABLE your_table ( id INT, name VARCHAR(255), age INT, created_date DATE ) PARTITION BY RANGE (created_date) ( PARTITION p0 VALUES LESS THAN ('2022-01-01'), PARTITION p1 VALUES LESS THAN ('2023-01-01') );
增加节点:
- 如果可能的话,增加更多的Doris节点来分摊负载。更多的节点可以提供更多的内存和计算资源。
示例:
假设你现在有5个节点,可以再添加3个节点:# 在新的节点上安装Doris
# 配置新的节点并加入集群
监控和调整:
- 使用监控工具监控Doris集群的内存使用情况,实时调整配置参数和写入策略。
示例:
使用Prometheus和Grafana监控Doris:Copy
# 配置Prometheus监控Doris # 使用Grafana展示内存使用情况
压缩和编码:
- 使用合适的压缩和编码方式来减少数据存储和传输的内存占用。
示例:
在创建表时指定压缩方式:Copy
CREATE TABLE your_table ( id INT, name VARCHAR(255), age INT ) ENGINE=OLAP DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 10 PROPERTIES ( "storage_format" = "V2", "compression" = "LZ4" );
优化SQL语句:
- 优化写入时使用的SQL语句,确保查询和插入操作是高效的。
示例:
使用批量插入而不是单条记录插入:Copy
-- 不推荐 INSERT INTO your_table (col1, col2) VALUES (val1, val2); INSERT INTO your_table (col1, col2) VALUES (val3, val4); -- 推荐 INSERT INTO your_table (col1, col2) VALUES (val1, val2), (val3, val4), (val5, val6);
批量插入:
- 使用批量插入(Batch Insert)方式,而不是单条记录插入,以提高写入效率和减少内存开销。
示例:
Copy
-- 批量插入 INSERT INTO your_table (col1, col2, col3) VALUES (val1_1, val1_2, val1_3), (val2_1, val2_2, val2_3), ... (valN_1, valN_2, valN_3);
调优操作系统和硬件:
- 确保操作系统和硬件配置是最佳的,如调整虚拟内存设置、使用SSD存储等。
示例:
- 使用SSD替换HDD,提高I/O性能。
- 调整操作系统的虚拟内存设置:
-
Copy
# 调整swappiness sysctl vm.swappiness=10
但是注意:具体的调整和优化需要根据你的实际情况进行测试和验证
未完待续。。。。