Return-Path: X-Original-To: apmail-cassandra-user-archive@www.apache.org Delivered-To: apmail-cassandra-user-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id DDE571815E for ; Thu, 17 Mar 2016 18:00:55 +0000 (UTC) Received: (qmail 79864 invoked by uid 500); 17 Mar 2016 18:00:53 -0000 Delivered-To: apmail-cassandra-user-archive@cassandra.apache.org Received: (qmail 79824 invoked by uid 500); 17 Mar 2016 18:00:53 -0000 Mailing-List: contact user-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@cassandra.apache.org Delivered-To: mailing list user@cassandra.apache.org Received: (qmail 79574 invoked by uid 99); 17 Mar 2016 18:00:53 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 17 Mar 2016 18:00:53 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 1EEE11804A1 for ; Thu, 17 Mar 2016 18:00:53 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.999 X-Spam-Level: * X-Spam-Status: No, score=1.999 tagged_above=-999 required=6.31 tests=[HTML_MESSAGE=2, MIME_QP_LONG_LINE=0.001, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001] autolearn=disabled Received: from mx2-lw-us.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id DUVPIV3ITbJG for ; Thu, 17 Mar 2016 18:00:50 +0000 (UTC) Received: from mail.crowdstrike.com (dragosx.crowdstrike.com [208.42.231.60]) by mx2-lw-us.apache.org (ASF Mail Server at mx2-lw-us.apache.org) with ESMTPS id B28FE5F19B for ; Thu, 17 Mar 2016 18:00:49 +0000 (UTC) Received: from casmbox01.crowdstrike.sys (10.100.11.66) by ee01.crowdstrike.sys (10.100.0.12) with Microsoft SMTP Server (TLS) id 15.0.847.32; Thu, 17 Mar 2016 11:00:31 -0700 Received: from casmbox01.crowdstrike.sys (10.100.11.66) by casmbox01.crowdstrike.sys (10.100.11.66) with Microsoft SMTP Server (TLS) id 15.0.847.32; Thu, 17 Mar 2016 11:00:30 -0700 Received: from casmbox01.crowdstrike.sys ([fe80::9509:3711:75cb:b49f]) by casmbox01.crowdstrike.sys ([fe80::9509:3711:75cb:b49f%12]) with mapi id 15.00.0847.030; Thu, 17 Mar 2016 11:00:30 -0700 From: Jeff Jirsa To: "user@cassandra.apache.org" Subject: Re: DTCS bucketing Question Thread-Topic: DTCS bucketing Question Thread-Index: AdGAcd5yAnwGmN0KR56Xrzydj2c7gwABQTwA Date: Thu, 17 Mar 2016 18:00:30 +0000 Message-ID: <82501469-4BC0-4A76-9550-512AA0FB1B28@crowdstrike.com> References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [10.100.0.9] Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha256; boundary="B_3541057228_1273243975" MIME-Version: 1.0 --B_3541057228_1273243975 Content-type: multipart/alternative; boundary="B_3541057228_348366642" --B_3541057228_348366642 Content-type: text/plain; charset="UTF-8" Content-transfer-encoding: quoted-printable > am trying to concretely understand how DTCS makes buckets and I am looki= ng at the DateTieredCompactionStrategyTest.testGetBuckets method and played = with some of the parameters to GetBuckets method call (Cassandra 2.1.12). I = don=E2=80=99t think I fully understand something there. Don=E2=80=99t feel bad, you=E2=80=99re not alone.=20 > In this case, the buckets should look like [0-4000] [4000-]. Is this corr= ect ? The buckets that I get back are different (=E2=80=9Ca=E2=80=9D lives in its bucket= and everyone else in another). What I am missing here ? The latest/newest window never gets combined, it=E2=80=99s ALWAYS the base size. = Only subsequent windows get merged. First window will always be 0-1000. http= s://spotifylabscom.files.wordpress.com/2014/12/dtcs3.png > Note, that if I keep the base to original (100L) or increase it and play = with min_threshold the results are exactly what I would expect. Because the original base is lower than the lowest timestamp, which means y= ou=E2=80=99re never looking in the first window (0-base). > I am afraid that the math in Target class is somewhat hard to follow so I= am thinking about it this way. The Target class is too clever for its own good. I couldn=E2=80=99t follow it. Yo= u=E2=80=99re having trouble following it. Other smart people I=E2=80=99ve talked to cou= ldn=E2=80=99t follow it. Last June I proposed an alternative (CASSANDRA-9666 / htt= ps://github.com/jeffjirsa/twcs ). It was never taken upstream, but it does g= et a fair bit of use by people with large time series clusters (we use it on= one of our petabyte-scale clusters here). Significantly easier to reason ab= out.=20 Jeff From: Anubhav Kale Reply-To: "user@cassandra.apache.org" Date: Thursday, March 17, 2016 at 10:24 AM To: "user@cassandra.apache.org" Subject: DTCS bucketing Question =20 Hello, =20 I am trying to concretely understand how DTCS makes buckets and I am lookin= g at the DateTieredCompactionStrategyTest.testGetBuckets method and played w= ith some of the parameters to GetBuckets method call (Cassandra 2.1.12).=20 =20 I don=E2=80=99t think I fully understand something there. Let me try to explain. =20 Consider the second test there. I changed the pairs a bit for easier explan= ation and changed base (initial window size)=3D1000L and Min_Threshold=3D2 =20 pairs =3D Lists.newArrayList( Pair.create("a", 200L), Pair.create("b", 2000L), Pair.create("c", 3600L), Pair.create("d", 3899L), Pair.create("e", 3900L), Pair.create("f", 3950L), Pair.create("too new", 4125L) ); buckets =3D getBuckets(pairs, 1000L, 2, 4050L, Long.MAX_VALUE); =20 In this case, the buckets should look like [0-4000] [4000-]. Is this correc= t ? The buckets that I get back are different (=E2=80=9Ca=E2=80=9D lives in its bucket a= nd everyone else in another). What I am missing here ? =20 Another case,=20 =20 pairs =3D Lists.newArrayList( Pair.create("a", 200L), Pair.create("b", 2000L), Pair.create("c", 3600L), Pair.create("d", 3899L), Pair.create("e", 3900L), Pair.create("f", 3950L), Pair.create("too new", 4125L) ); buckets =3D getBuckets(pairs, 50L, 4, 4050L, Long.MAX_VALUE); =20 Here, the buckets should be [0-3200] [3200-4000] [4000-4050] [4050-]. Is th= is correct ? Again, the buckets that come back are quite different.=20 =20 Note, that if I keep the base to original (100L) or increase it and play wi= th min_threshold the results are exactly what I would expect.=20 =20 The way I think about DTCS is, try to make buckets of maximum possible size= s from 0, and once you can=E2=80=99t make do that , make smaller buckets (similar = to what the comment suggests). Is this mental model wrong ? I am afraid that= the math in Target class is somewhat hard to follow so I am thinking about = it this way. =20 Thanks a lot in advance. =20 -Anubhav --B_3541057228_348366642 Content-type: text/html; charset="UTF-8" Content-transfer-encoding: quoted-printable

 am trying to concretely understand how DTCS makes buckets and = I am looking at the DateTieredCompactionStrategyTest.testGetBuckets method a= nd played with some of the parameters to GetBuckets method call (Cassandra 2= .1.12). I don’t think I ful= ly understand something there.


Don&= #8217;t feel bad, you’re not alone. 


> In this case, the buckets shoul= d look like [0-4000] [4000-]. Is this correct ? The buckets that I get back = are different (“a” lives in its bucket and everyone else in anot= her). What I am missing here ?


The latest/newest window never gets combined, it’s ALWAYS the base = size. Only subsequent windows get merged. First window will always be 0-1000= . https://spotifylabscom.files.wordpress.com/2014/12/dtcs3.png

Note, that if I keep the base to= original (100L) or increase it and play with min_threshold the results are = exactly what I would expect.


Because the original base is lower than the low= est timestamp, which means you’re never looking in the first window (0= -base).

>=  I am afraid that the math in Target class is somewhat hard to follow s= o I am thinking about it this way.


The Target class is too clever for its ow= n good. I couldn’t follow it. You’re having trouble following it= .  Other smart people I’ve talked to couldn’t follow it. La= st June I proposed an alternative (CASSANDRA-9666 / https://github.com/jeffjirsa/twcs ). It wa= s never taken upstream, but it does get a fair bit of use by people with lar= ge time series clusters (we use it on one of our petabyte-scale clusters her= e). Significantly easier to reason about. 
  • Jeff
<= div>

From: Anubhav Kale
Reply-To: "user@cassandra.apache.org"
Date: Thursday, March 17, 2016 at 10:24 AM<= br>To: "user@cassandra.apache.org"
Subject: DTCS bucketing Question

<Not sure if this is the right alias or Dev, so asking in both pla= ces>

 

Hello,

 

I am trying to co= ncretely understand how DTCS makes buckets and I am looking at the DateTiere= dCompactionStrategyTest.testGetBuckets method and played with some of the pa= rameters to GetBuckets method call (Cassandra 2.1.12).

 

I don’t think I fully understand something there. Let me try to exp= lain.

 

Consider the second test there. I changed the pairs a bit for easier = explanation and changed base (initial window size)=3D1000L and Min_Threshold=3D2=

 

pairs =3D Lists.newArrayList(

 =             &nbs= p;  Pair.create("a", 200L),

    =             Pair.c= reate("b", 2000L),

       = ;         Pair.create(= "c", 3600L),

         &nbs= p;      Pair.create("d", 3899L),

            &nb= sp;   Pair.create("e", 3900L),

  &nbs= p;             P= air.create("f", 3950L),

     &nb= sp;          Pair.create= ("too new", 4125L)

        );=

 &= nbsp;      bucke= ts =3D getBuckets(pairs, 1000L, 2, 4050L, Long.MAX_VALUE);<= /p>

 

In this case, the buckets s= hould look like [0-4000] [4000-]. Is this correct ? The buckets that I get b= ack are different (“a” lives in its bucket and everyone else in = another). What I am missing here ?

 

= Another case,

 

pairs =3D Lists.newArrayList(

<= p class=3D"MsoNormal" style=3D"text-autospace:none">&n= bsp;            =    Pair.create("a", 200L),

   &n= bsp;            Pair.= create("b", 2000L),

      &= nbsp;         Pair.create("c", 3600L)= ,

         =        Pair.create("d", 3899L),

            = ;    Pair.create("e= ", 3900L),

  =             &nbs= p; Pair.create("f", 3950L),

     = ;           Pair.create= ("too new", 4125L)

       = ; );

&nb= sp;       b= uckets =3D getBuckets(pairs, 50L, 4, 4050L, Long.MAX_VALUE);

 

=

Here, the buckets should be [= 0-3200] [3200-4000] [4000-4050] [4050-]. Is this correct ? Again, the bucket= s that come back are quite different.

&= nbsp;

Note, t= hat if I keep the base to original (100L) or increase it and play with min_t= hreshold the results are exactly what I would expect.

&= nbsp;

The way= I think about DTCS is, try to make buckets of maximum possible sizes from 0= , and once you can’t make do that , make smaller buckets (similar to w= hat the comment suggests). Is this mental model wrong ? I am afraid that the math in Target class is somewhat hard to follow so I am= thinking about it this way.

 

Thanks a lot in advance.

 

-Anubhav

=
--B_3541057228_348366642-- --B_3541057228_1273243975 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIISYAYJKoZIhvcNAQcCoIISUTCCEk0CAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0B BwGggg8wMIIJlTCCB32gAwIBAgIKJGjoIQAAAAACYjANBgkqhkiG9w0BAQsFADBQMRMwEQYK CZImiZPyLGQBGRYDc3lzMRswGQYKCZImiZPyLGQBGRYLY3Jvd2RzdHJpa2UxHDAaBgNVBAMT E2Nyb3dkc3RyaWtlLVJPT1QtQ0EwHhcNMTUwNTE4MTcwNTU4WhcNMjMwNTE2MTcwNTU4WjCB nTETMBEGCgmSJomT8ixkARkWA3N5czEbMBkGCgmSJomT8ixkARkWC2Nyb3dkc3RyaWtlMRAw DgYDVQQLEwdDU1VzZXJzMRQwEgYDVQQLEwtFbmdpbmVlcmluZzEWMBQGA1UEAxMNSmVmZiBS LiBKaXJzYTEpMCcGCSqGSIb3DQEJARYaSmVmZi5KaXJzYUBjcm93ZHN0cmlrZS5jb20wggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDz/juPunY45nC7cetdyhafX455PB0ps4zm rZ/jR7NZfNWK11qq4CsWu9Agifcx7KlsmWSjn1EMopttM8axhSpgZOEKaiKSUI7NkihHKcpd ITBmx3XyhU2Dj5wBoftLbp54W+6AC5NYmsrlsqb1sw9CbRQRiALR+amfwzeZZOTKIpl2MYUJ 0qGkikpcl1wGQ1pXZYM4Bi3fa36IACgzgosONucxKMF9uOX8MUYaxdcU2wOpxvh3P4xw/CHO SQJsTaijjLDz+cZ7osYZmBlLdbHN2A55JxzMYlbNEb7xuOp7e3ooV8TV5I7LaD6ewPqu3B9Y nJnXoF+rNuf14D1tZWnT6BUBHIxNk1OTloOihowRaItAsSCUoY+KkRSFPWfwEOUEiynoSCUa gwyqIov+QP/KsGUf1J22yajmH9zexvkqoLohN56qhrAa+v3fZF0UyGk5V+EKeK4zxfu7tFwH Y9KJOPIl9jN5EBRiEpbe+j+6w8FO6+hOf3Pmr2R/IbQl9AP+saDqHGrCJrOUHZnNx+9YZ1pU TvUd/3qgQODgO28z/XqXmqqXefiwiqT9Ubmoiz7T//u069y3zquTD3PKoRnJLJuV4UIfnEdP HBIpClo9OQ2iz3CPGen+eTZprtaOlM926uweNTwDdsrjX3KiV2+bqLoLcAT2lzAFv1pSHp7O kQIDAQABo4IEITCCBB0wDgYDVR0PAQH/BAQDAgWgMD4GCSsGAQQBgjcVBwQxMC8GJysGAQQB gjcVCITk0CKH/Pdpg9mDAoHlqxCG+PJlgW6Gi7JugryReAIBZAIBFTCBlAYJKoZIhvcNAQkP BIGGMIGDMA4GCCqGSIb3DQMCAgIAgDAOBggqhkiG9w0DBAICAIAwBwYFKw4DAgcwCgYIKoZI hvcNAwcwCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBLTALBglghkgBZQMEARYwCwYJYIZIAWUD BAEZMAsGCWCGSAFlAwQBAjALBglghkgBZQMEAQUwHQYDVR0OBBYEFFeyMg1s94zEmeUrFyUT 1gtu/8mqMB8GA1UdIwQYMBaAFAnL7V4xGc1Nowmrlmwbj20X638YMIIBEwYDVR0fBIIBCjCC AQYwggECoIH/oIH8hoG6bGRhcDovLy9DTj1jcm93ZHN0cmlrZS1ST09ULUNBLENOPWRjMSxD Tj1DRFAsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmln dXJhdGlvbixEQz1jcm93ZHN0cmlrZSxEQz1zeXM/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlz dD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50hj1odHRwOi8vZGMxLmNy b3dkc3RyaWtlLnN5cy9DZXJ0RW5yb2xsL2Nyb3dkc3RyaWtlLVJPT1QtQ0EuY3JsMIIBKgYI KwYBBQUHAQEEggEcMIIBGDCBtgYIKwYBBQUHMAKGgalsZGFwOi8vL0NOPWNyb3dkc3RyaWtl LVJPT1QtQ0EsQ049QUlBLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2Vz LENOPUNvbmZpZ3VyYXRpb24sREM9Y3Jvd2RzdHJpa2UsREM9c3lzP2NBQ2VydGlmaWNhdGU/ YmFzZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MF0GCCsGAQUFBzABhlFo dHRwOi8vZGMxLmNyb3dkc3RyaWtlLnN5cy9DZXJ0RW5yb2xsL2RjMS5jcm93ZHN0cmlrZS5z eXNfY3Jvd2RzdHJpa2UtUk9PVC1DQS5jcnQwKQYDVR0lBCIwIAYIKwYBBQUHAwIGCCsGAQUF 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 oKJ0EmlTLziK+w== --B_3541057228_1273243975--