Spark和Cassandra在同一个docker

时间:2019-01-22 10:41:49

标签: python docker apache-spark cassandra pyspark

我要在json中解压缩tar文件,然后使用spark(2.4.0)和cassandra(3.11)将这些json文件保存在cassandra中。我正在使用docker容器运行pyspark,并且在本地运行了cassandra。

我在docker中有一个bash脚本data_extractor.sh,其中包含

$SPARK_HOME/bin/spark-submit --packages datastax:spark-cassandra-connector:2.4.0-s_2.11 data_extractor.py -f $1

我正在使用

运行docker
docker run -it spark-docker data_extractor.sh data.tar

当我运行spark-submit时;它执行解压缩任务,但无法连接到cassandra数据库(我在pyspark中使用cassandra-driver并使用cassandra -f运行了cassandra)

我遇到以下错误:

Start building Cassandra schemas.
Traceback (most recent call last):
  File "/app/data_extractor.py", line 83, in <module>
    schema_builder = CassandraSchemaGenerator(keyspace)
  File "/app/cql_schema_creator.py", line 8, in __init__
    self.cluster_conn = self.cluster.connect()
  File "cassandra/cluster.py", line 1278, in cassandra.cluster.Cluster.connect
  File "cassandra/cluster.py", line 1314, in cassandra.cluster.Cluster.connect
  File "cassandra/cluster.py", line 1301, in cassandra.cluster.Cluster.connect
  File "cassandra/cluster.py", line 2802, in cassandra.cluster.ControlConnection.connect
  File "cassandra/cluster.py", line 2845, in cassandra.cluster.ControlConnection._reconnect_internal
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'127.0.0.1': error(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})

我在以下代码中遇到错误:

from cassandra.cluster import Cluster


class CassandraSchemaGenerator:
    def __init__(self, keyspace):
        self.keyspace = keyspace
        self.cluster = Cluster(['127.0.0.1'], port=9042)
        self.cluster_conn = self.cluster.connect()

这是我的docker文件:https://pastebin.com/nSkxZ2Au

我的问题是:

  1. 如果我在docker中运行pyspark并在本地运行cassandra,如何解决此问题?

  2. 有没有办法在同一个容器中同时运行spark和cassandra并正确运行它们?

  3. 我在python代码和/或cassandra设置中做错了吗?如果是,该如何解决?

我尝试了多个Dockerfile来达到第二点,但是失败了。另外,这是我第一次使用spark和cassandra,所以请视我为菜鸟。

谢谢。

1 个答案:

答案 0 :(得分:0)

由于您的cassandra在主机中运行,而pyspark在容器中运行。容器内部的127.0.0.1只是对容器的环回。

您需要从容器内部访问主机。

最粗略的方法是使用主机的IP而不是127.0.0.1。但这会导致问题,因为主机的IP可能一直在变化。

如果您使用的是适用于Mac的Docker,则可以使用docker.for.mac.localhost代替127.0.0.1

但是理想的方法是分别运行两个分别运行cassandra和pyspark的容器,并将它们连接在同一网络上。

请阅读以下内容,以了解如何 https://docs.docker.com/v17.09/engine/userguide/networking/#default-networks