Amazon ec2 尝试使用Astyanax连接到托管在EC2实例上的Cassandra时出错
尝试使用客户端astyanax连接EC2实例上的Cassandra时,我收到以下错误“astyanax.connectionpool.exceptions.PoolTimeoutException:”。需要帮助吗Amazon ec2 尝试使用Astyanax连接到托管在EC2实例上的Cassandra时出错,amazon-ec2,cassandra,astyanax,Amazon Ec2,Cassandra,Astyanax,尝试使用客户端astyanax连接EC2实例上的Cassandra时,我收到以下错误“astyanax.connectionpool.exceptions.PoolTimeoutException:”。需要帮助吗 Following is my code snippet. import org.mortbay.jetty.servlet.Context; import com.netflix.astyanax.AstyanaxContext; import com.netflix
Following is my code snippet.
import org.mortbay.jetty.servlet.Context;
import com.netflix.astyanax.AstyanaxContext;
import com.netflix.astyanax.Keyspace;
import com.netflix.astyanax.MutationBatch;
import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
import com.netflix.astyanax.connectionpool.impl.ConnectionPoolType;
import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
import com.netflix.astyanax.model.Column;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.model.ColumnList;
import com.netflix.astyanax.model.CqlResult;
import com.netflix.astyanax.serializers.StringSerializer;
import com.netflix.astyanax.thrift.ThriftFamilyFactory;
public class MetadataRS {
public static void main(String args[]){
AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
.forCluster("ClusterName")
.forKeyspace("KeyspaceName")
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
.setConnectionPoolType(ConnectionPoolType.ROUND_ROBIN)
)
.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9042)
.setMaxConnsPerHost(40)
.setSeeds("<EC2-IP>:9042")
.setConnectTimeout(5000)
)
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());
context.start();
Keyspace keyspace = context.getEntity();
System.out.println(keyspace);
ColumnFamily<String, String> CF_USER_INFO =
new ColumnFamily<String, String>(
"Standard1", // Column Family Name
StringSerializer.get(), // Key Serializer
StringSerializer.get()); // Column
OperationResult<ColumnList<String>> result = null;
try {
result = keyspace.prepareQuery(CF_USER_INFO)
.getKey("user_id_hash")
.execute();
} catch (ConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ColumnList<String> columns = result.getResult();
// Lookup columns in response by name
String uid = columns.getColumnByName("user_id_hash").getStringValue();
System.out.println(uid);
// Or, iterate through the columns
for (Column<String> c : result.getResult()) {
System.out.println(c.getName());
}
}
}
以下是我的代码片段。
导入org.mortbay.jetty.servlet.Context;
导入com.netflix.astyanax.AstyanaxContext;
导入com.netflix.astyanax.Keyspace;
导入com.netflix.astyanax.MutationBatch;
导入com.netflix.astyanax.connectionpool.NodeDiscoveryType;
导入com.netflix.astyanax.connectionpool.OperationResult;
导入com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
导入com.netflix.astyanax.connectionpool.impl.connectionpoolconfigurationmpl;
导入com.netflix.astyanax.connectionpool.impl.ConnectionPoolType;
导入com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
导入com.netflix.astyanax.impl.astyanax配置mpl;
导入com.netflix.astyanax.model.Column;
导入com.netflix.astyanax.model.ColumnFamily;
导入com.netflix.astyanax.model.ColumnList;
导入com.netflix.astyanax.model.CqlResult;
导入com.netflix.astyanax.serializers.StringSerializer;
进口com.netflix.astyanax.thrift.ThriftFamilyFactory;
公共类元数据{
公共静态void main(字符串参数[]){
AstyanaxContext上下文=新建AstyanaxContext.Builder()
.forCluster(“ClusterName”)
.forKeyspace(“键空间名称”)
.withAstyanaxConfiguration(新的AstyanaxConfiguration-Impl())
.setDiscoveryType(NodeDiscoveryType.RING_描述)
.setConnectionPoolType(ConnectionPoolType.ROUND_ROBIN)
)
.withConnectionPoolConfiguration(新的ConnectionPoolConfigurationMPL(“MyConnectionPool”)
.设置端口(9042)
.setMaxConnsPerHost(40)
.setSeeds(“:9042”)
.setConnectTimeout(5000)
)
.withConnectionPoolMonitor(新计数ConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());
context.start();
Keyspace Keyspace=context.getEntity();
System.out.println(键空间);
ColumnFamily CF\u用户信息=
新柱族(
“Standard1”,//列族名称
StringSerializer.get(),//键序列化程序
StringSerializer.get());//列
OperationResult结果=空;
试一试{
结果=keyspace.prepareQuery(CF\u用户信息)
.getKey(“用户\u id\u哈希”)
.execute();
}捕获(连接异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
ColumnList columns=result.getResult();
//按名称查找响应中的列
String uid=columns.getColumnByName(“用户id_散列”).getStringValue();
系统输出打印项次(uid);
//或者,遍历列
对于(c列:result.getResult()){
System.out.println(c.getName());
}
}
}
错误
com.netflix.astyanax.thrift。ThriftKeyspaceImpl@1961f4
com.netflix.astyanax.connectionpool.exceptions.PoolTimeoutException:PoolTimeoutException:[主机=():9042,延迟=5001(5001),尝试次数=1]等待连接时超时
位于com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.waitForConnection(SimpleHostConnectionPool.java:201)
位于com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.borrowConnection(SimpleHostConnectionPool.java:158)
位于com.netflix.astyanax.connectionpool.impl.RoundRobinExecuteWithFailover.borrowConnection(RoundRobinExecuteWithFailover.java:60)
位于com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryoOperation(AbstractExecuteWithFailoverImpl.java:50)
位于com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:229)
位于com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:180)
位于com.rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:57)
线程“main”java.lang.NullPointerException中出现异常
在com.rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:62)您的问题不在代码中。与指定为种子的节点之间存在连接问题。因此,要么该节点未运行,要么您无法从运行客户端的计算机访问它。由于您在EC2实例上运行cassandra,请检查cassandra的端口号(您选择的端口号为9042)是否在EC2安全组的允许列表中,并且您有权访问它。如果没有,则在ec2安全组的入站列表中添加端口号,并将ip范围设置为0.0.0.0。 Alos检查ec2上的防火墙是否关闭。默认情况下,它为false,但无论如何检查它是好的 如果您已经这样做了,那么您的客户机可能位于防火墙后面,防火墙可以阻止到您的choosen端口(9042)的出站流量
最后,如果您没有使用任何弹性ip,那么最好使用ec2实例dns名称,无论是在您的setSeeds部分还是在cassandra的rpc_地址中。yaml我最终将libthrift升级为0.9,并将代码更改为以下名称,现在工作正常
public Keyspace getDBConnection() {
if (poolConfig == null) {
poolConfig = new ConnectionPoolConfigurationImpl(
"CassandraPool").setPort(port).setMaxConnsPerHost(1)
.setSeeds((new StringBuilder(seedHost).append(":").append(port).toString()))
.setLatencyAwareUpdateInterval(latencyAwareUpdateInterval) // Will resort hosts per
// token partition every
// 10 seconds
.setLatencyAwareResetInterval(latencyAwareResetInterval) // Will clear the latency
// every 10 seconds. In
// practice I set this
// to 0 which is the
// default. It's better
// to be 0.
.setLatencyAwareBadnessThreshold(latencyAwareBadnessThreshold) // Will sort hosts if a host
// is more than 100% slower
// than the best and always
// assign connections to the
// fastest host, otherwise
// will use round robin
.setLatencyAwareWindowSize(latencyAwareWindowSize) // Uses last 100 latency
// samples. These samples are in
// a FIFO q and will just cycle
// themselves.
.setTimeoutWindow(60000)
;
}
AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
.forCluster(clusterName)
.forKeyspace(keyspaceName)
.withAstyanaxConfiguration(
new AstyanaxConfigurationImpl().setDiscoveryType(
NodeDiscoveryType.NONE)
.setConnectionPoolType(
ConnectionPoolType.ROUND_ROBIN)
.setCqlVersion("3.0.0")
.setTargetCassandraVersion("2.0"))
.withConnectionPoolConfiguration(poolConfig)
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());
context.start();
return context.getClient();
}
public键空间getDBConnection(){
if(poolConfig==null){
poolConfig=新连接PoolConfigurationMPL(
“CassandraPool”).setPort(port.setMaxConnsPerHost(1)
.setSeeds((新的StringBuilder(seedHost).append(“:”).append(port.toString()))
.setLatencyAwareUpdateInterval(latencyAwareUpdateInterval)//将根据
//每个令牌分区
//10秒
.setLatencyAwareResetInterval(latencyAwareResetInterval)//将清除延迟
//电动汽车