Error al conectarse a Cassandra utilizando el controlador Java para Apache Cassandra 1.0 de com.example.cassandra
datastax-java-driver (11)
Mientras se conecta al cliente Cassandra usando el controlador java para Cannsandra por DataStax, se está lanzando el siguiente error.
Excepción en el subproceso "main" com.datastax.driver.core.exceptions.NoHostAvailableException: todos los hosts que intentaron consultar fallaron (intentaron: [/127.0.0.1])
Por favor recomiende...
¡Gracias!
Mi código java es así:
package com.example.cassandra;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
public class SimpleClient {
private Cluster cluster;
public void connect(String node){
cluster = Cluster.builder().addContactPoint(node).build();
Metadata metadata = cluster.getMetadata();
System.out.println(metadata.getClusterName());
}
public void close()
{
cluster.shutdown();
}
public static void main(String args[]) {
SimpleClient client = new SimpleClient();
client.connect("127.0.0.1");
client.close();
}
Compruebe los puntos a continuación:
i) comprobar el servidor ip
ii) comprobar puerto de escucha
iii) la dependencia del cliente de la pila de datos debe coincidir con la versión del servidor.
Sobre el archivo yaml, las últimas versiones tienen las siguientes propiedades habilitadas:
start_native_transport: true
native_transport_port: 9042
Editar
/etc/cassandra/cassandra.yaml
y cambio
rpc_address
a 0.0.0.0
, broadcast_rpc_address y listen_address a la dirección IP del clúster.
En mi caso, este fue un problema de puerto, que olvidé actualizar
El viejo puerto RPC es 9160
Nuevo puerto binario es 9042
En mi caso, me encontré con este problema ya que usé el puerto RPC predeterminado de 9160 durante la conexión. Uno puede encontrar un puerto diferente para CQL en cassandra.yaml -
start_native_transport: true
# port for the CQL native transport to listen for clients on
native_transport_port: 9042
Una vez que cambié el código para usar el puerto 9042, el intento de conexión tuvo éxito.
public BinaryDriverTest(String cassandraHost, int cassandraPort, String keyspaceName) {
m_cassandraHost = cassandraHost;
m_cassandraPort = cassandraPort;
m_keyspaceName = keyspaceName;
LOG.info("Connecting to {}:{}...", cassandraHost, cassandraPort);
cluster = Cluster.builder().withPort(m_cassandraPort).addContactPoint(cassandraHost).build();
session = cluster.connect(m_keyspaceName);
LOG.info("Connected.");
}
public static void main(String[] args) {
BinaryDriverTest bdt = new BinaryDriverTest("127.0.0.1", 9042, "Tutorial");
}
Estaba teniendo el mismo problema al probar un nuevo clúster con un nodo.
Después de quitar esto del generador de clúster pude conectarme:
.withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("US_EAST"))
Se pudo conectar.
Solo publico esto para las personas que pueden tener el mismo problema que yo cuando recibí el mensaje de error. Resultó que mi complejo árbol de dependencias provocó una versión anterior de com.google.collections, que rompió el controlador CQL. Eliminar esta dependencia y confiar completamente en la guayaba resolvió mi problema.
Suponiendo que tiene configuraciones predeterminadas en su lugar, verifique la compatibilidad de la versión del controlador. No todas las versiones de los controladores son compatibles con todas las versiones de Cassandra, aunque sí tienen compatibilidad con versiones anteriores. Por favor vea el siguiente enlace.
http://docs.datastax.com/en/developer/java-driver/3.1/manual/native_protocol/
Me encontré con un problema similar y cambiar la versión del controlador resolvió mi problema.
Nota: con suerte, está utilizando Maven (o algo similar) para resolver dependencias. De lo contrario, es posible que tenga que descargar muchas dependencias para versiones superiores del controlador.
Tuve este problema y se ordenó configurando ReadTimeout en SocketOptions:
Cluster cluster = Cluster.builder().addContactPoint("localhost").build();
cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(HIGHER_TIMEOUT);
Vaya a su directorio de Apache Cassandra conf y habilite el protocolo binario
Protocolo binario de Cassandra El controlador Java utiliza el protocolo binario que se introdujo en Cassandra 1.2. Solo funciona con una versión de Cassandra mayor o igual a 1.2. Además, el servidor de protocolo binario no se inicia con el archivo de configuración predeterminado en Cassandr a 1.2. Debe editar el archivo cassandra.yaml para cada nodo:
start_native_transport: true
Luego reinicie el nodo.
Yo también encontré este problema, y fue causado por un simple error en la declaración que se estaba enviando.
session.prepare(null);
Obviamente, el mensaje de error es engañoso.
Yo también estaba teniendo el mismo problema. Instalé Cassandra en una PC con Linux separada y traté de conectarme a través de Windows PC. No se me permitió crear la conexión.
Pero cuando editamos cassandra.yaml, configuramos mi dirección IP de linux pc en rpc_address y reiniciamos, me permite conectarme con éxito,
# The address or interface to bind the Thrift RPC service and native transport
# server to.
#
# Set rpc_address OR rpc_interface, not both. Interfaces must correspond
# to a single address, IP aliasing is not supported.
#
# Leaving rpc_address blank has the same effect as on listen_address
# (i.e. it will be based on the configured hostname of the node).
#
# Note that unlike listen_address, you can specify 0.0.0.0, but you must also
# set broadcast_rpc_address to a value other than 0.0.0.0.
#rpc_address: localhost
rpc_address: 192.168.0.10