Search code examples
dockerdocker-composecassandradockerfilejanusgraph

JanusGraph not communicating with Cassandra backend in Docker environment


I need your help on configuiring a docker compose file.

Problem : Created a custom build docker file ( janusgraph ) and trying to make it talk to other containers ( cassandra ) but it doesn't as it shows the below error..

janusgraph-es  | 2449 [main] ERROR org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor  - Could not invoke constructor on class org.janusgraph.graphdb.management.JanusGraphManager (defined by the 'graphManager' setting) with one argument of class Settings
janusgraph-es  | Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
janusgraph-es  |    at org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor.<init>(ServerGremlinExecutor.java:91)
janusgraph-es  |    at org.apache.tinkerpop.gremlin.server.GremlinServer.<init>(GremlinServer.java:122)
janusgraph-es  |    at org.apache.tinkerpop.gremlin.server.GremlinServer.<init>(GremlinServer.java:86)
janusgraph-es  |    at org.apache.tinkerpop.gremlin.server.GremlinServer.main(GremlinServer.java:345)
janusgraph-es  | Caused by: java.lang.reflect.InvocationTargetException
janusgraph-es  |    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
janusgraph-es  |    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
janusgraph-es  |    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
janusgraph-es  |    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
janusgraph-es  |    at org.apache.tinkerpop.gremlin.server.util.ServerGremlinExecutor.<init>(ServerGremlinExecutor.java:80)
janusgraph-es  |    ... 3 more
janusgraph-es  | Caused by: java.lang.IllegalArgumentException: Could not instantiate implementation: org.janusgraph.diskstorage.cql.CQLStoreManager
janusgraph-es  |    at org.janusgraph.util.system.ConfigurationUtil.instantiate(ConfigurationUtil.java:64)
janusgraph-es  |    at org.janusgraph.diskstorage.Backend.getImplementationClass(Backend.java:440)
janusgraph-es  |    at org.janusgraph.diskstorage.Backend.getStorageManager(Backend.java:411)
janusgraph-es  |    at org.janusgraph.graphdb.configuration.builder.GraphDatabaseConfigurationBuilder.build(GraphDatabaseConfigurationBuilder.java:50)
janusgraph-es  |    at org.janusgraph.core.JanusGraphFactory.lambda$open$0(JanusGraphFactory.java:150)
janusgraph-es  |    at org.janusgraph.graphdb.management.JanusGraphManager.openGraph(JanusGraphManager.java:243)
janusgraph-es  |    at org.janusgraph.core.JanusGraphFactory.open(JanusGraphFactory.java:150)
janusgraph-es  |    at org.janusgraph.core.JanusGraphFactory.open(JanusGraphFactory.java:100)
janusgraph-es  |    at org.janusgraph.graphdb.management.JanusGraphManager.lambda$new$0(JanusGraphManager.java:75)
janusgraph-es  |    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
janusgraph-es  |    at org.janusgraph.graphdb.management.JanusGraphManager.<init>(JanusGraphManager.java:74)
janusgraph-es  |    ... 8 more
janusgraph-es  | Caused by: java.lang.reflect.InvocationTargetException
janusgraph-es  |    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
janusgraph-es  |    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
janusgraph-es  |    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
janusgraph-es  |    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
janusgraph-es  |    at org.janusgraph.util.system.ConfigurationUtil.instantiate(ConfigurationUtil.java:58)
janusgraph-es  |    ... 18 more
janusgraph-es  | Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:9042] Cannot connect))
janusgraph-es  |    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:268)
janusgraph-es  |    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:107)
janusgraph-es  |    at com.datastax.driver.core.Cluster$Manager.negotiateProtocolVersionAndConnect(Cluster.java:1813)
janusgraph-es  |    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1726)
janusgraph-es  |    at com.datastax.driver.core.Cluster.init(Cluster.java:214)
janusgraph-es  |    at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:387)
janusgraph-es  |    at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:366)
janusgraph-es  |    at com.datastax.driver.core.Cluster.connect(Cluster.java:311)
janusgraph-es  |    at org.janusgraph.diskstorage.cql.CQLStoreManager.initializeSession(CQLStoreManager.java:320)
janusgraph-es  |    at org.janusgraph.diskstorage.cql.CQLStoreManager.<init>(CQLStoreManager.java:182)
janusgraph-es  |    ... 23 more

Sharing the Dockerfile and the docker compose file

Dockerfile

FROM openjdk:8-jre-slim-buster

USER root
RUN mkdir -p /janusgraph

COPY . /janusgraph/.

WORKDIR /janusgraph/bin/

CMD ["./gremlin-server.sh"]

docker compose

version: "3.3"
services:
  cassandra:
    image: cassandra:3
    container_name: cassandra
    ports:
      - "9042:9042"
      - "9160:9160"
    healthcheck:
      test: ["CMD-SHELL", "[ $$(nodetool statusgossip) = running ]"]
      interval: 30s
      timeout: 10s
    networks:
      - jce-network
    volumes:
      - app-volume:/var/lib/cassandra
  janusgraph-es:
#    image: docker.io/janusgraph/janusgraph:0.5.3
    build: ./janusgraph-full-0.5.3
    container_name: janusgraph-es
#    environment:
#      JANUS_PROPS_TEMPLATE: cql-es
#      janusgraph.storage.hostname: cassandra
#      janusgraph.index.search.hostname: elastic
#      graph.replace-instance-if-exists: true
    ports:
      - "8182:8182"
    healthcheck:
      test: ["CMD", "bin/gremlin.sh", "-e", "scripts/remote-connect.groovy"]
      interval: 10000s
      timeout: 3000s
      retries: 3
    links:
      - "cassandra"
    networks:
      - jce-network
networks:
  jce-network:
volumes:
  app-volume:

FYI : I have edited the config of janusgraph by giving cassandra_container ip and also localhost and also if I start janusgraph manually with cassandra as docker service, it works!!

But not able to connect with using janusgraph as a docker service to cassandra.


Solution

  • The NoHostAvailableException in the stacktrace indicates that the Cassandra Java driver used by JanusGraph can't connect to the cluster:

        ...
    Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:9042] Cannot connect))
        at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:268)
        at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:107)
        at com.datastax.driver.core.Cluster$Manager.negotiateProtocolVersionAndConnect(Cluster.java:1813)
        at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1726)
        at com.datastax.driver.core.Cluster.init(Cluster.java:214)
        ...
    

    I suspect that the problem is JanusGraph attempts to connect to the cluster before Cassandra is up and ready.

    Try configuring your JanusGraph service to have a dependency on your Cassandra service (with depends_on). This means that the DB will be started before the app. Additionally, require that Cassandra is "healthy" before creating the JanusGraph service with the condition property.

    Your Docker compose file should look like:

      ...
      janusgraph-es:
        ...
        depends_on:
          cassandra:
            condition: service_healthy
      ...
    

    For details, see the official Docker Docs depends_on specification.

    As a side note, container links is a legacy feature and is deprecated. Consider using the default bridge in your network configuration. Cheers!

    networks:
      jce-network:
        driver: bridge
    

    👉 Please support the Apache Cassandra community by hovering over the tag then click on the Watch tag button. 🙏 Thanks!