diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java index 0a6461f..56c7cdd 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/persistence/HybridHashTableContainer.java @@ -288,6 +288,10 @@ private HybridHashTableContainer(float keyCountAdj, int threshold, float loadFac } } + // Round to power of 2 here, as is required by WriteBuffers + writeBufferSize = Integer.bitCount(writeBufferSize) == 1 ? + writeBufferSize : Integer.highestOneBit(writeBufferSize); + // Cap WriteBufferSize to avoid large preallocations writeBufferSize = writeBufferSize < minWbSize ? minWbSize : Math.min(maxWbSize, writeBufferSize); LOG.info("Write buffer size: " + writeBufferSize); diff --git serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java index acb51f9..6d777eb 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java +++ serde/src/java/org/apache/hadoop/hive/serde2/WriteBuffers.java @@ -56,7 +56,8 @@ public void clear() { public WriteBuffers(int wbSize, long maxSize) { - this.wbSize = Integer.bitCount(wbSize) == 1 ? wbSize : (Integer.highestOneBit(wbSize) << 1); + assert Integer.bitCount(wbSize) == 1 : "Write buffer size must be power of 2."; + this.wbSize = wbSize; this.wbSizeLog2 = 31 - Integer.numberOfLeadingZeros(this.wbSize); this.offsetMask = this.wbSize - 1; this.maxSize = maxSize;