RuntimeError: OperationalError: (2003, не удается подключиться к серверу MySQL на "IP-адресе экземпляра"

Я пытаюсь запустить скрипт Python(версия 2.7.1'), где я использую пакет pymysql для создания таблицы в базе данных из файла CSV.

Он правильно работает в моей локальной системе, однако проблема возникает при запуске того же сценария, что и часть конвейера в Google Cloud Dataflow.

Моя функция Python следующая:

class charge_to_db(beam.DoFn):
    def process(self, element):
        import pymysql

        with open(element, 'r') as f:
            data = f.read().decode("UTF-8")

        datalist = []
        for line in data.split('\n'):
            datalist.append(line.split(','))

        db = pymysql.connect(host='IPadress', user='root', password='mypassword', database='stack_model')

        cursor = db.cursor()
        cursor.execute("DROP TABLE IF EXISTS stack_convergence")

        # create columnn names from the first line in fList
        up = "upper_bnd"
        primal = "primal"
        d = "dualit"
        gap = "gap_rel"
        teta = "teta"
        alpha = "alpha"
        imba = "imba_avg"
        price = "price_avg"
       # create STUDENT table // place a comma after each new column except the last
       queryCreateConvergenceTable = """CREATE TABLE stack_convergence(
                                {} float not null,
                                {} float not null,
                                {} float not null,
                                {} float not null,
                                {} float not null,
                                {} float not null,
                                {} float not null,
                                {} float not null )""".format(up, primal, d, gap, teta, alpha, imba, price)

        cursor.execute(queryCreateConvergenceTable)

При запуске этой функции в облаке я получаю следующую ошибку:

  RuntimeError: OperationalError: (2003, 'Can\'t connect to MySQL server on \'35.195.1.40\' (110 "Connection timed out")')

Я не знаю, почему эта ошибка возникает, потому что она правильно работает в локальной системе, поэтому из локальной системы я имею доступ к своему облачному экземпляру SQL, но не из потока данных в облаке.

Почему происходит эта ошибка?

1 ответ

В Dataflow вы не можете внести в белый список IP-адрес, чтобы разрешить Dataflow доступ к экземпляру SQL. Если вы будете использовать Java, самый простой способ - использовать фабрику сокетов JdbcIO / JDBC.

Но так как вы используете Python, то может помочь имитация реализации JdbcIO.read() с использованием специфических для Python средств подключения к базе данных. Есть связанный вопрос с обходным решением после изменения некоторых настроек Cloud SQL и добавления связанных кодов Python.

Если это кажется сложным, вы также можете экспортировать данные из Cloud SQL в Cloud Storage, а затем загрузить из Cloud Storage.

Другие вопросы по тегам