問題描述:
在hive on spark的環境中,執行HQL時,HQL執行失敗,出現以下的bug
java.lang.NoClassDefFoundError: org/antlr/runtime/tree/CommonTree
解決過程:
一開始進行分析的時候,網上大部分答案都是在說,可能是hive的jar包在spark中沒有,但是我自己去看的時候,返現spark當中也有兩個jar包,只是antlr的版本有些不一樣,後面想嘗試以下,所以就把將spark中的jar全部換成了hive的jar包,重啟hive和spark,發現在此執行HQL的時候,依然出現同樣的bug
圖中,bak類型的是之前spark的jar包,我發現換了之後還是沒有什麼用,試了很多很多的方法,後面發現根本原因是hive本身限制的原因
因為自己寫的HQL的主要功能是實現動態分區,我看了一下,一共有2636個分區,但是hive默認單節點的分區就是100個,所有即使將yarn的內存資源調高,也依舊沒有用,解決方法就是在HQL前執行如下命令:
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.dynamic.partitions.pernode= 2048;
set hive.exec.dynamic.partition.mode=nonstrict;
單節點的hive最大分區是2048,直接將其調到最高,開啟動態分區,bug就解決了
如果不想在HQL中進行設置,那麼可以在hived/conf的hive-site.xml文件中進行相對應的設置