【问题标题】:Cloud Dataflow performance issue while writing to BigQuery写入 BigQuery 时出现 Cloud Dataflow 性能问题
【发布时间】:2020-01-23 15:52:05
【问题描述】:

我正在尝试使用 Cloud Dataflow(Beam Python SDK)将其读取并写入 BigQuery。

读取和写入 2000 万条记录(约 80 MB)大约需要 30 分钟。

查看数据流 DAG,我可以看到将每个 CSV 行转换为 BQ 行花费了大部分时间。

下面是执行相同操作的代码 sn-p:

beam.Map(lambda s: data_ingestion.parse_record_string(s,data_ingestion.stg_schema_dict)) 

    def parse_record_string(self, string_input,schema_dict): 

        for idx,(x,key) in enumerate(zip(imm_input,schema_dict)):
            key = key.strip()
            datatype = schema_dict[key].strip()
            if key == 'HASH_ID' and datatype != 'STRING':
                hash_id = hash(''.join(imm_input[1:idx]))
                row_dict[key] = hash_id
            else:
                if x:
                    x = x.decode('utf-8').strip()
                    row_dict[key] = x
                else:
                    row_dict[key] = None
                    #row_dict[key] = ''
        return row_dict

除了 map transform 之外,我还使用了 ParDo 和 Flatmap。它们都产生相同的结果。

请提出任何可能的调整以减少时间。

提前致谢

【问题讨论】:

  • FlatMap 和 Map 均由 ParDo 提供支持。 Beam 在写入 BQ 时会自动从 Python Dicts 转换为 TableRow。

标签: python-2.7 google-cloud-platform profiling google-cloud-dataflow apache-beam


【解决方案1】:

您的代码是计算密集型的。对于每条 20M 行,您执行:

  • for 循环(每行有多少个元素?)
  • 压缩和枚举
  • 在循环的每个元素上
    • 您执行 2 个条带(在字符串上循环以删除空格)
    • 切片上的连接(这是 2 个循环)-> 这种情况多久为真?
    • 另一种情况下的另一个条带

Python 非常棒,非常方便,有很多助手。但是,请注意这种简单性的陷阱,并正确评估算法的复杂性。

如果您了解 Java,请尝试一下。它可能会更有效率。

【讨论】:

  • 完全同意,您可以验证Google BigQuery I/O connector,其中包含可以从 Google BigQuery 表读取数据和将数据写入到 Google BigQuery 表的内置转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2016-11-02
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多