我一直致力于一个需要定期写入和大量读取的应用程序。
该应用程序存储了一些文本列,这些列的大小不是很大,其中的地图是表中最大的列。
在Scala中使用Phantom-DSL(下面是Datastax Java驱动程序),我的应用程序在数据大小增加时崩溃。
这是我的应用程序的日志。
[error] - com.websudos.phantom - All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.OperationTimedOutException: [/127.0.0.1:9042] Operation timed out))
以下是cassandra logs。
我已经将Cassandra日志发布到了一个pastebin中,因为它们非常大,可以嵌入到答案中。
我似乎无法理解这次崩溃的原因。我已经尝试增加超时并关闭行缓存。
据我所知,这是一个基本问题,可以通过调整cassandra来解决这个特例。
我的cassandra用法来自不同的数据源。所以写不是很频繁。但是读取的大小很大,因为可能需要一次超过300K的行,然后需要通过HTTP传输。
答案 0 :(得分:1)
日志显示GC压力显着(ParNew为5秒)。
如果您说"读取数量很大,一次可能需要超过300K的行",您是否意味着您在单个查询中提取了300k行? Datastax驱动程序支持本机分页 - 将获取大小设置得更低(500或1000),并允许它翻阅这些查询而不是尝试在一次传递中加载所有300k行?
答案 1 :(得分:0)
地图(以及一般的集合)对Cassandra heapspace非常苛刻。更改数据模型以使用其他表替换地图可能会解决您的gc问题。但由于缺乏关于Cassandra使用的更多细节,这引起了很多猜测。