JinsuKim created HIVE-13665:
-------------------------------

             Summary: HS2 memory leak When multiple queries are running with 
get_json_object
                 Key: HIVE-13665
                 URL: https://issues.apache.org/jira/browse/HIVE-13665
             Project: Hive
          Issue Type: Bug
    Affects Versions: 1.1.0
            Reporter: JinsuKim


The extractObjectCache in UDFJson is increased over limitation(CACHE_SIZE = 
16). When multiple queries are running concurrently on HS2 local(not mr/tez) 
with get_json_object or get_json_tuple
{code:java|title=HS2 heap_dump}
Object at 0x515ab18f8
instance of org.apache.hadoop.hive.ql.udf.UDFJson$HashCache@0x515ab18f8 (77 
bytes)
Class:
class org.apache.hadoop.hive.ql.udf.UDFJson$HashCache
Instance data members:
accessOrder (Z) : false
entrySet (L) : <null>
hashSeed (I) : 0
header (L) : java.util.LinkedHashMap$Entry@0x515a577d0 (60 bytes) 
keySet (L) : <null>
loadFactor (F) : 0.6
modCount (I) : 4741146
size (I) : 2733158                   <========== here!!
table (L) : [Ljava.util.HashMap$Entry;@0x7163d8b70 (67108880 bytes) 
threshold (I) : 5033165
values (L) : <null>
References to this object:
{code}

I think that this problem be caused by the LinkedHashMap object is not 
thread-safe
{code}
* <p><strong>Note that this implementation is not synchronized.</strong>
 * If multiple threads access a linked hash map concurrently, and at least
 * one of the threads modifies the map structurally, it <em>must</em> be
 * synchronized externally.  This is typically accomplished by
 * synchronizing on some object that naturally encapsulates the map.
{code}

Reproduce :
# Multiple queries are running with get_json_object and small input data(for 
execution on hs2 local mode)
# jvm heap dump & analyze
{code:title=test scenario}
Multiple queries are running with get_json_object and small input data(for 
execute on hs2 local mode)
1.hql :
SELECT get_json_object(body, '$.fileSize'), get_json_object(body, 
'$.ps_totalTimeSeconds'), get_json_object(body, '$.totalTimeSeconds') FROM 
xxx.tttt WHERE part_hour='2016040105' 
2.hql :
SELECT get_json_object(body, '$.fileSize'), get_json_object(body, 
'$.ps_totalTimeSeconds'), get_json_object(body, '$.totalTimeSeconds') FROM 
xxx.tttt WHERE part_hour='2016040106'
3.hql :
SELECT get_json_object(body, '$.fileSize'), get_json_object(body, 
'$.ps_totalTimeSeconds'), get_json_object(body, '$.totalTimeSeconds') FROM 
xxx.tttt WHERE part_hour='2016040107'
4.hql :
SELECT get_json_object(body, '$.fileSize'), get_json_object(body, 
'$.ps_totalTimeSeconds'), get_json_object(body, '$.totalTimeSeconds') FROM 
xxx.tttt WHERE part_hour='2016040108'
 
run.sh :
t_cnt=0
while true
do
echo "query executing..."
    for i in 1 2 3 4
    do
        beeline -u jdbc:hive2://localhost:10000 -n hive --silent=true -f $i.hql 
> $i.log 2>&1 &
    done
wait
t_cnt=`expr $t_cnt + 1`
echo "query count : $t_cnt"
sleep 2
done

jvm heap dump & analyze :
jmap -dump:format=b,file=hive.dmp $PID
jhat -J-mx48000m -port 8080 hive.dmp &
{code}

Finally I have attached our patch.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to