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



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

  1. 从 MySQL 副本数据库中提取一些表
  2. 调整 Google BigQuery 一致性的数据类型
  3. 使用 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表模式并将其调整为BigQuery格式(例如Blob到STRING,int(n(到INTEGER等(,查询完整结果(分页偏移量,每页500K行(并将其保存在数据帧中,然后将其上传到我的新数据库。

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

虚拟机网络字节数报告

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

我的观点是,我在这里做错了什么?有没有办法提高我的 MySQL 查询/获取速度和上传到 BigQuery 的速度?

我知道您正在将 datetime64 转换为兼容的 BigQuery 数据类型,如果我错了,请纠正我。

我有几点建议:

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

最新更新