Как читать и записывать Local MySQL Server 8 из Google Colab с помощью Pyspark? - PullRequest
1 голос
/ 28 мая 2020

Я пытался, но не мог записывать / читать таблицы с MySQL Server 8.0.19 на локальном хосте на Windows 10 с помощью pyspark от Google colab. Также есть много похожих вопросов с некоторыми предлагаемыми ответами, но ни одно из решений, похоже, здесь не работает. Вот мой код:

    <...installations  ...>

        from pyspark.sql import SparkSession

        spark = SparkSession\
        .builder\
        .appName("Word Count")\
        .config("spark.driver.extraClassPath", "/content/spark-2.4.5-bin-hadoop2.7/jars/mysql-connector-java-8.0.19.jar")\
        .getOrCreate()

Вот строка подключения:

MyjdbcDF = spark.read.format("jdbc")\
                    .option("url", "jdbc:mysql://127.0.0.1:3306/mydb?user=testuser&password=pwtest")\
                    .option("dbtable", "collisions")\
                    .option("driver","com.mysql.cj.jdbc.Driver")\
                    .load()

Я тоже использовал .option("driver","com.mysql.jdbc.Driver"), но все еще получаю эту ошибку:

Py4JJavaError: An error occurred while calling o154.load.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

...
...
...
Caused by: java.net.ConnectException: Connection refused (Connection refused)

Отсюда я полагаю, что MySQL Север недоступен. Я подключился к порту 3306 по Telnet, и он подтвердил, что сервер MySQL принимает соединения с клиентской машины. Я прочитал, что запуск: netsh advfirewall firewall add rule name="MySQL Server" action=allow protocol=TCP dir=in localport=3306 разрешит правило брандмауэра для MySQL сервера, если он был заблокирован, но без изменений.

Может ли кто-нибудь помочь?

Ответы [ 3 ]

3 голосов
/ 29 мая 2020

Вот как я устанавливаю и настраиваю MySQL на Colab

# install, set connection
!apt-get install mysql-server > /dev/null
!service mysql start
!mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'"
!pip -q install PyMySQL
%load_ext sql
%config SqlMagic.feedback=False 
%config SqlMagic.autopandas=True
%sql mysql+pymysql://root:root@/
# query using %sql or %%sql
df = %sql SELECT Host, User, authentication_string FROM mysql.user
df
0 голосов
/ 02 июня 2020

Примерно через несколько дней испытаний я нашел решение, поэтому отвечу на свой вопрос. Мне удалось подключиться с помощью сервера WAMP (спасибо @Shubham Jain за предложение), а также без сервера WAMP. Этот ответ без сервера WAMP.

Загружено ngrok из https://ngrok.com/,
Разархивировано это,
Сохранено это на моем локальном windows,
Подтвердить с помощью:
./ngrok authtoken xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(довольно простые инструкции доступны на веб-сайте)

Все еще на моем локальном Windows, я скопировал и запустил ngrok tcp 3306 в командной строке

C:\Users\userMe> ngrok tcp 3306

, и это дало что-то вроде:

ngrok by @inconshreveable                                                             
Session Status                online
Account                       userMe (Plan: Free)
Version                       2.3.35
Region                        United States (us)
Web Interface                 http://localhost:4041
Forwarding                    tcp://0.tcp.ngrok.io:17992 -> localhost:3306

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

Где 0.tcp.ngrok.io:17992 - единственное, что меня интересует, а 3306 - это MySQL и единственный порт Я заинтересован в демонстрации inte rnet для связи с моим Google Colab.

Итак, в конце дня мое соединение PySpark READ будет выглядеть так:

jdbcDF = spark.read.format("jdbc")\
                    .option("url", "jdbc:mysql://0.tcp.ngrok.io:17992/mydb?user=testUser&password=pestpw")\
                    .option("dbtable", "pipeLineTable")\
                    .option("driver","com.mysql.cj.jdbc.Driver")\
                    .load(); 

Соединение WRITE будет:

jdbcDF.write.mode("overwrite")\
    .format("jdbc")\
    .option("url",  f"jdbc:mysql://0.tcp.ngrok.io:17992/mydb")\
    .option("dbtable", "fromGcTable")\
    .option("user", "testUser")\
    .option("password", "testpw")\
    .option("driver","com.mysql.cj.jdbc.Driver")\
    .save()

В обоих подключениях строки, обратите внимание на 0.tcp.ngrok.io:17992, который заменяет localhost:3306

0 голосов
/ 29 мая 2020

Вы пытаетесь подключить базу данных mysql, установленную на вашем локальном компьютере, т.е. windows 10 из google colab в качестве экземпляра localhost .

Это невозможно, потому что google colab раскручивается собственный экземпляр для выполнения вашего кода, если вы хотите получить доступ к своему локальному mysql, вам необходимо разместить его на сервере, чтобы он был доступен через inte rnet.

В противном случае вы можете установить mysql на colab, затем используйте это для запуска кода для тестирования.

!apt-get -y install mysql-server

затем настройте его на экземпляре для использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...