错误:ValueError:未知 url 类型:“g”。无法通过 Cloud composer 触发的 Dataflow 脚本连接到存储在 GCS 存储桶中的 jdbc 驱动程序

Error: ValueError: unknown url type: 'g'. Unable to connect to jdbc driver stored in GCS bucket by Dataflow script triggered by Cloud composer

提问人:Viknesh S K 提问时间:11/2/2023 最后编辑:Viknesh S K 更新时间:11/6/2023 访问量:33

问:

我无法通过 Cloud composer 触发的 Dataflow 脚本连接到存储在 GCS 存储桶中的 jdbc 驱动程序(jar 文件)。我有一个作曲家脚本和一个数据流脚本。

作曲家脚本:触发要运行的数据流脚本。(在作曲家存储桶的 Dags 文件夹中)

Dataflow python脚本:连接到CloudSQL中的MySQL,以读取数据并将其写入Bigquery。MySQL Jar 文件:(两者都存储在 Composer bucket 的存储桶位置)。mysql-connector-j-8.2.0.jar

用于读取 MySQL 表的代码。apache_beam.io.jdbc.ReadFromJdbcclasspath

数据流脚本:

"""Cloud sql mysql to bigquery"""
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions, GoogleCloudOptions
from apache_beam.io.gcp.bigquery import WriteToBigQuery
from apache_beam.io.jdbc import ReadFromJdbc

def run(argv=None):
    pipeline_options = PipelineOptions()

    gcp_options = pipeline_options.view_as(GoogleCloudOptions)
    gcp_options.project = 'project-name'

    with beam.Pipeline(options=pipeline_options) as p:
        jdbc_url = (
            "jdbc:mysql://someIPhere:3306/dbname"
        )
        # classpath='gs://us-central1-viknesh-compose-0000000-bucket/mysql-connector-j-8.2.0.jar'
        # classpath=["com.google.cloud.sql:mysql-socket-factory-connector-j-8:1.7.2"]
        # classpath=["gs://us-central1-viknesh-compose-0000000-bucket/mysql-connector-j-8.2.0.jar"]
        classpath=["https://storage.cloud.google.com/viknesh-poc-bucket/mysql-connector-j-8.2.0.jar"]
        query = 'SELECT * FROM Persons'
        output_table = 'project-name:datasets_us_cent1.new_test_mysql_cloudsql'

        sql_data = p | 'Read from Cloud SQL' >> ReadFromJdbc(
            query=query,
            jdbc_url=jdbc_url,
            table_name='new_test_mysql_cloudsql',
            username='root',
            password='mypassword',
            # driver_class_name='com.mysql.jdbc.Driver',
            driver_class_name='com.mysql.cj.jdbc.Driver',
            classpath=classpath
        )

        sql_data | 'Write to BigQuery' >> WriteToBigQuery(
            table=output_table,
            create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED,
            write_disposition=beam.io.BigQueryDisposition.WRITE_TRUNCATE
        )

if __name__ == '__main__':
    run()

我的作曲家 dag 代码可以触发数据流代码。 我收到一个错误,指出数据流代码无法解析位置(gcs 路径)。有多个警告和错误。

警告:(对于路径中的每个字母)它显示警告WARNING:root:Unable to parse g into group:artifact:version.

错误: ValueError: unknown url type: 'g'

警告: Warning for each letter in classpath

我还检查了此处提供的 I/O 连接器。看起来python不是一个原生的连接器,只有via-X语言和X语言有一些困难。

我尝试了多种方法来设置服务帐户和读取 maven 页面的权限,但没有得到解决。请帮忙!

mysql jdbc jar google-cloud-composer

评论


答:

0赞 XQ Hu 11/4/2023 #1

https://beam.apache.org/releases/pydoc/current/apache_beam.io.jdbc.html

classpath – 要包含在扩展服务的类路径中的 JAR 或 Java 包的列表。jdbc 通常需要此选项来包含额外的 JDBC 驱动程序包。包可以采用以下三种格式:(1) 本地文件,(2) URL,(3) Maven 包的 gradle 样式标识符(例如“org.postgresql:postgresql:42.3.1”)。默认情况下,此参数包括 Postgres SQL JDBC 驱动程序。

你能试试吗?classpath=[classpath]

评论

0赞 Viknesh S K 11/6/2023
是的,它必须是 URL 并在“[]”方括号内传递。确实尝试过,但仍然有问题。编辑了问题,更新了尝试并评论了很少。