Google数据流GroupByKey可以处理热键吗?

时间:2018-12-05 20:35:02

标签: google-cloud-dataflow apache-beam dataflow

输入为PCollection<KV<String,String>> 我必须通过键将文件写入每一行,并将其作为KV组的值。 为了根据Key进行分组,我有2个选择: 1. GroupByKey-> PCollection<KV<String, Iterable<String>>> 2. Combine.perKey.withhotKeyFanout-> PCollection 其中值String是所有对中的累积字符串。     (Combine.CombineFn<String, List<String>, CustomStringObJ>)

我每个键可以有一个Millon记录。使用Windows和Trigger优化了键数据的收集,每个键仍然可以有数千个条目。  我担心如果使用Combine.perKey.withHotKeyFanout创建具有List<String>作为要写入文件的成员的CustomStringObJ,则String的最大大小会引起问题。

如果我们使用GroupByKey,如何处理热键?

1 个答案:

答案 0 :(得分:2)

您应该对GroupByKey使用该方法,而不要对大字符串使用Combine。实际的实现(并非Dataflow独有)是根据元素的键对元素进行混洗,并且在输出KV<K, Iterable<V>>中,值的可迭代性是对元素改组后的键的特定懒惰/流视图。没有实际的可迭代构造-就像将每个元素路由到拥有每个文件并直接写入文件的工作程序一样好。

您对窗口和触发器的使用实际上可能会强制缓冲,从而降低效率。仅当事件时间窗口属于业务案例的一部分时,才应使用事件时间窗口。它不是控制性能的机制。触发器对于管理数据的批量添加和向下游发送的方式非常有用,但是对于聚合(其中触发频率较低会节省大量数据量)最有用。对于元素的原始分组,触发器的作用往往较小。