我有一个Dataflow作业,由于在尝试创建作业时发送了过大的http_request主体,似乎失败了。这是请求标题:
{'content-length': '107245818', 'content-type': 'application/json', 'accept-encoding': 'gzip, deflate', 'accept': 'application/json', 'user-agent': 'x_xxxxxxxx'}
发送请求给我:
413. That's an error.
Your client issued a request that was too large.
什么进入请求体,使它如此之大?我可以做些什么来缩小其规模或让Google的服务器接受请求?
我正在使用Apache Beam Python SDK版本2.4.0。
答案 0 :(得分:0)
我通过pickletools.dis运行序列化函数定义,看看占用了多少空间。这似乎完全取决于CombineFn
的{{1}}定义。
来自:
extract_output
到
def extract_output(self, accumulator):
output = zip(self.id_list, accumulator[1], *accumulator[0])
return output
将def extract_output(self, accumulator):
return accumulator
的{{1}}带到content-length
的费用减少了100倍。
'74538844'
包含两个维度为'858884'
和accumulator
的numpy arrray。 len(id_list) x len(id_list)
为数组的每一行提供整数标签(在本例中大约为3000),并且在构造管道时是已知的。
我不知道为什么会发生这种情况,但是在CombineFn生成合理大小的请求并产生大致相同的输出后,在DoFn中使用ID进行键控。