Java 当我们试图检索大数据时,Cassandra服务器崩溃
如何使用cassandra DB检索大型数据。我使用的是cassandra 1.1.7。配备32 GB RAM和1 TB硬盘。成功地,我可以将记录插入其中。当我试图检索数据时 例如: Cassandra服务器可能会崩溃或关闭(表中包含30万行10列) 它显示错误: 以yaml或clear cache size(清除缓存大小)为单位,将flush_max_memtables_调整为_阈值大小 JVM堆转储错误它在Java 当我们试图检索大数据时,Cassandra服务器崩溃,java,cassandra,Java,Cassandra,如何使用cassandra DB检索大型数据。我使用的是cassandra 1.1.7。配备32 GB RAM和1 TB硬盘。成功地,我可以将记录插入其中。当我试图检索数据时 例如: Cassandra服务器可能会崩溃或关闭(表中包含30万行10列) 它显示错误: 以yaml或clear cache size(清除缓存大小)为单位,将flush_max_memtables_调整为_阈值大小 JVM堆转储错误它在cassandra/bin文件夹中创建了pid XXX.hprof文件 在cassan
cassandra/bin
文件夹中创建了pid XXX.hprof
文件
在cassandra env.sh
中,我设置:
MAX_HEAP_SIZE="27G" HEAP_NEWSIZE="2G"
在cassandra.yaml
中,我设置了:
memtable_total_space_in_mb: 100
我们每天都在为每个表插入100k以上的数据,因此cassandra数据大小每天可能会增加1G。因此,我是否需要同时增加RAM大小?这里有两件事:
1) 你的MAX\u HEAP\u SIZE
太大了。提供一个表格,帮助您根据系统RAM确定正确的设置。对于32GB的RAM,您将属于“大于4GB”类别。建议值为:
1/4系统内存,但不超过8GB
原因就在下面
在大多数情况下,Java优雅地处理8GB以上垃圾收集的能力很快就会减弱
认真考虑把它降到8GB或更少,用于<代码>对于
HEAP\u NEWSIZE
,建议将其设置为每个核心100MB。如果注释掉,HEAP\u NEWSIZE
将是MAX\u HEAP\u SIZE
的1/4
更好的是,在cassandra env.sh
中注释掉MAX\u HEAP\u SIZE
和HEAP\u NEWSIZE
的设置。这样,Cassandra将确定这些值需要什么。考虑到你目前的设置有多离谱,让卡桑德拉为你确定这些设置是更好的选择
2) 您的memtable\u总空间(单位:mb)
也完全不正常。我也要评论一下这个设置。默认情况下,Cassandra会将此设置为堆空间的1/3,这意味着此设置与以前的设置直接相关,这些设置也不正确
通过注释这些设置并允许Cassandra管理它们,您的值应该如下所示:
MAX_HEAP_SIZE: 8192M
HEAP_NEWSIZE: (num cores) x 100M, or (1/4 of MAX)...2048M
memtable_total_space_in_mb: 2731
为了帮助解决所有这些问题,我基于cassandra env.sh
中的代码创建了一个bash脚本:
#!/bin/bash
clear
echo "This is how Cassandra will determine its default Heap and GC Generation sizes."
system_memory_in_mb=`free -m | awk '/Mem:/ {print $2}'`
half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
echo " memory = $system_memory_in_mb"
echo " half = $half_system_memory_in_mb"
echo " quarter = $quarter_system_memory_in_mb"
echo "cpu cores = "`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
#cassandra-env logic duped here
#this should help you to see how much memory is being allocated
#to the JVM
if [ "$half_system_memory_in_mb" -gt "1024" ]
then
half_system_memory_in_mb="1024"
fi
if [ "$quarter_system_memory_in_mb" -gt "8192" ]
then
quarter_system_memory_in_mb="8192"
fi
if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
then
max_heap_size_in_mb="$half_system_memory_in_mb"
else
max_heap_size_in_mb="$quarter_system_memory_in_mb"
fi
MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
# Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
max_sensible_yg_per_core_in_mb="100"
#doesn't work?
# max_sensible_yg_in_mb=`expr (max_sensible_yg_per_core_in_mb "*" $system_cpu_cores)`
max_sensible_yg_in_mb="400"
desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
then
HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
else
HEAP_NEWSIZE="${desired_yg_in_mb}M"
fi
echo "Max heap size = " $MAX_HEAP_SIZE
echo " New gen size = " $HEAP_NEWSIZE
将其放入脚本文件(machineInfo.sh)并在我的DEV服务器上运行,将产生以下输出:
$ ./machineInfo
This is how Cassandra will determine its default Heap and GC
Generation sizes.
memory = 3948
half = 1974
quarter = 987
cpu cores = 4
Max heap size = 1024M
New gen size = 256M
总之,您的错误消息似乎指向一个设置(memtable\u total\u space\u In\u mb
),该设置大约是应该设置的1/25。这个设置(通常)是基于JVM堆的大小,它是应该的3.5倍。我还同意Cassandra 2.0.8比1.1.7有很大的改进,值得您进行升级
话虽如此,请尝试更改我提到的设置,然后重新启动集群。与运行升级相比,这是一项速度更快、风险更低的任务。Cassandra在2.0之前无法翻页查看结果,因此您的整个查询必须放在服务器内存中。我强烈建议升级到Cassandra2.0,并使用CQL查询引擎的迭代来执行大型查询 如果您无法做到这一点,那么您将需要检索更小的数据块
你的堆太大了,但这并没有导致这个问题。虽然我同意OP应该在2.0上,但我真的不认为单靠升级就能解决这个错误。你有没有尝试过在2.0中对大的结果使用cql迭代?(自动分页部分)是的,我使用CQL在C*2.0中迭代大型结果集。我以前也读过这篇文章,您对2.0处理大型数据集的能力的看法是正确的。但是升级并不能改变这样一个事实:他的堆被设置得太高(他的集群在GC期间可能无法使用),他的memtable大小(他的错误调用的设置)可能会使服务器停止运行,因为当服务器收到任何实际流量时,它通常会忙于刷新磁盘。嗨,布莱斯,谢谢你的建议。我试过了。最大堆大小=12G,堆大小=3G,内存表总空间=4096。Cassandra服务器显示以下错误:警告15:16:55257堆已满0.7549211790158955。您可能需要减少memtable和/或缓存大小。Cassandra现在将刷新两个最大的memtables以释放内存。如果您不希望cassandra自动执行此操作,请在cassandra.yaml中将flush_maximum_memtables_调整为threshold(阈值)。警告15:16:55257刷新CFS(Keyspace='system',ColumnFamily='Versions')以释放内存压力信息15:16:55257排队刷新Memtable-Versions@217811680(83/103序列化/活动字节,3个操作)信息15:16:55258正在写入Memtable-Versions@217811680(83/103序列化/活动字节,3个操作)信息15:16:55740已完成刷新/var/lib/cassandra/data/system/Versions/system-Versions-hf-165-data.db(247字节),用于commitlog位置重放位置(segmentId=1404466149969,position=544),如果yaml文件中需要任何其他更改?比如:#并发#压缩程序:1;commitlog_总空间(mb):4096;或者需要在最大的内存表中更改为:0.75大小。。我对此非常担心。
$ ./machineInfo
This is how Cassandra will determine its default Heap and GC
Generation sizes.
memory = 3948
half = 1974
quarter = 987
cpu cores = 4
Max heap size = 1024M
New gen size = 256M