【问题标题】:Spark and Cassandra in same dockerSpark 和 Cassandra 在同一个 docker 中
【发布时间】:2019-06-15 19:34:48
【问题描述】:

我正在解压缩 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,所以把我当作菜鸟吧。

谢谢。

【问题讨论】:

    标签: python docker apache-spark cassandra pyspark


    【解决方案1】:

    因为您的 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

    【讨论】:

    • 感谢您的洞察力。我需要像 Mesos 这样的其他工具吗?或者我可以只创建两个容器;一个包含 cassandra 和另一个包含 spark(我的 python 代码应该在哪里)并通过default-network连接它们?
    • 没有。你真的不需要 mesos 或任何其他资源管理器。只需在容器内以独立模式运行 spark submit。这当然是为了当地的发展。为生产运行会有所不同。
    猜你喜欢
    • 2021-08-30
    • 2019-04-10
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多