gpt4 book ai didi

java - 我应该为 "com.datastax.driver.core.exceptions.ReadTimeoutException"做什么?

转载 作者:行者123 更新时间:2023-11-30 03:09:11 25 4
gpt4 key购买 nike

我将近1.9亿条记录放入具有3个节点的Cassandra(2.1.11)集群中,复制因子为1,然后我编写客户端应用程序来计算所有记录均使用 datastax's Java Driver ,片段代码如下:

Statement stmt = new SimpleStatement("select * from test" );

System.out.println("starting to read records ");
stmt.setFetchSize(10000);
ResultSet rs = session.execute(stmt);

//System.out.println("rs.size " + rs.all().size());
long cntRecords = 0;

for(Row row : rs){
cntRecords++;

if(cntRecords % 10000000 == 0){
System.out.println("the " + cntRecords/10000000 + " X 10 millions of records");
}
}

上面的变量cntRecords超过3000万之后,我总是得到异常:

Exception in thread "main" com.datastax.driver.core.exceptions.ReadTimeoutException: 
Cassandra timeout during read query at consistency ONE (1 responses were required but only
0 replica responded)

我在google上得到了几条结果,并更改了有关堆和GC的设置,以下是我的相关设置:

-XX:InitialHeapSize=17179869184 
-XX:MaxHeapSize=17179869184
-XX:MaxNewSize=12884901888
-XX:MaxTenuringThreshold=1
-XX:NewSize=12884901888
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCompressedOops
-XX:+UseConcMarkSweepGC
-XX:+UseCondCardMark
-XX:+UseGCLogFileRotation
-XX:+UseParNewGC
-XX:+UseTLAB
-XX:+UseThreadPriorities
-XX:+CMSClassUnloadingEnabled

我用了GCViewer分析gc日志文件,吞吐量分别为99.95%、98.15%和95.75%。

更新开始:我使用jstat监控三个节点之一,发现当S1的值变为100.00时,我会得到上面的错误快点:

/usr/java/jdk1.7.0_80/bin/jstat -gcutil 8862 1000 
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 100.00 28.57 36.29 74.66 55 14.612 2 0.164 14.776

而一旦S1变为100.00S1就不再减少,不知道这和误差有关吗?或者我应该为此设置 cassandra.yaml 或 cassandra-env.sh 中的哪些属性?

如何完成统计所有记录的任务?提前致谢!

附加: 以下是其他选项:

-XX:+CMSEdenChunksRecordAlways 
-XX:CMSInitiatingOccupancyFraction=75
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSParallelRemarkEnabled
-XX:CMSWaitDuration=10000
-XX:CompileCommandFile=bin/../conf/hotspot_compiler
-XX:GCLogFileSize=94371840
-XX:+HeapDumpOnOutOfMemoryError
-XX:NumberOfGCLogFiles=90
-XX:OldPLABSize=16
-XX:PrintFLSStatistics=1
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintPromotionFailure
-XX:+PrintTenuringDistribution
-XX:StringTableSize=1000003
-XX:SurvivorRatio=8
-XX:ThreadPriorityPolicy=42
-XX:ThreadStackSize=256

最佳答案

检查为什么您需要知道行数。您的应用程序真的需要知道这一点吗?如果它可以“仅仅”有一个很好的近似值,那么创建一个计数器并在加载数据时递增它。

http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html

您可以尝试的事情:

  • 选择单个列而不是*。这可能会减少 GC 压力和网络消耗。最好选择字节数较少且属于主键一部分的列:select column1 from test
  • 每 1M 条记录后添加一个短暂的暂停。每 1M 条记录让循环暂停 500 毫秒左右。这可能会让节点喘口气来处理 GC 之类的事情
  • 编辑节点上的 cassandra.yaml 并增加 range_request_timeout_in_msread_request_timeout_in_ms
  • 找出分配给每个节点的 token 范围,并对每个 token 范围发出单独的查询。添加每个查询的计数。这利用了 token 感知驱动程序将每个“ token 范围”查询直接发送到可以回答它的节点。看这个blog article获取完整说明和示例代码。

关于java - 我应该为 "com.datastax.driver.core.exceptions.ReadTimeoutException"做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33993619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com