Java 当我们试图检索大数据时,Cassandra服务器崩溃

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 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
文件

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