Apache spark 来自Docker的Neo4j和Spark的ServiceUnavailableException
我已经为我的应用程序创建了一个Docker映像,它与Spark Streaming、Kafka、ElasticSearch和Kibana一起运行。我把它打包成一个可执行的jar文件。当我使用此命令运行应用程序时,一切正常(数据开始生成): 然而,当我从docker运行它时,我得到一个连接到Neo4j的错误,尽管数据库是从docker compose文件运行的:Apache spark 来自Docker的Neo4j和Spark的ServiceUnavailableException,apache-spark,docker,neo4j,dockerfile,Apache Spark,Docker,Neo4j,Dockerfile,我已经为我的应用程序创建了一个Docker映像,它与Spark Streaming、Kafka、ElasticSearch和Kibana一起运行。我把它打包成一个可执行的jar文件。当我使用此命令运行应用程序时,一切正常(数据开始生成): 然而,当我从docker运行它时,我得到一个连接到Neo4j的错误,尽管数据库是从docker compose文件运行的: INFO: Closing connection pool towards localhost:7687 Exception in th
INFO: Closing connection pool towards localhost:7687
Exception in thread "main" org.neo4j.driver.v1.exceptions.ServiceUnavailableException: Unable to connect to localhost:7687, ensure the database is running and that there is a working network connection to it.
version: '3.3'
services:
kafka:
image: spotify/kafka
ports:
- "9092:9092"
environment:
- ADVERTISED_HOST=localhost
neo4j_db:
image: neo4j:latest
ports:
- "7474:7474"
- "7473:7473"
- "7687:7687"
volumes:
- /var/lib/neo4j/import:/var/lib/neo4j/import
- /var/lib/neo4j/data:/data
- /var/lib/neo4j/conf:/conf
environment:
- NEO4J_dbms_active__database=graphImport.db
elasticsearch:
image: elasticsearch:latest
ports:
- "9200:9200"
- "9300:9300"
networks:
- docker_elk
volumes:
- esdata1:/usr/share/elasticsearch/data
kibana:
image: kibana:latest
ports:
- "5601:5601"
networks:
- docker_elk
volumes:
esdata1:
driver: local
networks:
docker_elk:
driver: bridge
我以以下方式运行我的应用程序:
docker run -v my-volume:/workdir -w /workdir container-name
什么会导致这个问题?我应该在Dockerfile中更改什么来执行此应用程序
以下是Dockerfile:
FROM java:8
ARG ARG_CLASS
ENV MAIN_CLASS $ARG_CLASS
ENV SCALA_VERSION 2.11.8
ENV SBT_VERSION 1.1.1
ENV SPARK_VERSION 2.2.0
ENV SPARK_DIST spark-$SPARK_VERSION-bin-hadoop2.6
ENV SPARK_ARCH $SPARK_DIST.tgz
VOLUME /workdir
WORKDIR /opt
# Install Scala
RUN \
cd /root && \
curl -o scala-$SCALA_VERSION.tgz http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz && \
tar -xf scala-$SCALA_VERSION.tgz && \
rm scala-$SCALA_VERSION.tgz && \
echo >> /root/.bashrc && \
echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc
# Install SBT
RUN \
curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \
dpkg -i sbt-$SBT_VERSION.deb && \
rm sbt-$SBT_VERSION.deb
# Install Spark
RUN \
cd /opt && \
curl -o $SPARK_ARCH http://d3kbcqa49mib13.cloudfront.net/$SPARK_ARCH && \
tar xvfz $SPARK_ARCH && \
rm $SPARK_ARCH && \
echo 'export PATH=$SPARK_DIST/bin:$PATH' >> /root/.bashrc
EXPOSE 9851 9852 4040 9092 9200 9300 5601 7474 7687 7473
CMD /workdir/runDemo.sh "$MAIN_CLASS"
这是一个docker compose文件:
INFO: Closing connection pool towards localhost:7687
Exception in thread "main" org.neo4j.driver.v1.exceptions.ServiceUnavailableException: Unable to connect to localhost:7687, ensure the database is running and that there is a working network connection to it.
version: '3.3'
services:
kafka:
image: spotify/kafka
ports:
- "9092:9092"
environment:
- ADVERTISED_HOST=localhost
neo4j_db:
image: neo4j:latest
ports:
- "7474:7474"
- "7473:7473"
- "7687:7687"
volumes:
- /var/lib/neo4j/import:/var/lib/neo4j/import
- /var/lib/neo4j/data:/data
- /var/lib/neo4j/conf:/conf
environment:
- NEO4J_dbms_active__database=graphImport.db
elasticsearch:
image: elasticsearch:latest
ports:
- "9200:9200"
- "9300:9300"
networks:
- docker_elk
volumes:
- esdata1:/usr/share/elasticsearch/data
kibana:
image: kibana:latest
ports:
- "5601:5601"
networks:
- docker_elk
volumes:
esdata1:
driver: local
networks:
docker_elk:
driver: bridge
来自错误消息-您正试图连接到应用程序本地的
localhost
,而不是运行应用程序的主机。您需要连接到Docker网络中正确的主机名-您不需要将所有端口映射到主机,只需检查同一网络中的所有Docker映像。我知道我连接到了错误的主机。但如何检查我实际需要连接的主机?您需要按照中所述正确配置网络,然后使用主机名连接到正确的主机。您可以通过在特定服务的定义中添加hostname
来显式设置它。或者您可以通过docker network inspect network name