2012-06-20 73 views
2

我正在嘗試爲Cassandra和Java一起使用Astyanax。我嘗試了https://github.com/Netflix/astyanax/wiki/Getting-Started的例子。我有我剛纔從這個鏈接複製代碼:Cassandra Astyanax文檔

package def; 

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.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.serializers.StringSerializer; 
import com.netflix.astyanax.thrift.ThriftFamilyFactory; 

public class sample { 

    public static void main(String[] args) throws Exception{ 
    AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder() 
    .forCluster("Test Cluster") 
    .forKeyspace("KeyspaceName") 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()  
     .setDiscoveryType(NodeDiscoveryType.NONE) 
    ) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(10) 
     .setSeeds("127.0.0.1:9160") 
    ) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    Keyspace keyspace = context.getEntity(); 

    ColumnFamily<String, String> CF_USER_INFO = 
       new ColumnFamily<String, String>(
       "Standard1",    // Column Family Name 
       StringSerializer.get(), // Key Serializer 
       StringSerializer.get()); // Column Serializer 

    // Inserting data 
    MutationBatch m = keyspace.prepareMutationBatch(); 

    m.withRow(CF_USER_INFO, "acct1234") 
     .putColumn("firstname", "john", null) 
     .putColumn("lastname", "smith", null) 
     .putColumn("address", "555 Elm St", null) 
     .putColumn("age", 30, null); 

    m.withRow(CF_USER_INFO, "acct1234") 
     .incrementCounterColumn("loginCount", 1); 

    try { 
     OperationResult<Void> result = m.execute(); 
    } catch (ConnectionException e) { 
    } 

    System.out.println("completed the task!!!"); 

    OperationResult<ColumnList<String>> result = 
       keyspace.prepareQuery(CF_USER_INFO) 
       .getKey("Key1") 
       .execute(); 
      ColumnList<String> columns = result.getResult(); 

      // Lookup columns in response by name 
      int age  = columns.getColumnByName("age").getIntegerValue(); 
      long counter = columns.getColumnByName("loginCount").getLongValue(); 
      String address = columns.getColumnByName("address").getStringValue(); 

      // Or, iterate through the columns 
      for (Column<String> c : result.getResult()) { 
       System.out.println(c.getName()); 
      } 
    } 

} 

但是當我運行此我得到一個異常:

log4j:WARN No appenders could be found for logger (com.netflix.astyanax.connectionpool.impl.ConnectionPoolMBeanManager). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
completed the task!!! 
Exception in thread "main" com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=127.0.0.1(127.0.0.1):9160, latency=0(0), attempts=1] InvalidRequestException(why:Keyspace KeyspaceName does not exist) 
    at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:159) 
    at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$1.execute(ThriftSyncConnectionFactoryImpl.java:119) 
    at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:52) 
    at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:229) 
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:180) 
    at def.sample.main(sample.java:68) 
Caused by: InvalidRequestException(why:Keyspace KeyspaceName does not exist) 
    at org.apache.cassandra.thrift.Cassandra$set_keyspace_result.read(Cassandra.java:4874) 
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) 
    at org.apache.cassandra.thrift.Cassandra$Client.recv_set_keyspace(Cassandra.java:489) 
    at org.apache.cassandra.thrift.Cassandra$Client.set_keyspace(Cassandra.java:476) 
    at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$1.execute(ThriftSyncConnectionFactoryImpl.java:109) 
    ... 4 more 

誰能告訴我有什麼錯呢?沒有適當的文件可用於此。所以,你能幫我一把嗎?甚至給我一些鏈接,我可以從中獲得更多的例子。

回答

3
why:Keyspace KeyspaceName does not exist 

上面的錯誤是相當不言自明的。當應用程序連接到本地主機時,密鑰空間不存在。因此,請確保您創建密鑰空間,然後重新運行您的應用程序。我想你想看看this。摘自線程,

該Keyspace作爲客戶端只,並不創建密鑰空間 或cassandra列家庭。您可以使用AsytanaxContext.Builder 構建一個集羣接口,通過它您可以實際創建 密鑰空間和列族。

這個link的單元測試應該爲您提供關於如何在集羣中創建密鑰空間的足夠信息。

+0

好..有沒有什麼辦法可以在代碼本身中創建密鑰空間?我沒有辦法做到這一點。這將工作在我已經創建了鍵空間和列族時。但我以前不想克里特。我怎樣才能通過代碼做到這一點? – shalki

+1

@shalki我對astyanax並不熟悉,但我認爲你可以創建密鑰空間。查看更新後的答案。 – Jasonw

+0

好的..謝謝你的所有幫助...... – shalki

0

您的代碼示例被編寫爲在127.0.0.1上與localhost上的Cassandra服務器的運行實例進行通信。如果你有Cassandra在其他地方運行,或者根本沒有運行,那麼你需要在執行你的代碼之前安裝和設置該服務器環境。

相關問題