如何提高 Google Cloud VM 上的网络效率

Posted

技术标签:

【中文标题】如何提高 Google Cloud VM 上的网络效率【英文标题】:How to increase network efficiency on a Google Cloud VM 【发布时间】:2020-06-05 15:32:17 【问题描述】:

我目前正在基于 Google Cloud 的 VM(Windows Server 2019 - 4 个 vCPU)上构建 ETL 以执行以下过程:

    mysql 副本数据库中提取一些表 调整 Google BigQuery 一致性的数据类型 使用 Python 的 pandas_gbq 库将数据上传到 BigQuery

为了说明,这里是实际代码的一些部分(Python,一个表的迭代器):

while True:

    # GENERATES AN MYSQL QUERY BASED ON THE COLUMNS AND THEIR
    # RESPECTIVE TYPES, USING A DICTIONARY TO CONVERT
    # MYSQL D_TYPES TO PYTHON D_TYPES

    sql_query = gen_query(cols_dict=col_types, table=table,
                          pr_key=p_key, offset=offset)

    cursor = cnx.cursor(buffered=True)
    cursor.execute(sql_query)

    if cursor.rowcount == 0:
        break

    num_fields = len(cursor.description)
    field_names = [i[0] for i in cursor.description]

    records = cursor.fetchall()

    df = pd.DataFrame(records, columns=columns)
    offset += len(df.index)

    print('Ok, df structured')

    # CHECK FOR DATETIME COLUMNS

    col_parse_date = []

    for column in columns:
        if col_types[column] == 'datetime64':
            try:
                df[column] = df[column].astype(col_types[column])
                col_parse_date.append(column)

            except:
                df[column] = df[column].astype(str)
                for i in to_bgq:
                    if i['name'] == column:
                        i['type'] = 'STRING'

    # UPLOAD DATAFRAME TO GOOGLE BIGQUERY

    df.to_csv('carga_etl.csv', float_format='%.2f',
              index=False, sep='|')
    print('Ok, csv recorded')
    df = ''
    df = pd.read_csv('carga_etl.csv', sep='|')
    print('Ok, csv read')

    df.to_gbq(destination_table='tr.'.format(table),
              project_id='iugu-bi', if_exists='append', table_schema=to_bgq)

逻辑基于查询生成器;它获取 MySQL 表 Schema 并将其调整为 BigQuery 格式(例如 Blob 到 STRING,int(n) 到 INTEGER 等),查询完整结果(以偏移量分页,每页 500K 行)并将其保存在数据帧中然后将其上传到我的新数据库。

嗯,ETL 完成了它的工作,我目前正在将我的表迁移到云端。但是,由于网络流量差距,我担心我正在利用我的资源。这是我的 VM 报告部分的网络报告(字节/秒):

VM Network Bytes report

根据该报告,我的输入/输出网络数据峰值为 2/3 MB,与我使用机器从浏览器下载内容时的平均可用 1GB 相比,这是非常低的。

我的意思是,我在这里做错了什么?有什么方法可以提高我的 MySQL 查询/获取速度和上传到 BigQuery 的速度?

【问题讨论】:

【参考方案1】:

我了解您正在将 datetime64 转换为兼容的 BigQuery Data type,如果我错了,请纠正我。

我有一些建议:

    您可以使用 Dataflow,因为它是 ETL 产品,并且针对性能进行了优化 根据您的整体使用案例,如果您使用的是CloudSQL/MySQL,您可以使用BigQuery Federated queries。 同样,根据您的使用案例,您可以使用 MySQL 转储并将数据上传到 GCS 或直接上传到 BigQuery。

【讨论】:

以上是关于如何提高 Google Cloud VM 上的网络效率的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Platform:如何监控VM实例的内存使用情况

Linux VM 上的 Google Cloud Deep Learning 引发未知 Cuda 错误

从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

Google Cloud Dataflow:数据流编程模型的计算时间与普通 VM 机器上的计算时间相同吗?

为什么无法通过Google Cloud Platform上的Chrome RDP连接到Windows VM?

在本地挂载 Google Cloud 网络