Искра и Кассандра в одном докере - PullRequest
0 голосов
/ 22 января 2019

Я распаковываю tar-файл в json, а затем сохраняю эти json-файлы в cassandra, используя spark (2.4.0) и cassandra (3.11).Я использую pyspark, используя докер-контейнер, и у меня работает cassandra.

У меня есть скрипт 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 run -it spark-docker data_extractor.sh data.tar

Когда я запускаю spark-submit;он выполняет распаковку, но не может подключиться к базе данных cassandra (я использовал cassandra-driver в pyspark и запустил 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()

Это мой файл Docker: https://pastebin.com/nSkxZ2Au

Мои вопросы:

  1. Как я могу решить эту проблему, если я запускаю pyspark в docker и cassandra в локальном режиме?

  2. Есть ли способ запустить и spark, и cassandra в одном контейнере и запускать их без ошибок?

  3. Я что-то не так делаю в настройках кода Python и / или Cassandra?Если да, то как это решить?

Я пробовал несколько файлов Docker для достижения 2-го пункта, но не смог.Кроме того, я впервые использую искру и кассандру, поэтому считайте меня нубом.

Спасибо.

1 Ответ

0 голосов
/ 23 января 2019

Поскольку ваша кассандра работает на хосте, а pyspark работает внутри контейнера.127.0.0.1 внутри контейнера - это просто петля к контейнеру.

Вам необходимо получить доступ к хост-машине изнутри контейнера.

Самый грубый способ сделать это - использовать IP вашего хоста.вместо 127.0.0.1.Но это вызывает проблемы, потому что IP-адрес вашего хост-компьютера может постоянно меняться.

Если вы используете Docker для Mac, вы можете использовать docker.for.mac.localhost вместо 127.0.0.1

.идеальным способом было бы запустить два контейнера с запущенными cassandra и pyspark по отдельности и подключить их к одной сети.

Пожалуйста, прочитайте следующее, чтобы узнать, как https://docs.docker.com/v17.09/engine/userguide/networking/#default-networks

...