Google Cloud Bigtable 的性能调整技巧
Performance tuning tips for Google Cloud Bigtable
我正在使用一组 BT table 来存储用于批处理和实时操作的数据,并希望优化性能,尤其是围绕随机访问读取的延迟。虽然我确实非常了解底层 BT 代码库,但我不知道所有这些如何转化为 Cloud Bigtable 的最佳实践,这不是 相当与底层代码相同。所以我有一些问题想请教专家:
(1) 我发现其他问题的答案是 Cloud BT 将所有列族存储在一个位置组中。由于我经常需要从一行中的多个列族中读取数据,这非常适合我的需求……但我注意到在一次操作中读取 N 个 CF 而不是一个 CF 时速度明显变慢。在这种情况下,每个单元格都很小(~1kB),并且正在读取的单元格总数并不大,所以我不认为这会受到网络延迟、瓶颈等因素的影响;并且单元格不会被写入重击,所以我不希望出现不受控制的未压缩日志。但是:
- 是否有针对此类读取模式的一般性能提示?
- 云BT中使用的主要和次要压缩间隔是什么?这些是可调的吗?
(2) 读取 API 确实接受读取请求中的稀疏行集。这些引擎盖下发生了多少优化?是否有我在实例中访问的一些云 BT 服务器,它跨 tablet 服务器并行这些底层操作,或者云 BT API 是否直接进入 tablet 服务器? (也就是说,使用这个 API 确实比做循环更有效率吗?)
(3) 相关,我正在使用 Python 客户端库。关于它的操作并行化或并行化能力,是否有任何需要了解的事情——例如,从多线程使用它时有什么问题吗?
(4) 关于如何让随机读取尖叫,还有什么我应该知道的吗?
(对于不了解 BT 内部结构的此问题的未来读者的脚注:您可以将整个 table 视为垂直划分为位置组,位置组为列族,以及column families into columns, and horizontally into tablets, which contains rows. Each locality group basically operates like a independent bigtable under the hood, 但是在云BT中,你所有的家庭都在一个单一的LG中所以这个抽象级别没有多大意义。水平拆分为 tablets 是定期动态完成的,以避免 tablets 的热点,因此单个 tablet 可能是小到一行或大到数百万。在 table 的每个 (locality group) * (tablet) 矩形内,数据以日志文件系统的形式存储:有一个日志最近写入的文件(基本上只是 "row, column, value" 元组)。每个次要压缩间隔,都会启动一个新的日志文件,并且先前的日志文件会转换为 SSTable,这是一个文件存储从字符串到字符串的排序映射以实现高效读取。每个主要的压缩间隔,所有的 SSTable 都被组合成一个 SSTable。因此,对 BT 的单次写入只是对日志的追加,而读取则必须检查当前存在的所有 SSTable 以及日志文件。因此,如果您向 tablet 写入大量内容,读取速度会变慢。
SSTables 实际上有多种线路格式,针对各种访问模式进行了优化,例如从旋转磁盘随机访问、批量访问等,因此根据这些细节,读取其中一个可能需要 1-3 iops底层存储系统,一般为分布式磁盘。)
你问了很多问题 :) 我可以给 (1) 一个提示。 The documentation 提到
Store data you will access in a single query in a single column family.
Column qualifiers in a single column family have a physical as well as
a logical relationship. In general, all of the column qualifiers in a
single column family are stored together, accessed together and cached
together. As a result, a query that accesses a single column family
might execute more efficiently than a query spanning column families.
这似乎符合您的体验。因此,如果您能够将数据分组到一个 CF 中,它可能会帮助您缩短阅读时间。
这里面有很多子问题,所以把它们分解成单独的问题可能会有更好的结果。同时尝试回答其中的一些问题:
Cloud Bigtable 的次要和主要压缩间隔未发布,因为它们可能会发生变化。基于当前 GC Documentation, a garbage collection (major compaction), will happen within a week. As noted in the Compactions Documentation,这些设置不是用户可配置的。
Cloud Bigtable 端没有读取并行化。通过在客户端中进行并行化,您可以获得更好的性能。
我对 Python 客户端不太熟悉,所以我会让其他人插话。但请注意,与其他 GA 客户端相比,它处于 Beta 阶段,后者将对其进行更多性能调整。
深思熟虑 Schema Design is the best bet for ensuring continued performance for a table. Additionally, using the Key Visualizer 可有效诊断出现的任何性能问题,例如热点.
我正在使用一组 BT table 来存储用于批处理和实时操作的数据,并希望优化性能,尤其是围绕随机访问读取的延迟。虽然我确实非常了解底层 BT 代码库,但我不知道所有这些如何转化为 Cloud Bigtable 的最佳实践,这不是 相当与底层代码相同。所以我有一些问题想请教专家:
(1) 我发现其他问题的答案是 Cloud BT 将所有列族存储在一个位置组中。由于我经常需要从一行中的多个列族中读取数据,这非常适合我的需求……但我注意到在一次操作中读取 N 个 CF 而不是一个 CF 时速度明显变慢。在这种情况下,每个单元格都很小(~1kB),并且正在读取的单元格总数并不大,所以我不认为这会受到网络延迟、瓶颈等因素的影响;并且单元格不会被写入重击,所以我不希望出现不受控制的未压缩日志。但是:
- 是否有针对此类读取模式的一般性能提示?
- 云BT中使用的主要和次要压缩间隔是什么?这些是可调的吗?
(2) 读取 API 确实接受读取请求中的稀疏行集。这些引擎盖下发生了多少优化?是否有我在实例中访问的一些云 BT 服务器,它跨 tablet 服务器并行这些底层操作,或者云 BT API 是否直接进入 tablet 服务器? (也就是说,使用这个 API 确实比做循环更有效率吗?)
(3) 相关,我正在使用 Python 客户端库。关于它的操作并行化或并行化能力,是否有任何需要了解的事情——例如,从多线程使用它时有什么问题吗?
(4) 关于如何让随机读取尖叫,还有什么我应该知道的吗?
(对于不了解 BT 内部结构的此问题的未来读者的脚注:您可以将整个 table 视为垂直划分为位置组,位置组为列族,以及column families into columns, and horizontally into tablets, which contains rows. Each locality group basically operates like a independent bigtable under the hood, 但是在云BT中,你所有的家庭都在一个单一的LG中所以这个抽象级别没有多大意义。水平拆分为 tablets 是定期动态完成的,以避免 tablets 的热点,因此单个 tablet 可能是小到一行或大到数百万。在 table 的每个 (locality group) * (tablet) 矩形内,数据以日志文件系统的形式存储:有一个日志最近写入的文件(基本上只是 "row, column, value" 元组)。每个次要压缩间隔,都会启动一个新的日志文件,并且先前的日志文件会转换为 SSTable,这是一个文件存储从字符串到字符串的排序映射以实现高效读取。每个主要的压缩间隔,所有的 SSTable 都被组合成一个 SSTable。因此,对 BT 的单次写入只是对日志的追加,而读取则必须检查当前存在的所有 SSTable 以及日志文件。因此,如果您向 tablet 写入大量内容,读取速度会变慢。
SSTables 实际上有多种线路格式,针对各种访问模式进行了优化,例如从旋转磁盘随机访问、批量访问等,因此根据这些细节,读取其中一个可能需要 1-3 iops底层存储系统,一般为分布式磁盘。)
你问了很多问题 :) 我可以给 (1) 一个提示。 The documentation 提到
Store data you will access in a single query in a single column family.
Column qualifiers in a single column family have a physical as well as a logical relationship. In general, all of the column qualifiers in a single column family are stored together, accessed together and cached together. As a result, a query that accesses a single column family might execute more efficiently than a query spanning column families.
这似乎符合您的体验。因此,如果您能够将数据分组到一个 CF 中,它可能会帮助您缩短阅读时间。
这里面有很多子问题,所以把它们分解成单独的问题可能会有更好的结果。同时尝试回答其中的一些问题:
Cloud Bigtable 的次要和主要压缩间隔未发布,因为它们可能会发生变化。基于当前 GC Documentation, a garbage collection (major compaction), will happen within a week. As noted in the Compactions Documentation,这些设置不是用户可配置的。
Cloud Bigtable 端没有读取并行化。通过在客户端中进行并行化,您可以获得更好的性能。
我对 Python 客户端不太熟悉,所以我会让其他人插话。但请注意,与其他 GA 客户端相比,它处于 Beta 阶段,后者将对其进行更多性能调整。
深思熟虑 Schema Design is the best bet for ensuring continued performance for a table. Additionally, using the Key Visualizer 可有效诊断出现的任何性能问题,例如热点.