Bigquery Streaming 插入,每个插入上的持久或新的 http 连接?
Bigquery Streaming inserts, persistent or new http connection on every insert?
我正在使用 google-api-ruby-client
for Streaming Data Into BigQuery. so whenever there is a request. it is pushed into Redis as a queue & then a new Sidekiq worker 尝试插入 bigquery。我认为它涉及在每次插入时打开一个新的 HTTPS 连接到 bigquery。
顺便说一下,我的设置是:
每 1 秒或当批处理大小达到 1MB(1 兆字节)时发生事件 post,以先发生者为准。这是每个工作人员,因此 Biquery API 可能通过多个 HTTPS 连接每秒接收数十个 HTTP post。
这是使用 Google 提供的 API 客户端完成的。
现在问题 -- 对于流式插入,什么是更好的方法:-
- 持久 HTTPS 连接。如果是,那么它应该是在所有请求之间共享的全局连接吗?还是别的?
- 打开新连接。就像我们现在使用
google-api-ruby-client
我认为现在谈论这些优化还为时过早。还缺少其他上下文,例如您是否耗尽了内核的 TCP 连接。或者有多少个连接处于 TIME_WAIT 状态等等。
- 直到工作池在同一台机器上没有达到每秒 1000 个连接,您应该坚持使用库提供的默认模式
否则,这将需要大量其他上下文和深入理解其工作原理才能在此处进行优化。
- 另一方面,您可以将更多行批量放入相同的 streaming insert requests, the limits 中:
最大行大小:1 MB
HTTP 请求大小限制:10 MB
每秒最大行数:每秒 100,000 行,每 table.
每个请求的最大行数:500
每秒最大字节数:每秒 100 MB,每个 table
- 阅读我的其他推荐
Google BigQuery: Slow streaming inserts performance
我也会尝试提供上下文以更好地理解端口耗尽时的复杂情况:
假设在一台机器上你有一个 30,000 个端口和每秒 500 个新连接的池(典型值):
1 second goes by you now have 29500
10 seconds go by you now have 25000
30 seconds go by you now have 15000
at 59 seconds you get to 500,
at 60 you get back 500 and stay at using 29500 and that keeps rolling at
29500. Everyone is happy.
现在假设您平均每秒看到 550 个连接。
突然没有可用的端口可用。
因此,您的第一个选择是扩大允许的本地端口范围;
很容易,但即使你尽可能多地打开它,然后从
1025到65535,那还是只有64000个端口;用你的 60 秒
TCP_TIMEWAIT_LEN,平均可以维持1000个连接一个
第二。仍然没有使用持久连接。
此处更好地讨论此端口排放:http://www.gossamer-threads.com/lists/nanog/users/158655
我正在使用 google-api-ruby-client
for Streaming Data Into BigQuery. so whenever there is a request. it is pushed into Redis as a queue & then a new Sidekiq worker 尝试插入 bigquery。我认为它涉及在每次插入时打开一个新的 HTTPS 连接到 bigquery。
顺便说一下,我的设置是: 每 1 秒或当批处理大小达到 1MB(1 兆字节)时发生事件 post,以先发生者为准。这是每个工作人员,因此 Biquery API 可能通过多个 HTTPS 连接每秒接收数十个 HTTP post。
这是使用 Google 提供的 API 客户端完成的。
现在问题 -- 对于流式插入,什么是更好的方法:-
- 持久 HTTPS 连接。如果是,那么它应该是在所有请求之间共享的全局连接吗?还是别的?
- 打开新连接。就像我们现在使用
google-api-ruby-client
我认为现在谈论这些优化还为时过早。还缺少其他上下文,例如您是否耗尽了内核的 TCP 连接。或者有多少个连接处于 TIME_WAIT 状态等等。
- 直到工作池在同一台机器上没有达到每秒 1000 个连接,您应该坚持使用库提供的默认模式
否则,这将需要大量其他上下文和深入理解其工作原理才能在此处进行优化。
- 另一方面,您可以将更多行批量放入相同的 streaming insert requests, the limits 中:
最大行大小:1 MB
HTTP 请求大小限制:10 MB
每秒最大行数:每秒 100,000 行,每 table.
每个请求的最大行数:500
每秒最大字节数:每秒 100 MB,每个 table
- 阅读我的其他推荐 Google BigQuery: Slow streaming inserts performance
我也会尝试提供上下文以更好地理解端口耗尽时的复杂情况:
假设在一台机器上你有一个 30,000 个端口和每秒 500 个新连接的池(典型值):
1 second goes by you now have 29500
10 seconds go by you now have 25000
30 seconds go by you now have 15000
at 59 seconds you get to 500,
at 60 you get back 500 and stay at using 29500 and that keeps rolling at
29500. Everyone is happy.
现在假设您平均每秒看到 550 个连接。 突然没有可用的端口可用。
因此,您的第一个选择是扩大允许的本地端口范围; 很容易,但即使你尽可能多地打开它,然后从 1025到65535,那还是只有64000个端口;用你的 60 秒 TCP_TIMEWAIT_LEN,平均可以维持1000个连接一个 第二。仍然没有使用持久连接。
此处更好地讨论此端口排放:http://www.gossamer-threads.com/lists/nanog/users/158655