2013-10-29 41 views
0

當嘗試使用客戶端Astyanax連接到EC2實例上的Cassandra時,出現以下錯誤「astyanax.connectionpool.exceptions.PoolTimeoutException:」。需要幫助嘗試使用Astyanax連接到承載在EC2實例上的Cassandra時出錯

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()); 
      } 
} 
} 

錯誤 [email protected] com.netflix.astyanax.connectionpool.exceptions.PoolTimeoutException:PoolTimeoutException:主機=():9042,等待時間= 5001(5001 ),attempts = 1]超時等待連接 at com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.waitForConnection(SimpleHostConnectionPool.java:201) at com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.borrowConnection(SimpleHostConnectionPool .java:158) at com.netflix.astyanax.connectionpool.impl.RoundRobinExecuteWithFailover.borrowConnection(RoundRobinExecuteWithFailover.java:60) 在com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:50) 在com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:229) 在com.netflix。 astyanax.thrift.ThriftColumnFamilyQueryImpl $ 1.execute(ThriftColumnFamilyQueryImpl.java:180) at com.rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:57) 線程「main」中的異常java.lang.NullPointerException at com .rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:62)

回答

0

由於您在EC2實例上運行cassandra,因此請檢查cassandra的端口號。 (您選擇爲9042)位於ec2安全組的允許列表中,並且您有權訪問它。如果不添加端口號。在ec2安全組的入站列表中,並將ip範圍設置爲0.0.0.0。 Alos檢查ec2上的防火牆已關閉。默認情況下它是錯誤的,但無論如何檢查它是很好的。

如果已完成此操作,那麼您的客戶端可能位於防火牆的後面,以防止出站流量流向您選擇的端口(9042)。

最後,如果你還沒有使用任何彈性IP,它能夠更好地使用EC2實例的DNS名稱,無論是在你的setSeeds部分和cassandra.yaml的rpc_address

+0

我已經安裝了Datastax,並且能夠使用提到的相同EC2主機IP和端口從它運行CQL。您是否仍然認爲EC2入站安全組中的設置可能存在問題? –

0

您的問題不在您的代碼中。您與您指定爲種子的節點存在連接問題。因此,該節點沒有運行,或者無法通過運行客戶端的計算機訪問該節點。

+0

節點正在運行我能夠通過SSH進行連接,甚至可以使用相同的IP和端口號從Datastax運行CQL?那麼爲什麼不從astyanax –

+0

你在cassandra.yaml中設置了哪些RPC端口?這應該與您給Astyanax的港口相匹配。 –

0

我終於升級libthrift 0.9和改變了我代碼到以下nd它現在工作正常。

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(); 
} 
相關問題