我要在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
我正在使用
运行dockerdocker 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
我的问题是:
如果我在docker中运行pyspark并在本地运行cassandra,如何解决此问题?
有没有办法在同一个容器中同时运行spark和cassandra并正确运行它们?
我在python代码和/或cassandra设置中做错了吗?如果是,该如何解决?
我尝试了多个Dockerfile来达到第二点,但是失败了。另外,这是我第一次使用spark和cassandra,所以请视我为菜鸟。
谢谢。
答案 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