无法统计 BigTable 中的行数
Unable to count the number of rows in BigTable
https://cloud.google.com/bigtable/docs/go/cbt-reference
在这个参考中,我尝试了以下命令
cbt count <table>
三个不同的 tables。
对于其中一个,我得到了预期的结果:行数,略低于 1M。
对于第二个 table,我收到以下错误:
[~]$ cbt count prod.userprofile
2016/10/23 22:47:48 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.userprofile'
[~]$ cbt count prod.userprofile
2016/10/23 23:00:23 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.userprofile'
试了好几次,每次都是同样的错误
对于最后一个,我得到了不同的错误(错误代码与上面相同,但其描述不同):
[~]$ cbt count prod.appprofile
2016/10/23 22:45:17 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.appprofile' : Response was not consumed in time; terminating connection. (Possible causes: row size > 256MB, slow client data read, and network problems)
[~]$ cbt count prod.appprofile
2016/10/23 23:11:10 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.appprofile' : Response was not consumed in time; terminating connection. (Possible causes: row size > 256MB, slow client data read, and network problems)
这个我也试了好几次,都没什么变化。
我用 'rpc error code 4' 作为关键字在 Whosebug 上进行了谷歌搜索,但没有找到任何有用的信息。
我真的很好奇为什么这个命令会失败,我能做些什么来解决这个问题(顺便说一句,这两个 tables 正在 24/7 生产中使用,我们有几十个大 table 个节点工作得很好,所以我认为这与带宽或 QPS 无关。
获取大 table 的计数需要从 Bigtable 的每一行中读取一些内容。没有仅获取表示计数的单个值的概念。
不幸的是,这类问题需要 map/reduce 之类的东西。幸运的是,count with Dataflow 非常简单。
另一种可能(虽然不是最好的)是使用原子计数器,即:
- 快乐基地:https://google-cloud-python-happybase.readthedocs.io/en/latest/happybase-table.html#google.cloud.happybase.table.Table.counter_inc
- 原生 API:https://googlecloudplatform.github.io/google-cloud-python/stable/bigtable-row.html#google.cloud.bigtable.row.AppendRow.increment_cell_value
如果你设计第二个table作为计数器在某些条件下的二级索引,它可以有很好的性能(如果你不通过同时读写来爆破计数器,或者你陷入沉重的计数器r/w 因为热点)。
尽管如此,Map/Reduce 确实是@solomon-duskis 提出的更强大的解决方案。
https://cloud.google.com/bigtable/docs/go/cbt-reference
在这个参考中,我尝试了以下命令
cbt count <table>
三个不同的 tables。
对于其中一个,我得到了预期的结果:行数,略低于 1M。
对于第二个 table,我收到以下错误:
[~]$ cbt count prod.userprofile
2016/10/23 22:47:48 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.userprofile'
[~]$ cbt count prod.userprofile
2016/10/23 23:00:23 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.userprofile'
试了好几次,每次都是同样的错误
对于最后一个,我得到了不同的错误(错误代码与上面相同,但其描述不同):
[~]$ cbt count prod.appprofile
2016/10/23 22:45:17 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.appprofile' : Response was not consumed in time; terminating connection. (Possible causes: row size > 256MB, slow client data read, and network problems)
[~]$ cbt count prod.appprofile
2016/10/23 23:11:10 Reading rows: rpc error: code = 4 desc = Error while reading table 'projects/focal-elf-631/instances/campaign-stat/tables/prod.appprofile' : Response was not consumed in time; terminating connection. (Possible causes: row size > 256MB, slow client data read, and network problems)
这个我也试了好几次,都没什么变化。
我用 'rpc error code 4' 作为关键字在 Whosebug 上进行了谷歌搜索,但没有找到任何有用的信息。
我真的很好奇为什么这个命令会失败,我能做些什么来解决这个问题(顺便说一句,这两个 tables 正在 24/7 生产中使用,我们有几十个大 table 个节点工作得很好,所以我认为这与带宽或 QPS 无关。
获取大 table 的计数需要从 Bigtable 的每一行中读取一些内容。没有仅获取表示计数的单个值的概念。
不幸的是,这类问题需要 map/reduce 之类的东西。幸运的是,count with Dataflow 非常简单。
另一种可能(虽然不是最好的)是使用原子计数器,即:
- 快乐基地:https://google-cloud-python-happybase.readthedocs.io/en/latest/happybase-table.html#google.cloud.happybase.table.Table.counter_inc
- 原生 API:https://googlecloudplatform.github.io/google-cloud-python/stable/bigtable-row.html#google.cloud.bigtable.row.AppendRow.increment_cell_value
如果你设计第二个table作为计数器在某些条件下的二级索引,它可以有很好的性能(如果你不通过同时读写来爆破计数器,或者你陷入沉重的计数器r/w 因为热点)。
尽管如此,Map/Reduce 确实是@solomon-duskis 提出的更强大的解决方案。