表现 – Cassandra Wide Vs Skinny Rows为大列

我需要每天将60GB的数据插入Cassandra.

这分解成了
100套钥匙
每套150,000个钥匙
每键4KB的数据

在写性能方面,我更好的使用
每行1行,每行15万个键
每行10行,每行15,000个键
每行100行,每行1,500个键
每行1000行,每行150个键

另一个需要考虑的变量,我的数据在24小时后过期,所以我使用TTL = 86400自动到期

关于我的配置的更具体的细节:

CREATE TABLE stuff (
  stuff_id text,
  stuff_column text,
  value blob,
  PRIMARY KEY (stuff_id, stuff_column)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.100000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=39600 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'tombstone_compaction_interval': '43200', 'class': 'LeveledCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

访问模式详细信息:
4KB值是一组1000字节的浮点数.

一个典型的要求是需要随机选择20到60个浮标.

最初,这些浮标都存储在同一个逻辑行和列中.这里的逻辑行表示给定时间的一组数据,如果它们全部写入具有150,000列的一行.

随着时间的流逝,一些数据在列集合内的逻辑行内更新,打包字符串中的一组随机的级别将被更新.而不是更新,新的级别将被写入与其他新数据相结合的新逻辑行,以避免重写所有仍然有效的数据.这导致碎片化,因为现在需要访问多个行来检索20 – 60个值的集合.现在通常会从相同的列中读取1-5个不同行的请求.

测试方法
我为每个配置写了5个随机数据样本,并对结果进行了平均.费率计算为(Bytes_written /(时间* 10 ^ 6)).时间以秒为单位,毫秒精度测量. Pycassa被用作Cassandra界面.使用了Pycassa批插入运算符.每个插入件将多个列插入到单个行,插入大小限制为12 MB.队列刷新为12MB或更少.大小不考虑行和列开销,只是数据.数据源和数据接收器位于不同系统上的同一网络上.

写结果
请记住,由于Cassandra配置的复杂性,还有许多其他变量.
1行每行150,000个键:14 MBps
10行每行15,000个键:15 MBps
100行每行1,500键:18 MBps
1000行每行150个键:11 MBps

最佳答案
答案取决于您的数据检索模式,以及数据的逻辑分组方式.一般来说,这是我的想法:

>宽行(每行1行):这可能是最佳解决方案,因为它可以防止请求同时打到多个节点,并且使用辅助索引或复合列名称,可以快速过滤数据以满足您的需求.如果您需要每个请求访问一组数据,则最好.然而,在宽行上执行太多的多重帧可能会增加节点上的内存压力,并降低性能.
>瘦排(每组1000行):另一方面,宽行可以产生群集中的读取热点.如果您需要对完整存在于一个宽行中的数据子集进行大量请求,这一点尤其如此.在这种情况下,一个瘦小的行将在整个集群中更均匀地分发您的请求,并避免热点.另外,根据我的经验,“更瘦”的行往往表现得更好.

我会建议,分析您的数据访问模式,并根据这一点完成您的数据模型,而不是相反.

转载注明原文:表现 – Cassandra Wide Vs Skinny Rows为大列 - 代码日志