0

クライアント 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.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());
            }
 }
 }

エラー com.netflix.astyanax.thrift.ThriftKeyspaceImpl@1961f4 com.netflix.astyanax.connectionpool.exceptions.PoolTimeoutException: PoolTimeoutException: [host=():9042, latency=5001(5001), attempts=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.tryOperation(AbstractExecuteWithFailoverImpl.java:50) at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:229) com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:180) で com.rjil.jiodriver.MetadataRS.main(MetadataRS.java:57) 例外スレッド「メイン」で java.lang.NullPointerException at com.rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:62)

4

3 に答える 3

0

最終的に 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();
}
于 2013-11-13T17:58:34.807 に答える
0

あなたの問題はあなたのコードにはありません。シードとして指定したノードへの接続に問題があります。したがって、そのノードが実行されていないか、クライアントを実行しているマシンからアクセスできません。

于 2013-10-29T17:20:40.257 に答える
0

EC2 インスタンスで cassandra を実行しているため、cassandra のポート番号を確認してください。(9042 として選択した) は、ec2 セキュリティ グループの許可リストにあり、アクセスできることを確認します。そうでない場合は、ポート番号を追加します。ec2 セキュリティ グループのインバウンド リストで、IP 範囲を 0.0.0.0 に設定します。また、ec2 のファイアウォールがオフになっていることを確認します。デフォルトでは false ですが、とにかくチェックすることをお勧めします。

これを行った場合、クライアントは、選択したポート (9042) へのアウトバウンド トラフィックを防止するファイアウォールの背後にある可能性があります。

最後に、elastic IP を使用していない場合は、setSeeds セクションと cassandra.yaml の rpc_address の両方で、ec2 インスタンスの DNS 名を使用することをお勧めします。

于 2013-10-29T18:59:22.590 に答える