Hi Jack,

When I mean entries, I meant rows. Each column family has about 200 columns.

> Disabling of slab allocation is an expert-only feature - its use is
generally an anti-pattern, not recommended.
I understand this and have seen this recommendation at several places. I
want to understand the consequences? Is it performance, maintenance or
scalability, that is at stake.

In our use case we have about 3000 column families (ofcourse modelled in
RDBMS). If I were to limit to 250 column families, do you advise us to use
multiple clusters (the problem being cost ineffective)?

If we were to use a single cluster and support 3000 column families, the
only idea is to group few column families and store them in one column
family. In this case, grouping is a difficult task, imo. And if we want an
abstraction of grouping for developer, we need special connector for
Hadoop/Spark systems. So I do not want to enter this territory.

Sorry for such questions, but I am still wondering if I am the only one
facing this problem.

Thanks a lot,
Arun



On Wed, Jun 24, 2015 at 10:28 PM, Jack Krupansky <jack.krupan...@gmail.com>
wrote:

> By entries, do you mean rows or columns? Please clarify how many columns
> each of your tables has, and how many rows you are populating for each
> table.
>
> In case I didn't make it clear earlier, limit yourself to "low hundreds"
> (like 250) of tables and you should be fine. Thousands of tables is a clear
> anti-pattern for Cassandra - not recommended. If it works for you, great,
> but if not, don't say you weren't warned.
>
> Disabling of slab allocation is an expert-only feature - its use is
> generally an anti-pattern, not recommended.
>
> -- Jack Krupansky
>
> On Sun, Jun 21, 2015 at 10:55 PM, Arun Chaitanya <chaitan64a...@gmail.com>
> wrote:
>
>> Hello All,
>>
>> Now we settled on the following approach. I want to know if there are any
>> problems that you foresee in the production environment.
>>
>> Our Approach: Use  Off Heap Memory
>>
>> Modifications to default cassandra.yaml and cassandra-env.sh
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>  * memory_allocator: JEMallocAllocator 
>> (https://issues.apache.org/jira/browse/CASSANDRA-7883)
>>  * memtable_allocation_type: offheap_objects
>>
>>  By above two, the slab allocation 
>> (https://issues.apache.org/jira/browse/CASSANDRA-5935), which requires
>>  1MB heap memory per table, is disabled. The memory for table metadata, 
>> caches and memtable are thus
>>  allocated natively and does not affect GC performance.
>>
>>  * tombstone_failure_threshold: 100000000
>>
>>    Without this, C* throws TombstoneOverwhelmingException while in startup.
>>    This setting looks problematic so I want to know why just creating tables 
>> makes so many tombstones ...
>>
>>  * -XX:+UseG1GC
>>
>>    It is good for reducing GC time.
>>    Without this, full GCs > 1s are observed.
>>
>> We created 5000 column families with about 1000 entries per column
>> family. The read/write performance seems to stable.
>> The problem we saw is with startup time.
>>
>>      Cassandra Start Time (s) 20
>>
>>
>>
>> 349  Average CPU Usage (%) 40
>>
>>
>>
>> 49.65  GC Actitivy (%) 2.6
>>
>>
>>
>> 0.6
>> Thanks a lot in advance.
>>
>> On Tue, Jun 2, 2015 at 11:26 AM, graham sanderson <gra...@vast.com>
>> wrote:
>>
>>> > I strongly advise against this approach.
>>>> Jon, I think so too. But so you actually foresee any problems with this
>>>> approach?
>>>> I can think of a few. [I want to evaluate if we can live with this
>>>> problem]
>>>>
>>>>
>>>> Just to be clear, I’m not saying this is a great approach, I AM saying
>>> that it may be better than having 10000+ CFs, which was the original
>>> question (it really depends on the use case which wasn’t well defined)… map
>>> size limit may be a problem, and then there is the CQL vs thrift question
>>> which could start a flame war; ideally CQL maps should give you the same
>>> flexibility as arbitrary thrift columns
>>>
>>> On Jun 1, 2015, at 9:44 PM, Jonathan Haddad <j...@jonhaddad.com> wrote:
>>>
>>> > Sorry for this naive question but how important is this tuning? Can
>>> this have a huge impact in production?
>>>
>>> Massive.  Here's a graph of when we did some JVM tuning at my previous
>>> company:
>>>
>>>
>>> http://33.media.tumblr.com/5d0efca7288dc969c1ac4fc3d36e0151/tumblr_inline_mzvj254quj1rd24f4.png
>>>
>>> About an order of magnitude difference in performance.
>>>
>>> Jon
>>>
>>> On Mon, Jun 1, 2015 at 7:20 PM Arun Chaitanya <chaitan64a...@gmail.com>
>>> wrote:
>>>
>>>> Thanks Jon and Jack,
>>>>
>>>> > I strongly advise against this approach.
>>>> Jon, I think so too. But so you actually foresee any problems with this
>>>> approach?
>>>> I can think of a few. [I want to evaluate if we can live with this
>>>> problem]
>>>>
>>>>    - No more CQL.
>>>>    - No data types, everything needs to be a blob.
>>>>    - Limited clustering Keys and default clustering order.
>>>>
>>>> > First off, different workloads need different tuning.
>>>> Sorry for this naive question but how important is this tuning? Can
>>>> this have a huge impact in production?
>>>>
>>>> > You might want to consider a model where you have an application
>>>> layer that maps logical tenant tables into partition keys within a single
>>>> large Casandra table, or at least a relatively small number of  Cassandra
>>>> tables. It will depend on the typical size of your tenant tables - very
>>>> small ones would make sense within a single partition, while larger ones
>>>> should have separate partitions for a tenant's data. The key here is that
>>>> tables are expensive, but partitions are cheap and scale very well with
>>>> Cassandra.
>>>> We are actually trying similar approach. But we don't want to expose
>>>> this to application layer. We are attempting to hide this and provide an
>>>> API.
>>>>
>>>> > Finally, you said "10 clusters", but did you mean 10 nodes? You
>>>> might want to consider a model where you do indeed have multiple clusters,
>>>> where each handles a fraction of the tenants, since there is no need for
>>>> separate tenants to be on the same cluster.
>>>> I meant 10 clusters. We want to split our tables across multiple
>>>> clusters if above approach is not possible. [But it seems to be very 
>>>> costly]
>>>>
>>>> Thanks,
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Fri, May 29, 2015 at 5:49 AM, Jack Krupansky <
>>>> jack.krupan...@gmail.com> wrote:
>>>>
>>>>> How big is each of the tables - are they all fairly small or fairly
>>>>> large? Small as in no more than thousands of rows or large as in tens of
>>>>> millions or hundreds of millions of rows?
>>>>>
>>>>> Small tables are are not ideal for a Cassandra cluster since the rows
>>>>> would be spread out across the nodes, even though it might make more sense
>>>>> for each small table to be on a single node.
>>>>>
>>>>> You might want to consider a model where you have an application layer
>>>>> that maps logical tenant tables into partition keys within a single large
>>>>> Casandra table, or at least a relatively small number of Cassandra tables.
>>>>> It will depend on the typical size of your tenant tables - very small ones
>>>>> would make sense within a single partition, while larger ones should have
>>>>> separate partitions for a tenant's data. The key here is that tables are
>>>>> expensive, but partitions are cheap and scale very well with Cassandra.
>>>>>
>>>>> Finally, you said "10 clusters", but did you mean 10 nodes? You might
>>>>> want to consider a model where you do indeed have multiple clusters, where
>>>>> each handles a fraction of the tenants, since there is no need for 
>>>>> separate
>>>>> tenants to be on the same cluster.
>>>>>
>>>>>
>>>>> -- Jack Krupansky
>>>>>
>>>>> On Tue, May 26, 2015 at 11:32 PM, Arun Chaitanya <
>>>>> chaitan64a...@gmail.com> wrote:
>>>>>
>>>>>> Good Day Everyone,
>>>>>>
>>>>>> I am very happy with the (almost) linear scalability offered by C*.
>>>>>> We had a lot of problems with RDBMS.
>>>>>>
>>>>>> But, I heard that C* has a limit on number of column families that
>>>>>> can be created in a single cluster.
>>>>>> The reason being each CF stores 1-2 MB on the JVM heap.
>>>>>>
>>>>>> In our use case, we have about 10000+ CF and we want to support
>>>>>> multi-tenancy.
>>>>>> (i.e 10000 * no of tenants)
>>>>>>
>>>>>> We are new to C* and being from RDBMS background, I would like to
>>>>>> understand how to tackle this scenario from your advice.
>>>>>>
>>>>>> Our plan is to use Off-Heap memtable approach.
>>>>>> http://www.datastax.com/dev/blog/off-heap-memtables-in-Cassandra-2-1
>>>>>>
>>>>>> Each node in the cluster has following configuration
>>>>>> 16 GB machine (8GB Cassandra JVM + 2GB System + 6GB Off-Heap)
>>>>>> IMO, this should be able to support 1000 CF with no(very less) impact
>>>>>> on performance and startup time.
>>>>>>
>>>>>> We tackle multi-tenancy using different keyspaces.(Solution I found
>>>>>> on the web)
>>>>>>
>>>>>> Using this approach we can have 10 clusters doing the job. (We
>>>>>> actually are worried about the cost)
>>>>>>
>>>>>> Can you please help us evaluate this strategy? I want to hear
>>>>>> communities opinion on this.
>>>>>>
>>>>>> My major concerns being,
>>>>>>
>>>>>> 1. Is Off-Heap strategy safe and my assumption of 16 GB supporting
>>>>>> 1000 CF right?
>>>>>>
>>>>>> 2. Can we use multiple keyspaces to solve multi-tenancy? IMO, the
>>>>>> number of column families increase even when we use multiple keyspace.
>>>>>>
>>>>>> 3. I understand the complexity using multi-cluster for single
>>>>>> application. The code base will get tightly coupled with infrastructure. 
>>>>>> Is
>>>>>> this the right approach?
>>>>>>
>>>>>> Any suggestion is appreciated.
>>>>>>
>>>>>> Thanks,
>>>>>> Arun
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to