Hive/Tez使用LATERAL VIEW时出现OOM问题求助
Hey there, let’s dig into this Tez/Hive OOM issue you’re hitting with that heavy LATERAL VIEW query. I’ve troubleshooted similar scenarios on HDP 2.6 before, so here are targeted fixes and optimizations to try out:
First: Fix the Bucketing Bottleneck (Critical!)
Your e table only has 1 bucket—this is a major culprit. 800 million rows all crammed into a single Map task, plus the explosion of data from parsing 80 JSON fields via LATERAL VIEW, is guaranteed to blow out memory. Here’s how to fix it:
- Re-bucket the
etable using the same bucket column as your other tables, into a number that aligns with your cluster resources (aim for at least 32 buckets for 8 x 32GB nodes):ALTER TABLE e CLUSTERED BY (your_shared_bucket_column) INTO 32 BUCKETS; INSERT OVERWRITE TABLE e SELECT * FROM e; - Adjust the
contacttable’s bucket count to be a multiple ofe’s (e.g., ifeis 32 buckets, setcontactto 32 too) to enable Bucketed Map Joins. This eliminates expensive shuffles and splits work across multiple Map tasks naturally.
Split LATERAL VIEW Processing to Reduce Memory Load
Parsing 80 fields in one go is overwhelming for a single Map task. Break this into two stages to lighten the load:
- First Stage: Filter Early
Create a temporary ORC table that only parses the JSON fields you need for filtering, then drops invalid or unneeded rows. This reduces the data volume before you parse all 80 fields:CREATE TABLE temp_filtered_data STORED AS ORC CLUSTERED BY (your_bucket_col) INTO 32 BUCKETS AS SELECT base.*, jt.filter_field1, jt.filter_field2 FROM ( SELECT * FROM e LEFT JOIN m ON ... LEFT JOIN c ON ... LEFT JOIN contact ON ... ) base LATERAL VIEW json_tuple(base.json_col, 'filter_field1', 'filter_field2') jt AS filter_field1, filter_field2 WHERE jt.filter_field1 IS NOT NULL -- Drop rows with invalid JSON AND jt.filter_field2 > 100; -- Apply business filters - Second Stage: Parse Remaining Fields
Now read from the filtered temp table and parse the full set of 80 fields—your Map tasks will only handle pre-filtered, smaller data chunks:SELECT temp.*, jt.* FROM temp_filtered_data temp LATERAL VIEW json_tuple(temp.json_col, 'f1', 'f2', ..., 'f80') jt AS f1, f2, ..., f80;
Tune Tez/MapReduce Memory Parameters for Map Tasks
You’ve tried some parameters, but let’s target Map task memory specifically for your 32GB nodes:
- Set container sizes to balance parallelism and memory per task (8GB per container lets each node run 3-4 tasks):
SET tez.container.size=8192; SET tez.java.opts=-Xmx6144m; -- Allocate 75% of container memory to heap to avoid OOM SET mapreduce.map.memory.mb=8192; SET mapreduce.map.java.opts=-Xmx6144m; - Force Tez to split data into smaller Map tasks:
SET tez.grouping.min-size=64MB; -- Minimum data per Map task SET tez.grouping.max-size=128MB; -- Maximum data per Map task SET tez.grouping.split-count=100; -- Ensure at least 100 Map tasks are created - Disable auto-tuning that might be overriding your settings:
SET tez.auto.reducer.parallelism=false; SET tez.task.resource.memory.mb=8192;
Handle Data Skew (If Applicable)
If some JSON rows explode into way more data than others, enable skew handling to prevent hotspots:
SET hive.optimize.skewjoin=true; SET hive.skewjoin.key=100000; -- Trigger skew handling when a key has >100k rows SET hive.skewjoin.mapjoin.map.tasks=100; -- Split skew tasks into 100 smaller MapJoins
If bucketing doesn’t evenly distribute data, add a DISTRIBUTED BY rand() in your base query to shuffle rows across Map tasks:
SELECT * FROM ( SELECT * FROM e LEFT JOIN m ON ... LEFT JOIN c ON ... LEFT JOIN contact ON ... DISTRIBUTED BY rand() -- Randomly spread data to avoid large Map tasks ) base_data LATERAL VIEW json_tuple(...) jt AS ...;
Optimize ORC Table Performance
Make sure your ORC tables are configured to minimize memory overhead during reads:
SET hive.exec.orc.compression.strategy=COMPRESSION; SET hive.exec.orc.block.size=256MB; -- Larger blocks reduce IO without overwhelming Map tasks SET hive.exec.orc.stripe.size=64MB;
Also update table statistics so Hive can generate better execution plans:
ANALYZE TABLE e COMPUTE STATISTICS; ANALYZE TABLE contact COMPUTE STATISTICS;
Start with the bucketing fix—it’s the most impactful. Then split the LATERAL VIEW into stages, and tweak memory parameters as needed. This should get your query running without OOM errors.
内容的提问来源于stack exchange,提问作者Guillaume

