python - 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
我的问题是:
如果我在 docker 中运行 pyspark 并在本地运行 cassandra,我该如何解决这个问题?
有什么方法可以在同一个容器中同时运行 spark 和 cassandra 并在没有错误的情况下运行它们?
我在 python 代码和/或 cassandra 设置中做错了吗?如果是,如何解决?
我已经尝试了几个 Dockerfiles 来实现第二点但失败了。另外,这是我第一次使用 spark 和 cassandra,所以把我当作菜鸟吧。
谢谢。
解决方案
由于您的 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
推荐阅读
- symfony - OroPlatform:如何实现 FileType
- android - 为什么 Gradle 插件构建失败而不是 `./gradlew` 构建?
- python - Pymongo find_one 返回空列表
- azure - 您如何访问已部署的 AppService webapp 中的文件?
- alloy - 在合金分析仪中保持相同的索引?
- mysql - MYSQL用多个where子句更新同一列
- python - Python requests.Session 缺少 cookie 问题
- ios - Arkit中是否存在从点云计算每个点的顶点法线的方法?
- python - 使用 Selenium 进行 Python 多处理
- flutter - Flutter GetX 状态没有改变