Sergey Shelukhin created HIVE-11587: ---------------------------------------
Summary: Fix memory estimates for mapjoin hashtable Key: HIVE-11587 URL: https://issues.apache.org/jira/browse/HIVE-11587 Project: Hive Issue Type: Bug Reporter: Sergey Shelukhin Assignee: Wei Zheng Due to the legacy in in-memory mapjoin and conservative planning, the memory estimation code for mapjoin hashtable is currently not very good. It allocates the probe erring on the side of more memory, not taking data into account because unlike the probe, it's free to resize, so it's better for perf to allocate big and hope for the best on data size. It is not true for hybrid case. There's code to cap the initial allocation based on memory available (memSize argument), but due to some code rot, the memory estimates from planning are not even passed to hashtable anymore (there used to be two config settings, hashjoin size fraction by itself, or hashjoin size fraction for group by case), so it never caps the memory anymore below 1 Gb. Initial capacity is estimated from input key count, and in hybrid join cache can exceed Java memory due to number of segments. There needs to be a review and fix of all this code. Suggested improvements: 1) Make sure "initialCapacity" argument from Hybrid case is correct given the number of segments. See how it's calculated from keys for regular case; it needs to be adjusted accordingly for hybrid case if not done already. 2) Rename memSize to maxProbeSize, or something, make sure it's passed correctly based on estimates that take into account both probe and data size, esp. in hybrid case. 3) Cap single write buffer size to 8-16Mb. 4) For hybrid, don't pre-allocate WBs - only pre-allocate on write. 5) Change everywhere rounding up to power of two is used to rounding down, at least for hybrid case (?) -- This message was sent by Atlassian JIRA (v6.3.4#6332)