如何提高 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 机器上的计算时间相同吗?