From dev-return-103666-archive-asf-public=cust-asf.ponee.io@kafka.apache.org Tue Apr 30 10:49:39 2019 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [207.244.88.153]) by mx-eu-01.ponee.io (Postfix) with SMTP id B6721180651 for ; Tue, 30 Apr 2019 12:49:38 +0200 (CEST) Received: (qmail 92451 invoked by uid 500); 30 Apr 2019 10:49:32 -0000 Mailing-List: contact dev-help@kafka.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@kafka.apache.org Delivered-To: mailing list dev@kafka.apache.org Received: (qmail 92428 invoked by uid 99); 30 Apr 2019 10:49:31 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 30 Apr 2019 10:49:31 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 825FBC2C7D for ; Tue, 30 Apr 2019 10:49:27 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -0.2 X-Spam-Level: X-Spam-Status: No, score=-0.2 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=disabled Authentication-Results: spamd4-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=confluent.io Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id p7HY6cGGRYuK for ; Tue, 30 Apr 2019 10:49:25 +0000 (UTC) Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTPS id AF8755F2FF for ; Tue, 30 Apr 2019 10:49:24 +0000 (UTC) Received: by mail-pl1-f177.google.com with SMTP id x15so6533323pln.9 for ; Tue, 30 Apr 2019 03:49:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=confluent.io; s=google; h=to:references:from:openpgp:autocrypt:organization:subject :message-id:date:user-agent:mime-version:in-reply-to; bh=bIhBHXXwsWXLKJfVHF3n4Aop8OBOHf30fxULYx6WGbY=; b=ID6qhQsDcXF2TdWKp+y5/QoexjMrolkN/rXv4TVnzzK7rJvVrI0cMBgOx16F5Qxrgi xsxPs7wfOtmfguMTP0e5sBgq9YwNgQIGBZT3pFJ+0sD2aRryNAXM2PY4mQ0YSHUJZ02d HymOJx1wn6n00eDc2Lx8o5VawdTVCuSNemQQ7Mwy1aw6jgXYadBYbw3pq5c5ZLmV+Hxm uD7xOprtm/SfSrHsZFIIfsbZ1RYd2NETb3pvI3FnRD5o5r3hKj4ACfeHiI5AoRfgqEDn NgDwe09AcnNCHCkXoNNjy/DMuimM6WB79XY2b+E9AjFrXfMrpfredNpMrUeykm2PT7zG dy3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:references:from:openpgp:autocrypt :organization:subject:message-id:date:user-agent:mime-version :in-reply-to; bh=bIhBHXXwsWXLKJfVHF3n4Aop8OBOHf30fxULYx6WGbY=; b=t5a/loWh2+5Z+PzhCn781Sbh/AukSiagOEq2+kEuJJdqt+no+K9DuQWBFbG30IHZcz EiWjAeAB5U7WRQ0olVolOMXLN1PUP42qYnUIpVrJaQG2uaRRWWQmznLYrcpXToF+cqlp wkmopYA2qY9fPwNkVmISnPD0Ccfv/oH5IpEi1dV41XfgPygXnuTSmBjgqxSk7TRCiGv3 WPT2fNchHQPAI5d1y2cSYLijAXRiPR02HDpIwugKS78z2mhcrhNuM6XeAL9oWG0tr+zB kcwwo6zAAnAUIpgBMhhBlEZPM4bA0cirDz3OBFSRwAjavBgEDQ4duRtzRw0j4BLQuZOB ucqg== X-Gm-Message-State: APjAAAVFkkB4dVayACKdSk+S9VWiyDV/cKep/GMTGeRRiti/fNH/qN7/ Wgjy6v3IaT2zKWf60nLt7QwrprxHaBVX6SuyV/9T41YSYq+ZwySb6BAiaysF97Q3FyaohkFrWfh OBdbSMOTk/XWtKmTnmHqDz1kPyPJVvQ1m6pqaxz39v9oRigi7U2zBfGsHrN6CAOeeAvMFEQ== X-Google-Smtp-Source: APXvYqx2NNqazezIg60y6knttjccJq4+LbNBexF2y0DDU9NdGWMK1GShypJcno5gyTqqoDNF2Yy7dw== X-Received: by 2002:a17:902:6b01:: with SMTP id o1mr22699328plk.318.1556621356515; Tue, 30 Apr 2019 03:49:16 -0700 (PDT) Received: from Matthias-Sax-Macbook-Pro.local (50-0-2-20.static.sonic.net. [50.0.2.20]) by smtp.gmail.com with ESMTPSA id 17sm70804091pfw.65.2019.04.30.03.49.14 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Apr 2019 03:49:15 -0700 (PDT) To: dev@kafka.apache.org References: <0752276A-D68E-433E-9A37-54AFAB3A31EC@appnexus.com> <20234516-aa2a-8f37-1ae6-403801bd6a21@confluent.io> <9A5635F7-5F11-4525-A5BE-467CF797D564@appnexus.com> <1860461B-AA35-45F6-9119-3A084024002F@appnexus.com> From: "Matthias J. Sax" Openpgp: preference=signencrypt Autocrypt: addr=matthias@confluent.io; prefer-encrypt=mutual; keydata= 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 I5FRbGf3c/r2PPse2sMSKW6sZ1+MhAwK Organization: Confluent Inc Subject: Re: [DISCUSS] KIP-315: Stream Join Sticky Assignor Message-ID: Date: Tue, 30 Apr 2019 12:49:11 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <1860461B-AA35-45F6-9119-3A084024002F@appnexus.com> Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="PevC1RhBvTxYDFkSvasqsQtvKvwqC6SQm" --PevC1RhBvTxYDFkSvasqsQtvKvwqC6SQm Content-Type: multipart/mixed; boundary="8QrKsxO8lByekQqyBwXYkZRBVkwhnPoVZ"; protected-headers="v1" From: "Matthias J. Sax" To: dev@kafka.apache.org Message-ID: Subject: Re: [DISCUSS] KIP-315: Stream Join Sticky Assignor References: <0752276A-D68E-433E-9A37-54AFAB3A31EC@appnexus.com> <20234516-aa2a-8f37-1ae6-403801bd6a21@confluent.io> <9A5635F7-5F11-4525-A5BE-467CF797D564@appnexus.com> <1860461B-AA35-45F6-9119-3A084024002F@appnexus.com> In-Reply-To: <1860461B-AA35-45F6-9119-3A084024002F@appnexus.com> --8QrKsxO8lByekQqyBwXYkZRBVkwhnPoVZ Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: quoted-printable Mike, I am still not sure, why we need to add this assignor to the project. Even after you pointed out that you cannot use Kafka Streams, the idea of the consumer to make the `PartitionAssignor` interface public and plugable is, that the project does not need to add strategies for all kind of use cases, but that people can customize the assignors to their needs. My main question is: how generic is this use case (especially with Kafka Streams offering joins out-of-the-box) and do we really need to add it? So far, it seems ok to me, if you just write a custom assignor and plug it into the consumer. I don't see a strong need to add it to the Kafka code base. Basically, it breaks down to - How many people use joins? - How many people can or can't use Kafka Streams joins? - To what extend can Kafka Streams be improved to increase the use-case coverage? - How many people would benefit? (ie, even with adding this assignor, they might still be users who need to customize their own assignors because their join-use-case is still different to yours.) Also note, that in Kafka Streams you could still provide a custom state store implementation (with or without using a compacted changelog) and a `Processor` or `Transformer` to implement a custom join. Even if this might not work for your specific case, it might work for many other people who want to customer a join instead of using Kafka Streams' out-of-the-box join. Can you elaborate why you think it needs to be part of Kafka directly? One last question: > - Our state has a high eviction rate, so kafka compacted topics are not= ideal for storing the changelog. The compaction cannot keep up and the t= opic will be majority tombstones when it is read on partition reassignmen= t. We are using a KV store the "change log" instead. What do you mean by 'We are using a KV store the "change log" instead.'? How to you handle reassignment and state movement? Curious to see if we could improve Kafka Streams :) -Matthias On 4/30/19 3:09 AM, Mike Freyberger wrote: > In light of KIP-429, I think there will be an increased demand for stic= ky assignors. So, I'd like to restart the conversation about adding the s= ticky streams assignor, https://cwiki.apache.org/confluence/display/KAFKA= /KIP-315%3A+Stream+Join+Sticky+Assignor.=20 >=20 > It=E2=80=99d be great to get feedback on the overall idea and the propo= sed implementation. >=20 > Thanks, >=20 > Mike >=20 >=20 > =EF=BB=BFOn 6/20/18, 5:47 PM, "Mike Freyberger" wrote: >=20 > Matthias,=20 > =20 > Thanks for the feedback. For our use case, we have some complexitie= s that make using the existing Streams API more complicated than using th= e Kafka Consumer directly.=20 > =20 > - We are doing async processing, which I don't think is currently a= vailable (KIP-311 is handling this).=20 > =20 > - Our state has a high eviction rate, so kafka compacted topics are= not ideal for storing the changelog. The compaction cannot keep up and t= he topic will be majority tombstones when it is read on partition reassig= nment. We are using a KV store the "change log" instead. > =20 > - We wanted to separate consumer threads from worker threads to max= imize parallelization while keeping consumer TCP connections down. > =20 > Ultimately, it was much simpler to use the KafkaConsumer directly r= ather than peel away a lot of what Streams API does for you. I think we s= hould continue to add support for more complex use cases and processing t= o the Streams API. However, I think there will remain streaming join use = cases that can benefit from the flexibility that comes from using the Kaf= kaConsumer directly.=20 > =20 > Mike > =20 > On 6/20/18, 5:08 PM, "Matthias J. Sax" wrot= e: > =20 > Mike, > =20 > thanks a lot for the KIP. I am wondering, why Streams API canno= t be used > for perform the join? Would be good to understand the advantage= of > adding a `StickyStreamJoinAssignor` compared to using Streams A= PI? Atm, > it seems to be a redundant feature to me. > =20 > -Matthias > =20 > =20 > On 6/20/18 1:07 PM, Mike Freyberger wrote: > > Hi everybody, > >=20 > > I=E2=80=99ve created a proposal document for KIP-315 which ou= tlines the motivation of adding a new partition assignment strategy that = can used for streaming join use cases. > >=20 > > It=E2=80=99d be great to get feedback on the overall idea and= the proposed implementation. > >=20 > > KIP Link: https://cwiki.apache.org/confluence/display/KAFKA/K= IP-315%3A+Stream+Join+Sticky+Assignor > >=20 > > Thanks, > >=20 > > Mike > >=20 > =20 > =20 > =20 > =20 >=20 --8QrKsxO8lByekQqyBwXYkZRBVkwhnPoVZ-- --PevC1RhBvTxYDFkSvasqsQtvKvwqC6SQm Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Comment: GPGTools - https://gpgtools.org iQIzBAEBCgAdFiEE8osu2CcCCF5douGQu8PBaGu5w1EFAlzIKCcACgkQu8PBaGu5 w1E5nRAAqcmtCaOJJyA+9NUmHemjnatHOYAmnbgmSaf6VrxtnbgYoOa8tXYc7xhU RJLVff2WPs+fFOFPqi4THbCnh5aF40Jhn/9dalHwe9e82gu7E1fA3hXzFoOrq18x trWQaJjBQal5YFSFdiIOktdzEBVBRVh4t0CsvmCB3GVYqdP2cODDLErQs+WmBxaW p9RwY0cbfH6Rzg7lfYVT5jh+YSiymk5KdtFKqS0AXHAPwE3Pzv9ojLwXYDzkBjqO BTbeZiaFhu6ql3RiJ3xzQyf5thatvas6Ivx3quyER4yZAJeT7329a2eGOU0qK+wh 1n3dTZA52WpLJHRBO67K0JjB2ueHpgsWi5GT9OeeUy7zl2dPDjeSPD0hZJCBYLPk /2wdvg/pIBIt1qd6fCvpbJ+AdBz71EOMgyMaAJcUx13FyFKpD3dJ+Nu+uEJdTCZT JSdP9DMq5FoK1oezIxZVVYRCLrNkyTuqIGWlsHvicUe5JINtQZHA6XHahPVCZ1RN x4B7N9mubVtrqRqfPhKrftF+OlKMNc5o04ucjh8diCfBUTJd7AeMeGh+ZNaENsnF Pa2VoHpznuT5o8wKO2lYD+82vfrlIMybUdgyJolIE7uIvzp2MftMBA6Du5HoPu6+ PLvHdISwOpwQAtrQjblFZcYXkrnnD2ThDK8pLw3K0nArqsQiFHM= =Di3i -----END PGP SIGNATURE----- --PevC1RhBvTxYDFkSvasqsQtvKvwqC6SQm--