From user-return-809-archive-asf-public=cust-asf.ponee.io@impala.apache.org Tue Apr 24 14:30:19 2018 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 [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 0ADF6180671 for ; Tue, 24 Apr 2018 14:30:13 +0200 (CEST) Received: (qmail 42431 invoked by uid 500); 24 Apr 2018 12:30:13 -0000 Mailing-List: contact user-help@impala.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@impala.apache.org Delivered-To: mailing list user@impala.apache.org Received: (qmail 42417 invoked by uid 99); 24 Apr 2018 12:30:13 -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, 24 Apr 2018 12:30:13 +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 61576C012B for ; Tue, 24 Apr 2018 12:30:12 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 3.098 X-Spam-Level: *** X-Spam-Status: No, score=3.098 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=2, KAM_LINEPADDING=1.2, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_PASS=-0.001] autolearn=disabled Authentication-Results: spamd4-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=googlemail.com 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 x5VZPkA6LwqJ for ; Tue, 24 Apr 2018 12:30:01 +0000 (UTC) Received: from mail-wr0-f175.google.com (mail-wr0-f175.google.com [209.85.128.175]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTPS id 022125F175 for ; Tue, 24 Apr 2018 12:30:01 +0000 (UTC) Received: by mail-wr0-f175.google.com with SMTP id g21-v6so22275906wrb.8 for ; Tue, 24 Apr 2018 05:30:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to; bh=KT/ykMRoUkEwgvEDD0j30nO9a/JB5cLHHXUJSqN6A6g=; b=I+HvJGdxbWw9SjaYRh/CT1QLCJlFuihad9wcbgAY0UFRIj2fZWha6NotxaHOkDNoNq 1NMyauXmsIHGqt6/nTxrJ2VxY24lMBGOchZAr1VUqk4wo9IvJBB6Ygfj38SDbbVLTd5g nVf9fzblFeIGxokRqxO9aESBvP/xBjpW18Ev/87GsA1HSHkLKJ0FGr49zsYSgx2NyHLp AYYXZYENfR1xpm2TKpoErdh9ZbLHn3McxxA7HTlPgVhJOCQUtl63kGVGVYhUcKsI86xR fUtJLwHh3s2oEuBHHZ+T/BZA5Aub1gnDhTHd7XJ3q7UA4VqkGfFMsyyEGuaHUAT4LK5l uk7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to; bh=KT/ykMRoUkEwgvEDD0j30nO9a/JB5cLHHXUJSqN6A6g=; b=LdyGcImTdtmum8N6gztWBVkqLKj2cwWdX+tkrhkUNo8D1k5+r5/WyU/YHLwhWFJEWL CW04IJGRXdjT5jnKkVS7Nk5dmF1JnqtcmtoPPmDHjS4r+WpV9VW+wbTnQydpy+pDjKll TNxkoF/5aS5R318O0LZ29gCOscG6g+E7zKkZ8nupadQ4fivfyAfvVxCZ1x+UwNwPEC/4 fV8jgDpKap5Ryk2mD+mp1GGy0LwfPsImuLJVPhjwoCidzRgQsEnllIJHl0bMLdqtX/I3 SUQXJlWh1wp96qlJ4UqMGmr62VSU7aLs647DBkS0cDjxGHwrOGZLfKWLvfu43PoS5Kzi jzPg== X-Gm-Message-State: ALQs6tC/DFuhPvv9ly7pfvfnqY4W8WzI7VZxNoXykNY4Ov6dekjlZxBl i0R0vBGw99+a5BL6 X-Google-Smtp-Source: AIpwx488TJWDG+bBBE+ZEoKqHSPSpMtYBgcnaS8TrrdddCdXGfDNQCopE2jWBVKikKeyYj2OdjQYWw== X-Received: by 2002:adf:e985:: with SMTP id h5-v6mr17218759wrm.137.1524573000059; Tue, 24 Apr 2018 05:30:00 -0700 (PDT) Received: from [10.0.0.2] (p4FD8DE90.dip0.t-ipconnect.de. [79.216.222.144]) by smtp.googlemail.com with ESMTPSA id u8sm7085552wmf.3.2018.04.24.05.29.56 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Apr 2018 05:29:58 -0700 (PDT) Subject: Re: Local join instead of data exchange - co-located blocks To: user@impala.apache.org References: <1e200a35-8e6f-e5be-5895-a7a9d9199b69@googlemail.com> <6e728af2-1489-2810-a459-264092deb805@googlemail.com> <1954f3cd-88d2-cd6a-cca0-516ce87b5298@googlemail.com> <68e0449e-4598-f049-b465-9ada5044a26e@googlemail.com> From: Philipp Krause Message-ID: <2ff50473-377d-3b01-8f32-2a6bfb08644b@googlemail.com> Date: Tue, 24 Apr 2018 14:31:16 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------465607BF9EAB042B8F8A534B" X-AVK-Virus-Check: AVA 25.16826;70A0D3 X-AVK-Spam-Check: 1;str=0001.0A0B0204.5ADF2345.00DA,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0;F1206 This is a multi-part message in MIME format. --------------465607BF9EAB042B8F8A534B Content-Type: multipart/alternative; boundary="------------E5A2BAACD9533D10FC92747D" --------------E5A2BAACD9533D10FC92747D Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit To prevent the broadcast join I could simply use the shuffle operator in the query: SELECT * FROM business_partition_1 INNER JOIN [SHUFFLE] business_partition_2 WHERE business_partition_1.businessid=business_partition_2.businessid I think the broadcast is currently only used because of my very small test tables. This gives me the plan attached as partitioned_shuffle.png. Since my modified version isn't working yet, I partitioned both tables on businessid in Impala. The "hack" should only help to get into the if-condition if I partition the data manually, right?. But in this case (if the partitioning is done by Impala itself) Impala should get into the if-condition anyway. Unfortunately I can't see a difference in the plan compared to my unpartitioned tables (unpartitioned.png) concerning the exchange nodes. My goal is actually to get rid of all exchange nodes since the corresponding data is already present on each node. Actually the plan should look the same except for the 03 and 04 exchange then. Are there other changes neccessary to just take Table1-partition/block X and Table2-partition/block Y on each node and join them without any data exchange? Actually each node should take all its local blocks for both tables, join them and pass the results back to the coordinator where all results come together (please see explanation.png). I'm looking forward hearing from you. I hope we can realise this. Best regards Philipp Am 24.04.2018 um 07:03 schrieb Alexander Behm: > On Mon, Apr 23, 2018 at 7:24 PM, Philipp Krause > > wrote: > > Hi Alex, > thanks for the information! I've compiled the cdh5.13.1-release > and replaced impala-frontend-0.1-SNAPSHOT.jar (which seems to > include the changes in the DistributedPlanner.java). There still > seems to to be a method missing after replacing the jar but I'll > try to figure that out. > > I have two questions concerning the code fragment in the > DistributedPlanner.java you pointed to me. > > First: > The attached graphic shows the query plan for two tables which are > partitioned on the join attribute (standard impala version without > any changes). If I change the if-condition to true for my modified > version I expect to get the same result for my "hand made" > partitions (outside of impala). But why is there an exchange > broadcast (even in the standard version)? I mean, if I have a > partition of Table 1 with ID=0 on Node X why is there a broadcast > of the partition of Table 2 with ID=0 on Node Y? Actually this > partition only has to be sent to Node X where the matching > partition of Table 1 is located (instead of sending it to all > nodes (broadcast)). Or is this exactly the case and it's only > shown as a broadcast here in the graphics? > > > You are reading the plan correctly. Impala simply does not implement > that optimization. > > > Second: > All corresponding blocks of the partitioned tables are on the same > node (e.g. Table 1 Partition with ID=0, Table 2 Partition with > ID=0 => Node 1 etc.). This is what I did manually. As already > mentioned before I want to join these partitions (blocks) locally > on each node. But if I'm correct, the modification in the > DistributedPlanner will also only lead to the plan in the attached > graphic so that no further exchanges are created if I use my "hand > made" partitions. But there is still the broadcast exchange which > distributes the partitions across the cluster which isn't > neccessary because all needed blocks are already on the same node > and are ready to get joined locally. Is there a way to realise > that and get rid of the broadcast exchange? > > You are right. That hack in DistributedPlanner only works for > partitioned hash joins. You can probably stitch the plan together at > an earlier place, e.g.: > https://github.com/apache/impala/blob/master/fe/src/main/java/org/apache/impala/planner/DistributedPlanner.java#L506 > > Please correct me if I'm wrong with my assumptions. > > Thank you very much! > > Best regards > Philipp > > > > > > > > Am 18.04.2018 um 07:16 schrieb Alexander Behm: >> Your CM-managed cluster must be running a "compatible" Impala >> version already for this trick to work. It looks like your >> catalog binary is trying to find a method which does not exist in >> the .jar, presumably because your .jar is built based on a >> different version of Impala where that method does not exist >> anymore. >> >> It looks like you have CDH 5.13.3 installed. CDH 5.13.3 is based >> on Impala 2.10, see: >> https://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_vd_cdh_package_tarball_513.html#cm_vd_cdh_package_tarball_513 >> >> >> That means this binary copying trick will only work with a >> modified version of Impala 2.10, and very likely will not work >> with a different version. >> >> It's probably easier to test with the mini cluster first. >> Alternatively, it "might" work if you replace all the binaries >> mentioned above, but it's quite possible that will not work. >> >> On Sun, Apr 15, 2018 at 7:13 PM, Philipp Krause >> > > wrote: >> >> Hi Alex! Thank you for the list! The build of the modified >> cdh5-trunk branch (debug mode) was sucessfull. After >> replacing "impala-frontend-0.1-SNAPSHOT.jar" in >> /opt/cloudera/parcels/CDH-5.13.1-1.cdh5.13.1.p0.2/jars/ I got >> the following error in my existing cluster: >> F0416 01:16:45.402997 17897 catalog.cc:69] NoSuchMethodError: >> getCatalogObjects >> When I switch back to the original jar file the error is >> gone. So it must be something wrong with this file I guess. >> But I wonder about the error in catalog.cc because I didn't >> touch any .cc files. >> >> I also replaced "impala-data-source-api-1.0-SNAPSHOT.jar". >> The other jar files do not exist in my impala installation >> (CDH-5.13.1). >> >> What am I doing wrong? >> >> Best regards >> Philipp >> >> >> Am 13.04.2018 um 20:12 schrieb Alexander Behm: >>> Here's the foll list. It might not be minimal, but >>> copying/overwriting these should work. >>> >>> debug/service/impalad >>> debug/service/libfesupport.so >>> debug/service/libService.a >>> release/service/impalad >>> release/service/libfesupport.so >>> release/service/libService.a >>> yarn-extras-0.1-SNAPSHOT.jar >>> impala-data-source-api-1.0-SNAPSHOT-sources.jar >>> impala-data-source-api-1.0-SNAPSHOT.jar >>> impala-frontend-0.1-SNAPSHOT-tests.jar >>> impala-frontend-0.1-SNAPSHOT.jar >>> libkudu_client.so.0.1.0 >>> libstdc++.so.6.0.20 >>> impala-no-sse.bc >>> impala-sse.bc >>> libimpalalzo.so >>> >>> If you are only modifying the Java portion (like >>> DistributedPlanner), then only copying/replacing the *.jar >>> files should be sufficient. >>> >>> On Fri, Apr 13, 2018 at 11:00 AM, Philipp Krause >>> >> > wrote: >>> >>> Yes, I have a running (virtual) cluster. I would try to >>> follow your way with the custom impala build >>> (DistributedPlanner.java is the only modified file at >>> the moment). Thank you in advance for the file list! >>> >>> Best regards >>> Philipp >>> >>> Alexander Behm >> > schrieb am Fr., 13. >>> Apr. 2018, 18:45: >>> >>> I'm not really following your installation/setup and >>> am not an expert on Cloudera Manager >>> installation/config. If you are going to build >>> Impala anyway, it's probably easiest to test on >>> Impala's minicluster first. >>> >>> In general, if you have a running Cloudera Managed >>> cluster, you can deploy a custom Impala build by >>> simply overwriting the Impala existing binaries and >>> jars with the new build. If you want to go this >>> route, I can give you a full list of files you need >>> to replace. >>> >>> On Tue, Apr 10, 2018 at 11:44 AM, Philipp Krause >>> >> > wrote: >>> >>> Thank you for the explanation! Yes, I'm using >>> HDFS. The single replica setup is only for test >>> purposes at the moment. I think this makes it >>> easier to gain some first results since less >>> modifications (scheduler etc.) are neccessary. >>> I would like to test the DistributedPlanner >>> modification in my virtual cluster. I used a >>> customized Vagrant script to install Impala on >>> multiple hosts (s.attachment). It simply >>> installs cloudera-manager-server-db, >>> cloudera-manager-server and >>> cloudera-manager-daemons via apt-get. What would >>> be the simplest solution to setup my modified >>> version? Could I simply call ./buildall.sh and >>> change the script to sth. like this? >>> >>> echo "Install java..." >>> apt-get -q -y --force-yes install oracle-j2sdk1.7 >>> echo "Download impala..." >>> wget https://... where I uploaded my modified >>> version >>> echo "Extract impala..." >>> tar -xvzf Impala-cdh5-trunk.tar.gz >>> cd Impala-cdh5-trunk >>> echo "Build impala..." >>> ./buildall.sh >>> echo "Start impala instances..." >>> service cloudera-scm-server-db initdb >>> service cloudera-scm-server-db start >>> service cloudera-scm-server start >>> >>> Or is there another, maybe even easier method, >>> to test the code? Maybe via >>> bootstrap_development.sh / minicluster? >>> >>> Best regards >>> Philipp >>> >>> 2018-04-05 18:39 GMT+02:00 Alexander Behm >>> >> >: >>> >>> Apologies for the late response. Btw, your >>> previous post was clear enough to me, so no >>> worries :) >>> >>> >>> On Wed, Apr 4, 2018 at 7:46 AM, Philipp >>> Krause >> > >>> wrote: >>> >>> Hello Alex, >>> >>> I think my previous post has been too >>> long and confusing. I apologize for that! >>> >>> If replicas are completely deactivated, >>> all scan ranges of a block are mapped to >>> the one host, where the block is located >>> on. This host is the "executor"/reader >>> for all the scan ranges of this block. >>> Is that correct? >>> >>> >>> Yes, assuming you are using HDFS. >>> >>> >>> I tried to visualize my understanding of >>> the scan_range to host mapping for my >>> use case (s. attachment). Could you >>> please have a quick look at it and tell >>> me if this is correct? >>> >>> "The existing scan range assignment is >>> scan-node centric. For each scan node, >>> we independently decide which of its >>> scan ranges should be processed by which >>> host." >>> Without replicas, all scan ranges of a >>> block would be assigend to the same host >>> where this block is located on. Isn't >>> everything local here, so that Table_A - >>> Block_0 and Table_B - Block_0 can be >>> joined local or are further steps >>> neccessary? The condition in the >>> DistributedPlanner you pointed to me is >>> set to false (no exchange nodes). >>> >>> "You want it to be host-centric. For >>> each host, collect the local scan ranges >>> of *all* scan nodes, and assign them to >>> that host." >>> Wouldn't the standard setup from above >>> work? Wouldn't I assign all (the same) >>> scan ranges to each host in this case here? >>> >>> >>> The standard setup works only in if every >>> block only has exactly one replica. For our >>> purposes, that is basically never the case >>> (who would store production data without >>> replication?), so the single-replica >>> assumption was not clear to me. >>> >>> Does your current setup (only changing the >>> planner and not the scheduler) produce the >>> expected results? >>> >>> >>> >>> Thank you very much! >>> >>> Best regards >>> Philipp >>> >>> 2018-03-28 21:04 GMT+02:00 Philipp >>> Krause >>> >> >: >>> >>> Thank you for your answer and sorry >>> for my delay! >>> >>> If my understanding is correct, the >>> list of scan nodes consists of all >>> nodes which contain a *local* block >>> from a table that is needed for the >>> query (Assumption: I have no >>> replicas in my first tests). If >>> TableA-Block0 is on Node_0, isn't >>> Node_0 automatically a scan node? >>> And wouldn't this scan node always >>> be the host for the complete scan >>> range(s) then? >>> >>> "For each scan node, we >>> independently decide which of its >>> scan ranges should be processed by >>> which host." >>> >>> https://github.com/cloudera/Impala/blob/cdh5-trunk/be/src/scheduling/scheduler.cc#L532 >>> >>> >>> // Loop over all scan ranges, select >>> an executor for those with local >>> impalads and >>> // collect all others for later >>> processing. >>> >>> So in this whole block, scan ranges >>> are assigned to the closest executor >>> (=host?). But isn't the closest >>> executor always the node the block >>> is located on (assumed impalad is >>> installed and I have no replicas)? >>> And isn't this node always a scan >>> node at the same time? Otherwise a >>> thread on a remote host had to read >>> the corresponding scan range, which >>> would be more expensive. The only >>> exception I can think of is when all >>> threads on the local node are busy. >>> Or, if I use replicas and all other >>> threads of my node with the >>> "original" block are busy, a thread >>> on another node which contains a >>> replica could read a special scan >>> range of its local block. Is my >>> understanding correct here? >>> >>> Aren't all scan ranges read locally >>> by its scan nodes if I have impalad >>> installed on all nodes? And am I >>> right, that the scan range is only >>> based on its length which refers to >>> maxScanRangeLength in >>> computeScanRangeLocations? >>> https://github.com/cloudera/Impala/blob/cdh5-trunk/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java#L721 >>> >>> >>> I hope you can help me with the scan >>> node <-> scan range->host >>> relationship. If I have >>> Table_A-Block_0 and Table_B_Block_0 >>> on the same node (which I want to >>> join locally), I don't get the point >>> of why scan ranges could be assigned >>> to another host in my scenario. >>> >>> Best regads and thank you very much! >>> Philipp Krause >>> >>> >>> Am 21.03.2018 um 05:21 schrieb >>> Alexander Behm: >>>> Thanks for following up. I think I >>>> understand your setup. >>>> >>>> If you want to not think about scan >>>> ranges, then you can modify >>>> HdfsScanNode.computeScanRangeLocations(). >>>> For example, you could change it to >>>> produce one scan range per file or >>>> per HDFS block. That way you'd know >>>> exactly what a scan range >>>> corresponds to. >>>> >>>> I think the easiest/fastest way for >>>> you to make progress is to >>>> re-implement the existing scan >>>> range assignment logic in that >>>> place in the code I had pointed you >>>> to. There is no quick fix to change >>>> the existing behavior. >>>> The existing scan range assignment >>>> is scan-node centric. For each scan >>>> node, we independently decide which >>>> of its scan ranges should be >>>> processed by which host. >>>> >>>> I believe an algorithm to achieve >>>> your goal would look completely >>>> different. You want it to be >>>> host-centric. For each host, >>>> collect the local scan ranges of >>>> *all* scan nodes, and assign them >>>> to that host. >>>> >>>> Does that make sense? >>>> >>>> Alex >>>> >>>> >>>> On Mon, Mar 19, 2018 at 1:02 PM, >>>> Philipp Krause >>>> >>> > >>>> wrote: >>>> >>>> I'd like to provide a small >>>> example for our purpose. The >>>> last post may be a bit >>>> confusing, so here's a very >>>> simple example in the attached >>>> pdf file. I hope, it's >>>> understandable. Otherwise, >>>> please give me a short feedback. >>>> >>>> Basically, I only want each >>>> data node to join all it's >>>> local blocks. Is there a range >>>> mapping needed or is it >>>> possible to easily join all >>>> local blocks (regardless of its >>>> content) since everything is >>>> already "prepared"? Maybe you >>>> can clarify this for me. >>>> >>>> As you can see in the example, >>>> the tables are not partitioned >>>> by ID. The files are manually >>>> prepared by the help of the >>>> modulo function. So I don't >>>> have a range like [0,10], but >>>> something like 0,5,10,15 etc. >>>> >>>> I hope, I didn't make it too >>>> complicated and confusing. I >>>> think, the actual idea behind >>>> this is really simple and I >>>> hope you can help me to get >>>> this working. >>>> >>>> Best regards and thank you very >>>> much for your time! >>>> Philipp >>>> >>>> >>>> Am 18.03.2018 um 17:32 schrieb >>>> Philipp Krause: >>>>> >>>>> Hi! At the moment the data to >>>>> parquet (block) mapping is >>>>> based on a simple modulo >>>>> function: Id % #data_nodes. So >>>>> with 5 data nodes all rows >>>>> with Id's 0,5,10,... are >>>>> written to Parquet_0, Id's >>>>> 1,4,9 are written to Parquet_1 >>>>> etc. That's what I did >>>>> manually. Since the parquet >>>>> file size and the block size >>>>> are both set to 64MB, each >>>>> parquet file will result in >>>>> one block when I transfer the >>>>> parquet files to HDFS. By >>>>> default, HDFS distributes the >>>>> blocks randomly. For test >>>>> purposes I transferred >>>>> corresponding blocks from >>>>> Table_A and Table_B to the >>>>> same data node (Table_A - >>>>> Block_X with Id's 0,5,10 and >>>>> Table_B - Block_Y with Id's >>>>> 0,5,10). In this case, they >>>>> are transferred to data_node_0 >>>>> because the modulo function >>>>> (which I want to implement in >>>>> the scheduler) returns 0 for >>>>> these Id's. This is also done >>>>> manually at the moment. >>>>> >>>>> 1.) DistributedPlanner: For >>>>> first, upcoming tests I simply >>>>> changed the first condition in >>>>> the DistributedPlanner to true >>>>> to avoid exchange nodes. >>>>> >>>>> 2.) The scheduler: That's the >>>>> part I'm currently struggling >>>>> with. For first tests, block >>>>> replication is deactivated. >>>>> I'm not sure how / where to >>>>> implement the modulo function >>>>> for scan range to host >>>>> mapping. Without the modulo >>>>> function, I had to implement a >>>>> hard coded mapping (something >>>>> like "range" 0-0, 5-5, 10-10 >>>>> -> Data_node_0 etc.). Is that >>>>> correct? Instead I would like >>>>> to use a slightly more >>>>> flexible solution by the help >>>>> of this modulo function for >>>>> the host mapping. >>>>> >>>>> I would be really grateful if >>>>> you could give me a hint for >>>>> the scheduling implementation. >>>>> I try to go deeper through the >>>>> code meanwhile. >>>>> >>>>> Best regards and thank you in >>>>> advance >>>>> Philipp >>>>> >>>>> >>>>> Am 14.03.2018 um 08:06 schrieb >>>>> Philipp Krause: >>>>>> Thank you very much for these >>>>>> information! I'll try to >>>>>> implement these two steps and >>>>>> post some updates within the >>>>>> next days! >>>>>> >>>>>> Best regards >>>>>> Philipp >>>>>> >>>>>> 2018-03-13 5:38 GMT+01:00 >>>>>> Alexander Behm >>>>>> >>>>> >: >>>>>> >>>>>> Cool that you working on >>>>>> a research project with >>>>>> Impala! >>>>>> >>>>>> Properly adding such a >>>>>> feature to Impala is a >>>>>> substantial effort, but >>>>>> hacking the code for an >>>>>> experiment or two seems >>>>>> doable. >>>>>> >>>>>> I think you will need to >>>>>> modify two things: (1) >>>>>> the planner to not add >>>>>> exchange nodes, and (2) >>>>>> the scheduler to assign >>>>>> the co-located scan >>>>>> ranges to the same host. >>>>>> >>>>>> Here are a few starting >>>>>> points in the code: >>>>>> >>>>>> 1) DistributedPlanner >>>>>> https://github.com/apache/impala/blob/master/fe/src/main/java/org/apache/impala/planner/DistributedPlanner.java#L318 >>>>>> >>>>>> >>>>>> The first condition >>>>>> handles the case where no >>>>>> exchange nodes need to be >>>>>> added because the join >>>>>> inputs are already >>>>>> suitably partitioned. >>>>>> You could hack the code >>>>>> to always go into that >>>>>> codepath, so no exchanges >>>>>> are added. >>>>>> >>>>>> 2) The scheduler >>>>>> https://github.com/apache/impala/blob/master/be/src/scheduling/scheduler.cc#L226 >>>>>> >>>>>> >>>>>> You'll need to dig >>>>>> through and understand >>>>>> that code so that you can >>>>>> make the necessary >>>>>> changes. Change the scan >>>>>> range to host mapping to >>>>>> your liking. The rest of >>>>>> the code should just work. >>>>>> >>>>>> Cheers, >>>>>> >>>>>> Alex >>>>>> >>>>>> >>>>>> On Mon, Mar 12, 2018 at >>>>>> 6:55 PM, Philipp Krause >>>>>> >>>>> > >>>>>> wrote: >>>>>> >>>>>> Thank you very much >>>>>> for your quick answers! >>>>>> The intention behind >>>>>> this is to improve >>>>>> the execution time >>>>>> and (primarily) to >>>>>> examine the impact of >>>>>> block-co-location >>>>>> (research project) >>>>>> for this particular >>>>>> query (simplified): >>>>>> >>>>>> select A.x, B.y, A.z >>>>>> from tableA as A >>>>>> inner join tableB as >>>>>> B on A.id=B.id >>>>>> >>>>>> The "real" query >>>>>> includes three joins >>>>>> and the data size is >>>>>> in pb-range. >>>>>> Therefore several >>>>>> nodes (5 in the test >>>>>> environment with less >>>>>> data) are used >>>>>> (without any load >>>>>> balancer). >>>>>> >>>>>> Could you give me >>>>>> some hints what code >>>>>> changes are required >>>>>> and which files are >>>>>> affected? I don't >>>>>> know how to give >>>>>> Impala the >>>>>> information that it >>>>>> should only join the >>>>>> local data blocks on >>>>>> each node and then >>>>>> pass it to the >>>>>> "final" node which >>>>>> receives all >>>>>> intermediate results. >>>>>> I hope you can help >>>>>> me to get this >>>>>> working. That would >>>>>> be awesome! >>>>>> >>>>>> Best regards >>>>>> Philipp >>>>>> >>>>>> Am 12.03.2018 um >>>>>> 18:38 schrieb >>>>>> Alexander Behm: >>>>>>> I suppose one >>>>>>> exception is if your >>>>>>> data lives only on a >>>>>>> single node. Then >>>>>>> you can set >>>>>>> num_nodes=1 and make >>>>>>> sure to send the >>>>>>> query request to the >>>>>>> impalad running on >>>>>>> the same data node >>>>>>> as the target data. >>>>>>> Then you should get >>>>>>> a local join. >>>>>>> >>>>>>> On Mon, Mar 12, 2018 >>>>>>> at 9:30 AM, >>>>>>> Alexander Behm >>>>>>> >>>>>> > >>>>>>> wrote: >>>>>>> >>>>>>> Such a specific >>>>>>> block >>>>>>> arrangement is >>>>>>> very uncommon >>>>>>> for typical >>>>>>> Impala setups, >>>>>>> so we don't >>>>>>> attempt to >>>>>>> recognize and >>>>>>> optimize this >>>>>>> narrow case. In >>>>>>> particular, such >>>>>>> an arrangement >>>>>>> tends to be >>>>>>> short lived if >>>>>>> you have the >>>>>>> HDFS balancer >>>>>>> turned on. >>>>>>> >>>>>>> Without making >>>>>>> code changes, >>>>>>> there is no way >>>>>>> today to remove >>>>>>> the data >>>>>>> exchanges and >>>>>>> make sure that >>>>>>> the scheduler >>>>>>> assigns scan >>>>>>> splits to nodes >>>>>>> in the desired >>>>>>> way (co-located, >>>>>>> but with >>>>>>> possible load >>>>>>> imbalance). >>>>>>> >>>>>>> In what way is >>>>>>> the current >>>>>>> setup >>>>>>> unacceptable to >>>>>>> you? Is this >>>>>>> pre-mature >>>>>>> optimization? If >>>>>>> you have certain >>>>>>> performance >>>>>>> expectations/requirements >>>>>>> for specific >>>>>>> queries we might >>>>>>> be able to help >>>>>>> you improve >>>>>>> those. If you >>>>>>> want to pursue >>>>>>> this route, >>>>>>> please help us >>>>>>> by posting >>>>>>> complete query >>>>>>> profiles. >>>>>>> >>>>>>> Alex >>>>>>> >>>>>>> On Mon, Mar 12, >>>>>>> 2018 at 6:29 AM, >>>>>>> Philipp Krause >>>>>>> >>>>>> > >>>>>>> wrote: >>>>>>> >>>>>>> Hello everyone! >>>>>>> >>>>>>> In order to >>>>>>> prevent >>>>>>> network >>>>>>> traffic, I'd >>>>>>> like to >>>>>>> perform >>>>>>> local joins >>>>>>> on each node >>>>>>> instead of >>>>>>> exchanging >>>>>>> the data and >>>>>>> perform a >>>>>>> join over >>>>>>> the complete >>>>>>> data >>>>>>> afterwards. >>>>>>> My query is >>>>>>> basically a >>>>>>> join over >>>>>>> three three >>>>>>> tables on an >>>>>>> ID >>>>>>> attribute. >>>>>>> The blocks >>>>>>> are >>>>>>> perfectly >>>>>>> distributed, >>>>>>> so that e.g. >>>>>>> Table A - >>>>>>> Block 0  and >>>>>>> Table B - >>>>>>> Block 0  are >>>>>>> on the same >>>>>>> node. These >>>>>>> blocks >>>>>>> contain all >>>>>>> data rows >>>>>>> with an ID >>>>>>> range [0,1]. >>>>>>> Table A - >>>>>>> Block 1  and >>>>>>> Table B - >>>>>>> Block 1 with >>>>>>> an ID range >>>>>>> [2,3] are on >>>>>>> another node >>>>>>> etc. So I >>>>>>> want to >>>>>>> perform a >>>>>>> local join >>>>>>> per node >>>>>>> because any >>>>>>> data >>>>>>> exchange >>>>>>> would be >>>>>>> unneccessary >>>>>>> (except for >>>>>>> the last >>>>>>> step when >>>>>>> the final >>>>>>> node >>>>>>> recevieves >>>>>>> all results >>>>>>> of the other >>>>>>> nodes). Is >>>>>>> this possible? >>>>>>> At the >>>>>>> moment the >>>>>>> query plan >>>>>>> includes >>>>>>> multiple >>>>>>> data >>>>>>> exchanges, >>>>>>> although the >>>>>>> blocks are >>>>>>> already >>>>>>> perfectly >>>>>>> distributed >>>>>>> (manually). >>>>>>> I would be >>>>>>> grateful for >>>>>>> any help! >>>>>>> >>>>>>> Best regards >>>>>>> Philipp Krause >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>> >>>> >>> >>> >>> >>> >>> >>> >> >> > > --------------E5A2BAACD9533D10FC92747D Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit

To prevent the broadcast join I could simply use the shuffle operator in the query:

SELECT * FROM business_partition_1 INNER JOIN [SHUFFLE] business_partition_2 WHERE business_partition_1.businessid=business_partition_2.businessid

I think the broadcast is currently only used because of my very small test tables.

This gives me the plan attached as partitioned_shuffle.png. Since my modified version isn't working yet, I partitioned both tables on businessid in Impala. The "hack" should only help to get into the if-condition if I partition the data manually, right?. But in this case (if the partitioning is done by Impala itself) Impala should get into the if-condition anyway. Unfortunately I can't see a difference in the plan compared to my unpartitioned tables (unpartitioned.png) concerning the exchange nodes. My goal is actually to get rid of all exchange nodes since the corresponding data is already present on each node. Actually the plan should look the same except for the 03 and 04 exchange then.

Are there other changes neccessary to just take Table1-partition/block X and Table2-partition/block Y on each node and join them without any data exchange? Actually each node should take all its local blocks for both tables, join them and pass the results back to the coordinator where all results come together (please see explanation.png).

I'm looking forward hearing from you. I hope we can realise this.

Best regards
Philipp


Am 24.04.2018 um 07:03 schrieb Alexander Behm:
On Mon, Apr 23, 2018 at 7:24 PM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:

Hi Alex,
thanks for the information! I've compiled the cdh5.13.1-release and replaced impala-frontend-0.1-SNAPSHOT.jar (which seems to include the changes in the DistributedPlanner.java). There still seems to to be a method missing after replacing the jar but I'll try to figure that out.

I have two questions concerning the code fragment in the DistributedPlanner.java you pointed to me.

First:
The attached graphic shows the query plan for two tables which are partitioned on the join attribute (standard impala version without any changes). If I change the if-condition to true for my modified version I expect to get the same result for my "hand made" partitions (outside of impala). But why is there an exchange broadcast (even in the standard version)? I mean, if I have a partition of Table 1 with ID=0 on Node X why is there a broadcast of the partition of Table 2 with ID=0 on Node Y? Actually this partition only has to be sent to Node X where the matching partition of Table 1 is located (instead of sending it to all nodes (broadcast)). Or is this exactly the case and it's only shown as a broadcast here in the graphics?


You are reading the plan correctly. Impala simply does not implement that optimization.


Second:
All corresponding blocks of the partitioned tables are on the same node (e.g. Table 1 Partition with ID=0, Table 2 Partition with ID=0 => Node 1 etc.). This is what I did manually. As already mentioned before I want to join these partitions (blocks) locally on each node. But if I'm correct, the modification in the DistributedPlanner will also only lead to the plan in the attached graphic so that no further exchanges are created if I use my "hand made" partitions. But there is still the broadcast exchange which distributes the partitions across the cluster which isn't neccessary because all needed blocks are already on the same node and are ready to get joined locally. Is there a way to realise that and get rid of the broadcast exchange?

You are right. That hack in DistributedPlanner only works for partitioned hash joins. You can probably stitch the plan together at an earlier place, e.g.:
 

Please correct me if I'm wrong with my assumptions.

Thank you very much!

Best regards
Philipp







Am 18.04.2018 um 07:16 schrieb Alexander Behm:
Your CM-managed cluster must be running a "compatible" Impala version already for this trick to work. It looks like your catalog binary is trying to find a method which does not exist in the .jar, presumably because your .jar is built based on a different version of Impala where that method does not exist anymore.

It looks like you have CDH 5.13.3 installed. CDH 5.13.3 is based on Impala 2.10, see:

That means this binary copying trick will only work with a modified version of Impala 2.10, and very likely will not work with a different version.

It's probably easier to test with the mini cluster first. Alternatively, it "might" work if you replace all the binaries mentioned above, but it's quite possible that will not work.

On Sun, Apr 15, 2018 at 7:13 PM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:

Hi Alex! Thank you for the list! The build of the modified cdh5-trunk branch (debug mode) was sucessfull. After replacing "impala-frontend-0.1-SNAPSHOT.jar" in /opt/cloudera/parcels/CDH-5.13.1-1.cdh5.13.1.p0.2/jars/ I got the following error in my existing cluster:
F0416 01:16:45.402997 17897 catalog.cc:69] NoSuchMethodError: getCatalogObjects
When I switch back to the original jar file the error is gone. So it must be something wrong with this file I guess. But I wonder about the error in catalog.cc because I didn't touch any .cc files.

I also replaced "impala-data-source-api-1.0-SNAPSHOT.jar". The other jar files do not exist in my impala installation (CDH-5.13.1).

What am I doing wrong?

Best regards
Philipp


Am 13.04.2018 um 20:12 schrieb Alexander Behm:
Here's the foll list. It might not be minimal, but copying/overwriting these should work.

debug/service/impalad
debug/service/libfesupport.so
debug/service/libService.a
release/service/impalad
release/service/libfesupport.so
release/service/libService.a
yarn-extras-0.1-SNAPSHOT.jar
impala-data-source-api-1.0-SNAPSHOT-sources.jar
impala-data-source-api-1.0-SNAPSHOT.jar
impala-frontend-0.1-SNAPSHOT-tests.jar
impala-frontend-0.1-SNAPSHOT.jar
libkudu_client.so.0.1.0
libstdc++.so.6.0.20
impala-no-sse.bc
impala-sse.bc
libimpalalzo.so

If you are only modifying the Java portion (like DistributedPlanner), then only copying/replacing the *.jar files should be sufficient.

On Fri, Apr 13, 2018 at 11:00 AM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:
Yes, I have a running (virtual) cluster. I would try to follow your way with the custom impala build (DistributedPlanner.java is the only modified file at the moment). Thank you in advance for the file list! 

Best regards 
Philipp

Alexander Behm <alex.behm@cloudera.com> schrieb am Fr., 13. Apr. 2018, 18:45:
I'm not really following your installation/setup and am not an expert on Cloudera Manager installation/config. If you are going to build Impala anyway, it's probably easiest to test on Impala's minicluster first.

In general, if you have a running Cloudera Managed cluster, you can deploy a custom Impala build by simply overwriting the Impala existing binaries and jars with the new build. If you want to go this route, I can give you a full list of files you need to replace.

On Tue, Apr 10, 2018 at 11:44 AM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:
Thank you for the explanation! Yes, I'm using HDFS. The single replica setup is only for test purposes at the moment. I think this makes it easier to gain some first results since less modifications (scheduler etc.) are neccessary.
I would like to test the DistributedPlanner modification in my virtual cluster. I used a customized Vagrant script to install Impala on multiple hosts (s.attachment). It simply installs cloudera-manager-server-db, cloudera-manager-server and cloudera-manager-daemons via apt-get. What would be the simplest solution to setup my modified version? Could I simply call ./buildall.sh and change the script to sth. like this?

echo "Install java..."
apt-get -q -y --force-yes install oracle-j2sdk1.7
echo "Download impala..."
wget https://... where I uploaded my modified version
echo "Extract impala..."
tar -xvzf Impala-cdh5-trunk.tar.gz
cd Impala-cdh5-trunk
echo "Build impala..."
./buildall.sh
echo "Start impala instances..."
service cloudera-scm-server-db initdb
service cloudera-scm-server-db start
service cloudera-scm-server start

Or is there another, maybe even easier method, to test the code? Maybe via bootstrap_development.sh / minicluster? 

Best regards
Philipp

2018-04-05 18:39 GMT+02:00 Alexander Behm <alex.behm@cloudera.com>:
Apologies for the late response. Btw, your previous post was clear enough to me, so no worries :)


On Wed, Apr 4, 2018 at 7:46 AM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:
Hello Alex,

I think my previous post has been too long and confusing. I apologize for that!

If replicas are completely deactivated, all scan ranges of a block are mapped to the one host, where the block is located on. This host is the "executor"/reader for all the scan ranges of this block. Is that correct?

Yes, assuming you are using HDFS.
 

I tried to visualize my understanding of the scan_range to host mapping for my use case (s. attachment). Could you please have a quick look at it and tell me if this is correct?

"The existing scan range assignment is scan-node centric. For each scan node, we independently decide which of its scan ranges should be processed by which host."
Without replicas, all scan ranges of a block would be assigend to the same host where this block is located on. Isn't everything local here, so that Table_A - Block_0 and Table_B - Block_0 can be joined local or are further steps neccessary? The condition in the DistributedPlanner you pointed to me is set to false (no exchange nodes).

"You want it to be host-centric. For each host, collect the local scan ranges of *all* scan nodes, and assign them to that host."
Wouldn't the standard setup from above work? Wouldn't I assign all (the same) scan ranges to each host in this case here?

The standard setup works only in if every block only has exactly one replica. For our purposes, that is basically never the case (who would store production data without replication?), so the single-replica assumption was not clear to me.

Does your current setup (only changing the planner and not the scheduler) produce the expected results?



Thank you very much!

Best regards
Philipp

2018-03-28 21:04 GMT+02:00 Philipp Krause <philippkrause.mail@googlemail.com>:

Thank you for your answer and sorry for my delay!

If my understanding is correct, the list of scan nodes consists of all nodes which contain a *local* block from a table that is needed for the query (Assumption: I have no replicas in my first tests). If TableA-Block0 is on Node_0, isn't Node_0 automatically a scan node? And wouldn't this scan node always be the host for the complete scan range(s) then?

"For each scan node, we independently decide which of its scan ranges should be processed by which host."

https://github.com/cloudera/Impala/blob/cdh5-trunk/be/src/scheduling/scheduler.cc#L532
// Loop over all scan ranges, select an executor for those with local impalads and
// collect all others for later processing.

So in this whole block, scan ranges are assigned to the closest executor (=host?). But isn't the closest executor always the node the block is located on (assumed impalad is installed and I have no replicas)? And isn't this node always a scan node at the same time? Otherwise a thread on a remote host had to read the corresponding scan range, which would be more expensive. The only exception I can think of is when all threads on the local node are busy. Or, if I use replicas and all other threads of my node with the "original" block are busy, a thread on another node which contains a replica could read a special scan range of its local block. Is my understanding correct here?

Aren't all scan ranges read locally by its scan nodes if I have impalad installed on all nodes? And am I right, that the scan range is only based on its length which refers to maxScanRangeLength in computeScanRangeLocations?
https://github.com/cloudera/Impala/blob/cdh5-trunk/fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java#L721

I hope you can help me with the scan node <-> scan range->host relationship. If I have Table_A-Block_0 and Table_B_Block_0 on the same node (which I want to join locally), I don't get the point of why scan ranges could be assigned to another host in my scenario.

Best regads and thank you very much!
Philipp Krause


Am 21.03.2018 um 05:21 schrieb Alexander Behm:
Thanks for following up. I think I understand your setup.

If you want to not think about scan ranges, then you can modify HdfsScanNode.computeScanRangeLocations(). For example, you could change it to produce one scan range per file or per HDFS block. That way you'd know exactly what a scan range corresponds to.

I think the easiest/fastest way for you to make progress is to re-implement the existing scan range assignment logic in that place in the code I had pointed you to. There is no quick fix to change the existing behavior.
The existing scan range assignment is scan-node centric. For each scan node, we independently decide which of its scan ranges should be processed by which host.

I believe an algorithm to achieve your goal would look completely different. You want it to be host-centric. For each host, collect the local scan ranges of *all* scan nodes, and assign them to that host.

Does that make sense?

Alex


On Mon, Mar 19, 2018 at 1:02 PM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:

I'd like to provide a small example for our purpose. The last post may be a bit confusing, so here's a very simple example in the attached pdf file. I hope, it's understandable. Otherwise, please give me a short feedback.

Basically, I only want each data node to join all it's local blocks. Is there a range mapping needed or is it possible to easily join all local blocks (regardless of its content) since everything is already "prepared"? Maybe you can clarify this for me.

As you can see in the example, the tables are not partitioned by ID. The files are manually prepared by the help of the modulo function. So I don't have a range like [0,10], but something like 0,5,10,15 etc.

I hope, I didn't make it too complicated and confusing. I think, the actual idea behind this is really simple and I hope you can help me to get this working.

Best regards and thank you very much for your time!
Philipp


Am 18.03.2018 um 17:32 schrieb Philipp Krause:

Hi! At the moment the data to parquet (block) mapping is based on a simple modulo function: Id % #data_nodes. So with 5 data nodes all rows with Id's 0,5,10,... are written to Parquet_0, Id's 1,4,9 are written to Parquet_1 etc. That's what I did manually. Since the parquet file size and the block size are both set to 64MB, each parquet file will result in one block when I transfer the parquet files to HDFS. By default, HDFS distributes the blocks randomly. For test purposes I transferred corresponding blocks from Table_A and Table_B to the same data node (Table_A - Block_X with Id's 0,5,10 and Table_B - Block_Y with Id's 0,5,10). In this case, they are transferred to data_node_0 because the modulo function (which I want to implement in the scheduler) returns 0 for these Id's. This is also done manually at the moment.

1.) DistributedPlanner: For first, upcoming tests I simply changed the first condition in the DistributedPlanner to true to avoid exchange nodes.

2.) The scheduler: That's the part I'm currently struggling with. For first tests, block replication is deactivated. I'm not sure how / where to implement the modulo function for scan range to host mapping. Without the modulo function, I had to implement a hard coded mapping (something like "range" 0-0, 5-5, 10-10 -> Data_node_0 etc.). Is that correct? Instead I would like to use a slightly more flexible solution by the help of this modulo function for the host mapping.

I would be really grateful if you could give me a hint for the scheduling implementation. I try to go deeper through the code meanwhile.

Best regards and thank you in advance
Philipp


Am 14.03.2018 um 08:06 schrieb Philipp Krause:
Thank you very much for these information! I'll try to implement these two steps and post some updates within the next days!

Best regards
Philipp

2018-03-13 5:38 GMT+01:00 Alexander Behm <alex.behm@cloudera.com>:
Cool that you working on a research project with Impala!

Properly adding such a feature to Impala is a substantial effort, but hacking the code for an experiment or two seems doable.

I think you will need to modify two things: (1) the planner to not add exchange nodes, and (2) the scheduler to assign the co-located scan ranges to the same host.

Here are a few starting points in the code:

1) DistributedPlanner

The first condition handles the case where no exchange nodes need to be added because the join inputs are already suitably partitioned.
You could hack the code to always go into that codepath, so no exchanges are added.

2) The scheduler

You'll need to dig through and understand that code so that you can make the necessary changes. Change the scan range to host mapping to your liking. The rest of the code should just work.

Cheers,

Alex


On Mon, Mar 12, 2018 at 6:55 PM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:

Thank you very much for your quick answers!
The intention behind this is to improve the execution time and (primarily) to examine the impact of block-co-location (research project) for this particular query (simplified):

select A.x, B.y, A.z from tableA as A inner join tableB as B on A.id=B.id

The "real" query includes three joins and the data size is in pb-range. Therefore several nodes (5 in the test environment with less data) are used (without any load balancer).

Could you give me some hints what code changes are required and which files are affected? I don't know how to give Impala the information that it should only join the local data blocks on each node and then pass it to the "final" node which receives all intermediate results. I hope you can help me to get this working. That would be awesome!

Best regards
Philipp

Am 12.03.2018 um 18:38 schrieb Alexander Behm:
I suppose one exception is if your data lives only on a single node. Then you can set num_nodes=1 and make sure to send the query request to the impalad running on the same data node as the target data. Then you should get a local join.

On Mon, Mar 12, 2018 at 9:30 AM, Alexander Behm <alex.behm@cloudera.com> wrote:
Such a specific block arrangement is very uncommon for typical Impala setups, so we don't attempt to recognize and optimize this narrow case. In particular, such an arrangement tends to be short lived if you have the HDFS balancer turned on.

Without making code changes, there is no way today to remove the data exchanges and make sure that the scheduler assigns scan splits to nodes in the desired way (co-located, but with possible load imbalance).

In what way is the current setup unacceptable to you? Is this pre-mature optimization? If you have certain performance expectations/requirements for specific queries we might be able to help you improve those. If you want to pursue this route, please help us by posting complete query profiles.

Alex

On Mon, Mar 12, 2018 at 6:29 AM, Philipp Krause <philippkrause.mail@googlemail.com> wrote:
Hello everyone!

In order to prevent network traffic, I'd like to perform local joins on each node instead of exchanging the data and perform a join over the complete data afterwards. My query is basically a join over three three tables on an ID attribute. The blocks are perfectly distributed, so that e.g. Table A - Block 0  and Table B - Block 0  are on the same node. These blocks contain all data rows with an ID range [0,1]. Table A - Block 1  and Table B - Block 1 with an ID range [2,3] are on another node etc. So I want to perform a local join per node because any data exchange would be unneccessary (except for the last step when the final node recevieves all results of the other nodes). Is this possible?
At the moment the query plan includes multiple data exchanges, although the blocks are already perfectly distributed (manually).
I would be grateful for any help!

Best regards
Philipp Krause




















--------------E5A2BAACD9533D10FC92747D-- --------------465607BF9EAB042B8F8A534B Content-Type: image/png; name="partitioned_shuffle.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="partitioned_shuffle.png" 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 --------------465607BF9EAB042B8F8A534B Content-Type: image/png; name="unpartitioned.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="unpartitioned.png" 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 /875OYjFEafqAAAAAElFTkSuQmCC --------------465607BF9EAB042B8F8A534B Content-Type: image/png; name="explanation.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="explanation.png" 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 NQeAiyG86CLCWGzZurHaAHA9hBcDiDAAAFiD8GIYEQYAAIsRXowiwgAAYBnCi0eIMAAAWIDw 4okYYRBkAAAwHeHFJEQYAABMR3gxFREGAAATEV7MQIQBAMAUhBfzEGEAAPAU4cVsMcIgyBj2 +6d/3n388VdKa62+/fa3z/nry7dYGos+fPnX5/7x/d0v33/3KQDANRBeLBRPTV0gSeGFjyQs aAjBhE9X4cXHbx9iIEJ4AQBXQ3ixXIwwCDIqFl78+9vHf959+qlcH0D4DzCq8OLTD1fn1z8I LwDgeggv1iLCqFh48fPX9Gcfzt8/PvziI4k6vPjpAwt3SXgBAFdDeLEBPsbI5nx64UpdtW+/ fSG8AICLIbzYDEGGZ+FFSFjQkDJ74YWPPD58zD+lAQC4BMKLjd05yPgeX7v/cQovfICh1VD0 MBBehD9GIbwAgGshvNhFOlZ1DQDAnRBe7IggAwBwT4QXRyDOAADcCuHFcQgyAAA3QXjxAsQZ AIBrI7x4mRRkEGcAAC6G8OL1iDMAABdDeNEQ4gwAwDUQXrSojDMINQAAp0N40TpCDQDA6RBe nMmpQ43TTRgAsBjhxYmVoUazh3f7MwQAbI7w4iLKUzx+qeBF2pkJAOB4hBfXVJ7uxxzwnRHd lwoAAPdDeHF9nVPffalghU6H8UtlAIDbI7y4nU5MsPhL3QEA0EN4AQAANkZ4AQAANkZ4AQAA NkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAA NkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAA NkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAA NkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAA NkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAANkZ4AQAA NkZ4AQAANkZ4AQAANvXff/8HjBqs30pik9cAAAAASUVORK5CYII= --------------465607BF9EAB042B8F8A534B--