首页 > 解决方案 > Spark 和 Cassandra 在同一个 docker 中

问题描述

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

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

$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 运行cassandra -f

我收到以下错误:

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()

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

我的问题是:

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

  2. 有什么方法可以在同一个容器中同时运行 spark 和 cassandra 并在没有错误的情况下运行它们?

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

我已经尝试了几个 Dockerfiles 来实现第二点但失败了。另外,这是我第一次使用 spark 和 cassandra,所以把我当作菜鸟吧。

谢谢。

标签: pythondockerapache-sparkcassandrapyspark

解决方案


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

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

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

如果你在 Docker for mac 上,你可以使用docker.for.mac.localhost而不是127.0.0.1

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

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


推荐阅读