do you set your mapred.child.java.opts in hadoop/conf/mapred-site.xml? 在 2012年4月26日 上午8:59,Mark Grover <mgro...@oanda.com>写道:
> I am hoping that other people who have used Map Join can pitch in here... > > When the smaller table gets loaded into mapper's memory, the data is > loaded in its uncompressed form, right? > > If so, is it possible at all in this case that the compressed size of > smaller table is less than the memory available but the uncompressed size > isn't? > > Mark > > Mark Grover, Business Intelligence Analyst > OANDA Corporation > > www: oanda.com www: fxtrade.com > e: mgro...@oanda.com > > "Best Trading Platform" - World Finance's Forex Awards 2009. > "The One to Watch" - Treasury Today's Adam Smith Awards 2009. > > > ----- Original Message ----- > From: "Ruben de Vries" <ruben.devr...@hyves.nl> > To: user@hive.apache.org > Sent: Wednesday, April 25, 2012 3:48:46 AM > Subject: RE: When/how to use partitions and buckets usefully? > > I already tried running with that set to 400mb, but it didn’t work and > that setting is only used when it’s trying to automatically figure out if > it should be doing a mapjoin, while I’m forcing it to do a mapjoin with a > hint > > From: gemini alex [mailto:gemini5201...@gmail.com] > Sent: Wednesday, April 25, 2012 9:40 AM > To: user@hive.apache.org > Subject: Re: When/how to use partitions and buckets usefully? > > there should be documented in wiki on LanguageManual+Joins . > 在 2012年4月25日 下午3:36,gemini alex <gemini5201...@gmail.com>写道: > it's seemed you use the default hive configuration, the default map join > will have only 25M for small table, copy your hive-default.xml to > hive-site.xml and set hive.mapjoin.smalltable.filesize=300000000 > 在 2012年4月25日 上午12:09,Ruben de Vries <ruben.devr...@hyves.nl>写道: > > I got the (rather big) log here in a github gist: > https://gist.github.com/2480893 > And I also attached the plan.xml it was using to the gist. > > When loading the members_map (11mil records, 320mb, 30b per record), it > seems to take about 198b per record in the members_map, resulting in > crashing around 7mil records with 1.4gb loaded. > > The members_map is a TEXTFILE with (member_id INT, gender INT, birthday > STRING) where > - birthday is a string containing YYYY-MM-DD > - gender is a tinyint, 1 2 or 3 > - member_id is int with the highest member_id being 14343249 (14mil) > > The log says: > "INFO hive.log: DDL: struct members_map { i32 member_id, i32 gender, > string birthdate}" > > I also tried doing the same thing but with an empty visit_stats table, > with the same effect > Some of the blogs I read talk about 25mb small table, not 300mb like mine > ... > > Anyone can make anything out of this? > I'd rather go with this if at all possible, > otherwise I have to go the hard way and migrate all the visit_stats into > buckets so they can match the members_map on that? > > -----Original Message----- > From: Bejoy Ks [mailto:bejoy...@yahoo.com] > Sent: Tuesday, April 24, 2012 3:58 PM > To: user@hive.apache.org > Subject: Re: When/how to use partitions and buckets usefully? > > Hi Ruben > The operation you are seeing in your log is preparation of hash table > of the smaller table, This hash table file is compressed and loaded into > Distributed Cache and from there it is used for map side joins. From your > console log the hash table size/data size has gone to nearly 1.5 GB, the > data is large to be loaded into memory of the hive client. > > 2012-04-24 10:31:02 Processing rows: 7000000 Hashtable size: > 6999999 Memory usage: 1,468,378,760 rate: 0.788 > > > Can you enable debug logging and post in the console to get a better > picture why it consumes this much memory. > Start your hive shell as > hive -hiveconf hive.root.logger=ALL,console; > > > Regards > Bejoy KS > > > > ________________________________ > From: Ruben de Vries <ruben.devr...@hyves.nl> > To: "user@hive.apache.org" <user@hive.apache.org> > Sent: Tuesday, April 24, 2012 4:58 PM > Subject: FW: When/how to use partitions and buckets usefully? > > Here are both tables: > > $ hdfs -count /user/hive/warehouse/hyves_goldmine.db/members_map > 1 1 247231757 > hdfs://localhost:54310/user/hive/warehouse/hyves_goldmine.db/members_map > > $ hdfs -count /user/hive/warehouse/hyves_goldmine.db/visit_stats > 442 441 1091837835 > hdfs://localhost:54310/user/hive/warehouse/hyves_goldmine.db/visit_stats > > The 'work' I'm seeing on console is the loading of the table into memory? > > It seems like it's loading the visit_stats table instead ?! > I tried doing MAPJOIN(visit_stats) but it fails non existing class (my > JSONSerde) . > > > From: Nitin Pawar [mailto:nitinpawar...@gmail.com] > Sent: Tuesday, April 24, 2012 11:46 AM > To: user@hive.apache.org > Subject: Re: When/how to use partitions and buckets usefully? > > This operation is erroring out on the hive client itself before starting a > map so splitting to mappers is out of question. > > can you do a dfs count for the members_map table hdfslocation and tell us > the result? > > On Tue, Apr 24, 2012 at 2:06 PM, Ruben de Vries <ruben.devr...@hyves.nl> > wrote: > Hmm I must be doing something wrong, the members_map table is 300ish MB. > When I execute the following query: > > SELECT > /*+ MAPJOIN(members_map) */ > date_int, > members_map.gender AS gender, > 'generic', > COUNT( memberId ) AS unique, > SUM( `generic`['count'] ) AS count, > SUM( `generic`['seconds'] ) AS seconds > FROM visit_stats > JOIN members_map ON(members_map.member_id = visit_stats.memberId) > GROUP BY date_int, members_map.gender > > It results in: > 2012-04-24 10:25:59 Starting to launch local task to process map join; > maximum memory = 1864171520 > 2012-04-24 10:26:00 Processing rows: 200000 Hashtable > size: 199999 Memory usage: 43501848 rate: 0.023 > 2012-04-24 10:30:54 Processing rows: 6900000 Hashtable size: > 6899999 Memory usage: 1449867552 rate: 0.778 > 2012-04-24 10:31:02 Processing rows: 7000000 Hashtable size: > 6999999 Memory usage: 1468378760 rate: 0.788 > Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space > > > I'm running it only my local, single node, dev env, could that be a > problem since it won't split over multiple mappers in this case? > > > -----Original Message----- > From: Bejoy Ks [mailto:bejoy...@yahoo.com] > Sent: Tuesday, April 24, 2012 9:47 AM > To: user@hive.apache.org > Subject: Re: When/how to use partitions and buckets usefully? > > Hi Ruben > Map join hint is provided to hive using "MAPJOIN" keyword as : > SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key > > To use map side join some hive configuration properties needs to be enabled > > For plain map side joins > hive>SET hive.auto.convert.join=true; > Latest versions of hive does a map join on the smaller table even if no > map join hit is provided. > > For bucketed map joins > hive>SET hive.optimize.bucketmapjoin=true > > https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins > > > Regards > Bejoy > > > ________________________________ > From: Nitin Pawar <nitinpawar...@gmail.com> > To: user@hive.apache.org > Sent: Tuesday, April 24, 2012 12:46 PM > Subject: Re: When/how to use partitions and buckets usefully? > > If you are doing a map side join make sure the table members_map is small > enough to hold in memory > > On 4/24/12, Ruben de Vries <ruben.devr...@hyves.nl> wrote: > > Wow thanks everyone for the nice feedback! > > > > I can force a mapside join by doing /*+ STREAMTABLE(members_map) */ > right? > > > > > > Cheers, > > > > Ruben de Vries > > > > -----Original Message----- > > From: Mark Grover [mailto:mgro...@oanda.com] > > Sent: Tuesday, April 24, 2012 3:17 AM > > To: user@hive.apache.org; bejoy ks > > Cc: Ruben de Vries > > Subject: Re: When/how to use partitions and buckets usefully? > > > > Hi Ruben, > > Like Bejoy pointed out, members_map is small enough to fit in memory, > > so your joins with visit_stats would be much faster with map-side join. > > > > However, there is still some virtue in bucketing visit_stats. > > Bucketing can optimize joins, group by's and potentially other queries > > in certain circumstances. > > You probably want to keep consistent bucketing columns across all your > > tables so they can leveraged in multi-table queries. Most people use > > some power of 2 as their number of buckets. To make the best use of > > the buckets, each of your buckets should be able to entirely load into > > memory on the node. > > > > I use something close the formula below to calculate the number of > buckets: > > > > #buckets = (x * Average_partition_size) / > > JVM_memory_available_to_your_Hadoop_tasknode > > > > I call x (>1) the "factor of conservatism". Higher x means you are > > being more conservative by having larger number of buckets (and > > bearing the increased overhead), lower x means the reverse. What x to > > use would depend on your use case. This is because the number of buckets > in a table is fixed. > > If you have a large partition, it would distribute it's data into > > bulkier buckets and you would want to make sure these bulkier buckets > > can still fit in memory. Moreover, buckets are generated using a > > hashing function, if you have a strong bias towards a particular value > > of bucketing column in your data, some buckets might be bulkier than > > others. In that case, you'd want to make sure that those bulkier buckets > can still fit in memory. > > > > To summarize, it depends on: > > * How the actual partition sizes vary from the average partition size > (i.e. > > the standard deviation of your partition size). More standard > > deviations means you should be more conservative in your calculation and > vice-versa. > > * Distribution of the data in the bucketing columns. "Wider" > > distribution means you should be more conservative and vice-versa. > > > > Long story short, I would say, x of 2 to 4 should suffice in most > > cases but feel free to verify that in your case:-) I would love to > > hear what factors others have been using when calculating their number > of buckets, BTW! > > Whatever answer you get for #buckets from above formula, use the > > closest power of 2 as the number of buckets in your table (I am not > > sure if this is a must, though). > > > > Good luck! > > > > Mark > > > > Mark Grover, Business Intelligence Analyst OANDA Corporation > > > > www: oanda.com www: fxtrade.com > > e: mgro...@oanda.com > > > > "Best Trading Platform" - World Finance's Forex Awards 2009. > > "The One to Watch" - Treasury Today's Adam Smith Awards 2009. > > > > > > ----- Original Message ----- > > From: "Bejoy KS" <bejoy...@yahoo.com> > > To: "Ruben de Vries" <ruben.devr...@hyves.nl>, user@hive.apache.org > > Sent: Monday, April 23, 2012 12:39:17 PM > > Subject: Re: When/how to use partitions and buckets usefully? > > > > If data is in hdfs, then you can bucket it only after loading into a > > temp/staging table and then to the final bucketed table. Bucketing > > needs a Map reduce job. > > > > > > Regards > > Bejoy KS > > > > Sent from handheld, please excuse typos. > > > > From: Ruben de Vries <ruben.devr...@hyves.nl> > > Date: Mon, 23 Apr 2012 18:13:20 +0200 > > To: user@hive.apache.org<user@hive.apache.org>; > > bejoy...@yahoo.com<bejoy...@yahoo.com> > > Subject: RE: When/how to use partitions and buckets usefully? > > > > > > > > > > Thanks for the help so far guys, > > > > > > > > I bucketed the members_map, it's 330mb in size (11 mil records). > > > > > > > > Can you manually bucket stuff? > > > > Since my initial mapreduce job is still outside of Hive I'm doing a > > LOAD DATA to import stuff into the visit_stats tables, replacing that > > with INSERT OVERWRITE SELECT slows it down a lot > > > > > > > > > > > > From: Bejoy KS [mailto:bejoy...@yahoo.com] > > Sent: Monday, April 23, 2012 6:06 PM > > To: user@hive.apache.org > > Subject: Re: When/how to use partitions and buckets usefully? > > > > > > > > For Bucketed map join, both tables should be bucketed and the number > > of buckets of one should be multiple of other. > > > > > > Regards > > Bejoy KS > > > > Sent from handheld, please excuse typos. > > > > > > > > > > From: "Bejoy KS" < bejoy...@yahoo.com > > > > > > > Date: Mon, 23 Apr 2012 16:03:34 +0000 > > > > > > To: < user@hive.apache.org > > > > > > > ReplyTo: bejoy...@yahoo.com > > > > > > Subject: Re: When/how to use partitions and buckets usefully? > > > > > > > > > > Bucketed map join would be good I guess. What is the total size of the > > smaller table and what is its expected size in the next few years? > > > > The size should be good enough to be put in Distributed Cache, then > > map side joins would offer you much performance improvement. > > > > > > Regards > > Bejoy KS > > > > Sent from handheld, please excuse typos. > > > > > > > > > > From: Ruben de Vries < ruben.devr...@hyves.nl > > > > > > > Date: Mon, 23 Apr 2012 17:38:20 +0200 > > > > > > To: user@hive.apache.org<user@hive.apache.org > > > > > > > ReplyTo: user@hive.apache.org > > > > > > Subject: RE: When/how to use partitions and buckets usefully? > > > > > > > > > > Ok, very clear on the partitions, try to make them match the WHERE > > clauses, not so much about group clauses then ;) > > > > > > > > The member_map contains 11.636.619 records atm, I think bucketing > > those would be good? > > > > What's a good number to bucket them by then? > > > > > > > > And is there any point in bucketing the visit_stats? > > > > > > > > > > > > From: Tucker, Matt [mailto:matt.tuc...@disney.com] > > Sent: Monday, April 23, 2012 5:30 PM > > To: user@hive.apache.org > > Subject: RE: When/how to use partitions and buckets usefully? > > > > > > > > If you're only interested in a certain window of dates for analysis, a > > date-based partition scheme will be helpful, as it will trim > > partitions that aren't needed by the query before execution. > > > > > > > > If the member_map table is small, you might consider testing the > > feasibility of map-side joins, as it will reduce the number of > > processing stages. If member_map is large, bucketing on member_id will > > avoid having as many rows from visit_stats compared to each member_id > for joins. > > > > > > > > > > Matt Tucker > > > > > > > > > > > > From: Ruben de Vries [mailto:ruben.devr...@hyves.nl] > > Sent: Monday, April 23, 2012 11:19 AM > > To: user@hive.apache.org > > Subject: When/how to use partitions and buckets usefully? > > > > > > > > It seems there's enough information to be found on how to setup and > > use partitions and buckets. > > > > But I'm more interested in how to figure out when and what columns you > > should be partitioning and bucketing to increase performance?! > > > > > > > > In my case I got 2 tables, 1 visit_stats (member_id, date and some MAP > > cols which give me info about the visits) and 1 member_map (member_id, > > gender, age). > > > > > > > > Usually I group by date and then one of the other col so I assume that > > partitioning on date is a good start?! > > > > > > > > It seems the join of the member_map onto the visit_stats makes the > > queries a lot slower, can that be fixed by bucketing both tables? Or > just one of them? > > > > > > > > > > Maybe some ppl have written good blogs on this subject but I can't > > really seem to find them!? > > > > > > > > Any help would be appreciated, thanks in advance J > > > > > -- > Nitin Pawar > > > > > -- > Nitin Pawar > > >