Как установить postgresql в моем образе докера? - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь получить данные из Postgresql в моем приложении spark. Но теперь я не совсем понимаю, как установить драйвер postgresql в образ докера.Я также попытался установить postgresql как команду apt-get install, как указано ниже (Dockerfile).

Dockerfile:

FROM python:3


ENV SPARK_VERSION 2.3.2
ENV SPARK_HADOOP_PROFILE 2.7
ENV SPARK_SRC_URL https://www.apache.org/dist/spark/spark-$SPARK_VERSION/spark-${SPARK_VERSION}- 
bin-hadoop${SPARK_HADOOP_PROFILE}.tgz
ENV SPARK_HOME=/opt/spark
ENV PATH $PATH:$SPARK_HOME/bin

RUN wget ${SPARK_SRC_URL}
RUN tar -xzf spark-${SPARK_VERSION}-bin-hadoop${SPARK_HADOOP_PROFILE}.tgz

RUN mv spark-${SPARK_VERSION}-bin-hadoop${SPARK_HADOOP_PROFILE} /opt/spark
RUN rm -f spark-${SPARK_VERSION}-bin-hadoop${SPARK_HADOOP_PROFILE}.tgz
RUN apt-get update && \
apt-get install -y openjdk-8-jdk-headless \
 postgresql && \
rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME  /usr/lib/jvm/java-8-openjdk-amd64/

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt


COPY my_script.py ./
CMD [ "python", "./my_script.py" ]

needs.txt: pyspark == 2.3.2 numpy

my_script.py:

from pyspark import SparkContext
from pyspark import SparkConf

#spark conf
conf1 = SparkConf()
conf1.setMaster("local[*]")
conf1.setAppName('hamza')
print(conf1)
sc = SparkContext(conf = conf1)
print('hahahha')

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
print(sqlContext)

from pyspark.sql import DataFrameReader
url = 'postgresql://IP:PORT/INSTANCE'
properties = {'user': 'user', 'password': 'pass'}
df = DataFrameReader(sqlContext).jdbc(
url='jdbc:%s' % url, table=query, properties=properties
)

Получение этой ошибки:

Traceback (most recent call last):
  File "./my_script.py", line 26, in <module>
, properties=properties
  File "/usr/local/lib/python3.7/site-packages/pyspark/sql/readwriter.py", line 527, in jdbc
  return self._df(self._jreader.jdbc(url, table, jprop))
  File "/usr/local/lib/python3.7/site-packages/py4j/java_gateway.py", line 1257, in __call__
answer, self.gateway_client, self.target_id, self.name)
  File "/usr/local/lib/python3.7/site-packages/pyspark/sql/utils.py", line 63, in deco
return f(*a, **kw)
  File "/usr/local/lib/python3.7/site-packages/py4j/protocol.py", line 328, in get_return_value
format(target_id, ".", name), value)
       py4j.protocol.Py4JJavaError: An error occurred while calling o28.jdbc.
   : java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:315)

Пожалуйста, подскажите, как настроить этот драйвер. Спасибо

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Добавление этих строк в Dockerfile решило проблему:

ENV POST_URL https://jdbc.postgresql.org/download/postgresql-42.2.5.jar
RUN wget ${POST_URL}
RUN mv postgresql-42.2.5.jar /opt/spark/jars

Спасибо всем

0 голосов
/ 25 декабря 2018

Это не Docker способ ведения дел.Подход Docker заключается не в том, чтобы все сервисы были в одном контейнере, а в том, чтобы разделить их на несколько, где каждый контейнер должен иметь один основной процесс, такой как база данных, ваше приложение и т. Д.

Кроме того, при использовании отдельных контейнеров вы не заботитесь оВнедряя все необходимое в ваш Dockerfile - вы просто выбираете готовые контейнеры с нужными типами баз данных.Кстати, если вы используете python:3 образ докера, как вы знаете, сопровождающие не изменят набор установленных служб или даже тип ОС?Они могут сделать это легко, потому что они предоставляют только услугу 'Python`, все остальное не определено.

Итак, я рекомендую:

  1. Разделить ваш проект на разные контейнеры (Dockerfiles)
  2. Использовать стандартный postgres образ для вашей базы данных - все службы и драйверы уже встроены
  3. Использовать docker-compose (или любой другой) для запуска обоих контейнеров и связывания их вместе в одномсеть.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...