hive常見錯誤匯總


來源於  https://www.aboutyun.com/thread-19977-1-1.html

hive常見錯誤匯總

1安裝與啟動
1.1 Hive安裝失敗報register service defaultUser failed.

版本加入kerberos互信機制后,變更hive的默認用戶為hive/hadoop.hadoop.com,而LDAP對應的該字段長度不夠,導致該值無法寫入LDAP中。



1.2Hive啟動失敗

Hive啟動失敗最常見的原因是metastore實例無法連接上DBservice。可以查看metastore.log中具體的錯誤信息。目前總結連不上DBservice原因主要有:

 

1.        DBservice沒有初始化好Hive的元數據庫hivemeta,可以通過以下方式驗證。
a)   source /opt/huawei/Bigdata/dbservice/.dbservice_profile
b)   gsql -h 160.172.0.44(DB的浮動ip) -p 20051 -d hivemeta -U hive -W HiveUser@
c)   如果不能正確進入交互界面,說明數據庫初始化失敗。如果報org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "160.164.0.146", database "HIVEMETA"
d)       說明DBservice的配置文件可能丟失了hivemeta的配置,在DBservice所在的節點上
e)   修改/srv/BigData/dbdata_service/data/pg_hba.conf,在文件最后面追加 host hivemeta hive 0.0.0.0/0 sha256,然后執行source /opt/huawei/Bigdata/dbservice/.dbservice_profile  ,再執行gs_ctl -D $GAUSSDATA reload  # 使修改后的配置生效。
2.   DBservice的浮動IP配置有誤,導致metastore節點IP無法正確連接浮動IP,或者是在與該ip建立互信的時候失敗導致metastore啟動失敗。(DBservice的浮動IP配置需要同網段內沒有被使用過的ip,也就是在配置前ping不通的ip)


2      JDBC客戶端
2.1      使用jdbc 客戶端連接hiveserver 報Login failure for user from keytab conf/user.keytab

1.        首先確認獲取的用戶名和keytab文件是否正確,也就是url中user.principal值和user.keytab的keytab文件是否取至於所使用的集群。
2.        其次確認獲取的krb5.conf文件是否正確以及是否有正確設置。
System.setProperty("java.security.krb5.conf", "conf/krb5.conf");      
3.        如果打成jar包放到linux運行,需要注意修改user.keytab和krb5.conf的路徑為linux下的目錄,並將正確的user.keytab和krb5.conf移至對應的目錄下。


2.2      使用jdbc 客戶端連接hiveserver 報KeeperErrorCode = AuthFailed for /hive/active_hive

1.        客戶端與zookeeper服務端之間的系統時間相差超過5分鍾導致zookeeper認證失敗。調整客戶端時間與服務端系統時間相近。
2.        連接hiveserver的url中沒有指定zk.principal參數。zk.principal=zookeeper/hadoop。
3.        使用的zookeeper的jar包不是隨FI發布jar包,或者是使用的其它jar包中包含同樣目錄的認證代碼。導致class加載的時候加載了錯誤的類,zookeeper認證失敗。


2.3      使用beeline客戶端連接hiveserver 報KeeperErrorCode = Session expired for /hive/active_hive

緩存在本地的票據已經過期需要使用kinit  user 命令重新登錄。


2.4      使用jdbc客戶端連接hiveserver 報faild to parse url: url , format is wrong.

連接的url的格式存在錯誤,c30中標准的格式為:
原生模式:jdbc:hive2://<host>:<port>/<db>;sess_var_list?hive_conf_list#hive_var_list
增強模式:jdbc:hive2://ha-cluster/<db>;sess_var_list?hive_conf_list#hive_var_list
關於jdbc url的詳細說明(格式和參數)參見下面的連接。


2.5      非安全版本的集群beeline客戶端連接不上HiveServer報 ERROR client.ZooKeeperSaslClient: SASL authentication failed

      beeline客戶端讀取了本地的kerberos票據信息,並在訪問ZooKeeper時鑒權失敗。對於非安全環境的beeline客戶端,訪問ZooKeeper時是不需要認證的,但這里做了認證,說明客戶端誤以為要連接的是安全集群。
      排查方法:
      beeline客戶端會檢查環境變量HADOOP_SECURITY_AUTHENTICATION,如果它的值為kerberos,說明要連接安全集群,否則,連接的是非安全集群。
       執行echo ${HADOOP_SECURITY_AUTHENTICATION}命令,結果如下:
       [root@SVR-26 hadoopclient]# echo ${HADOOP_SECURITY_AUTHENTICATION}
       Kerberos
       該環境變量是由kerberos的客戶端設置的,正常情況下,非安全集群的kerberos客戶端,不會設置該變量。經過了解,在當前shell會話中,曾經source過安全集群客戶端的環境變量。之后再source非安全集群的環境變量,,HADOOP_SECURITY_AUTHENTICATION會保留下來,進而導致客戶端誤以為要連接安全集群。
       解決辦法:
       重新打開一個shell窗口,source非安全集群的環境變量后,再連接集群。


3      OM監控與告警.

3.1      Hive服務狀態為Bad

1.        DBservice 服務不可用會導致Hive服務狀態為Bad。
2.        Yarn 服務不可用會導致Hive服務狀態為Bad。
3.        HDFS 服務不可用會導致Hive服務狀態為Bad。
4.        Zookeeper 服務不可用會導致Hive服務狀態為Bad。
5.        LDAP/KrbServer 服務不可用會導致Hive服務狀態為Bad。
6.        metastore 實例不可用會導致Hive服務狀態為Bad。



3.2     Hive服務狀態為Partially Healthy

Hbase服務不可用會導致Hive服務的健康狀態變為Partially Healthy。


3.3      Hive服務狀態為 Unknown

1.        Hive服務停止。
2.        hiveserver實例出現雙主,雙備,雙unknown。


3.4      hiveserver 或者metastore 實例的健康狀態為unknown

hiveserver 或者metastore實例被停止。


3.5      hiveserver 或者metastore 實例的健康狀態為Concerning

      hiveserver 或者metastore實例在啟動的時候發生異常,無法正常啟動。


3.6      Hive服務健康狀態和Hive實例健康狀態的區別

Hive服務的健康狀態(也就是在services界面看到的健康狀態)有Good,Bad,Partially Healthy,Unknown四種狀態 ,四種狀態除了取決於Hive本身服務的可用性(會用簡單的sql來檢測Hive服務的可用性),還取決於Hive服務所依賴的其他組件的服務狀態。
Hive實例分為hiveserver(jmx)和metastore(pid)兩種,健康狀態有Good,Concerning ,Unknown三種狀態,這三種狀態是通過通信來判定,與實例通信正常時為Good,通信異常時為Concerning,無法通信時為 Unknown  



3.7      Hive中的告警有哪些以及觸發的場景

Alarm ID
Alarm Severity
Is Auto Clear
Alarm Name
Alarm Type
16000
Minor
TRUE
Percentage of Sessions Connected to the HiveServer to Maximum Number Allowed Exceeds the Threshold
故障告警
16001
Minor
TRUE
Hive Warehouse Space Usage Exceeds the Threshold
故障告警
16002
Minor
TRUE
The Successful Hive SQL Operations Lower than The Threshold
故障告警
16003
Minor
FALSE
HiveServer Failover
事件
16004
Critical
TRUE
Hive Service Unavailable
故障告警
告警觸發的場景如下
16000:當連接HiveServer的session數占允許連接總數的比率超過設定的閾值的時候觸發告警。如連接的session數為9,總連接數為12,設定的閾值為70%,9/12>70%便觸發告警。
16001:當hive使用的hdfs容量占分配給hive的總hdfs總容量的比率超過設定的閾值時觸發告警。如分配給hive的是500G,hive已經使用400G,設定的閾值時75%,400/500>75%便觸發告警。
16002:當執行sql的成功率低於設定的閾值時變觸發告警。如你執行了4條失敗了2條,設定的閾值為60%,成功率2/4<60%便觸發告警。
16003:HiveServer主備發生切換時觸發事件。事件在event中查看。
16004:Hive服務的健康狀態變為Bad時觸發告警。
說明:
1.        告警的閾值和告警的級別以及觸發告警的時間段可以在OM界面中System下  Threshold Configuration中設定。
2.        Hive運行相關的指標可以在Hive監控界面查看。



4      HQL與鑒權

4.1      在beeline中執行dfs put /opt/kv1.txt /tmp/kv1.txt類似的上傳命令時報Permission denied. Principal [name=admin, type=USER] does not have following privileges     on  Object     [type=COMMAND_PARAMS,name=[put,    /opt/kv1.txt, /tmp/kv1.txt]] for operation DFS : [ADMIN PRIVILEGE] (state=,code=1)

1.    當前登錄的用戶不具備操作此命令的權限,如果登錄的當前用戶具有admin角色,請用set role admin來切換成admin角色操作。如果不具備admin角色,在OM管理界面System下Role Management 中給對應的角色賦予對應的權限。
2.    使用hdfs客戶端上傳。



4.2      執行create table test(bar int,foo string)stored as textfile類似建表語句報Permissiondenied:user=fantasy,access=EXECUTE,inode="/user/hive":hive:hive:drwxrwx---

當前用戶不具備操作建表的權限。當前用戶不屬於Hive組,在OM管理界面System下User Management中給對應的用戶的所屬組添加Hive組。



4.3      執行load data inpath '/tmp/kv1.txt' into table xx 類似的導入數據的語句報HiveAccessControlException Permission denied. Principal [name=fantasy, type=USER] does not have following privileges on Object [type=DFS_URI, name=hdfs://hacluster/tmp/kv1.txt] for operation LOAD : [SELECT, INSERT, DELETE, OBJECT OWNERSHIP] (state=42000,code=40000)

當前用戶擁有的角色不具備操作HDFS的權限。在OM管理界面System下Role Management中給對應的角色賦予相應的HDFS操作權限。


4.4      create external table xx(xx int)stored as textfile location '/tmp/aaa/aaa';創建外部表時指定一個不存在的路徑報Permission denied. Principal [name=fantasy, type=USER] does not have following privileges on Object [type=DFS_URI, name=/tmp/aaa/aaa] for operation CREATETABLE : [SELECT, INSERT, DELETE, OBJECT OWNERSHIP] (state=42000,code=40000)

創建外部表時,會判斷當前用戶對指定的目錄以及該目錄下其它目錄和文件是否有讀寫權限,如果該目錄不存在,會去判斷其父目錄,依次類推。如果一直不滿足就會報權限不足。而不是報指定的目錄不存在。(與肖遠確認一下)


4.5      load數據的時候對文件名是否有要求

      文件名不能以下橫線(_)或點(.)開頭,以這些開頭的文件會被忽略,但是名稱為“_metadata”的文件不會被忽略。
      關於load數據時對文件和文件所在目錄要求的詳細說明參見以下鏈接:


4.6      執行set命令的時候報Cannot modify hive.default.rcfile.serde at runtime.

      在R2C30版本的Hive中,使用的白名單機制,即只有在白名單中的配置項,才可以在beeline/JDBC中通過set命令修改。在OM界面Hive的配置頁面中查看hive.security.authorization.sqlstd.confwhitelist配置項,來確定設置的屬性是否在該列表中。如果沒有所設置的屬性參數,添加到該列表中,重啟Hive服務並可以生效。




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



HQL中路徑的權限要求  
在FusionInsight C30安全版本中,Hive使用“SQL Standards Based”鑒權模式完成鑒權操作。在這種模式下,對HQL中涉及的路徑有權限要求,現將部分要求總結如下,供使用時參考。

1      加載HDFS上的文件

load data inpath ‘file’ ……
l  文件的owner需要為執行命令的用戶
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=DFS_URI, name=hdfs://hacluster/tmp/input/mapdata] for operation LOAD : [OBJECT OWNERSHIP]
l  當前用戶需要對該文件有讀、寫權限
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=DFS_URI, name=hdfs://hacluster/tmp/input/mapdata] for operation LOAD : [INSERT, DELETE]
l  當前用戶需要對該文件的目錄有執行權限
校驗不通過時的錯誤信息
SemanticException Line 1:17 Invalid path ''/tmp/input/mapdata''
l  由於load操作會將該文件移動到表對應的目錄中,所以要求當前用戶需要對該文件的目錄有寫權限
校驗不通過時的錯誤信息
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
l  要求文件的格式與表指定的存儲格式相同。如創建表時指定stored as rcfile,但是文件格式為txt,則不符合要求。
校驗不通過時的錯誤信息
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
注意:創建表時如果沒有指定存儲格式,則默認為rcfile。
l  文件必須是HDFS上的文件,不可以用file://的形式指定本地文件系統上的文件
校驗不通過時的錯誤信息
SemanticException [Error 10028]: Line 1:17 Path is not legal ''file:///tmp/input/mapdata'': Move from: file:/tmp/input/mapdata to: hdfs://hacluster/user/hive/warehouse/tmp1 is not valid. Please check that values for params "default.fs.name" and "hive.metastore.warehouse.dir" do not conflict.
l 文件名不能以下橫線(_)或點(.)開頭,以這些開頭的文件會被忽略


2      加載操作系統(本地文件系統)上的文件

load data local inpath ‘file’ ……
l  由於所有的命令都是發送的主HiveServer上去執行的,所以要求此文件在主HiveServer節點上
校驗不通過時的錯誤信息
SemanticException Line 1:23 Invalid path ''/tmp/input/mapdata'': No files matching path file:/tmp/input/mapdata
l  HiveServer進程是以操作系統上的omm用戶啟動的,所以要求omm用戶對此文件有讀權限,對此文件的目錄有讀、執行權限
校驗不通過時的錯誤信息
SemanticException Line 1:23 Invalid path ''/tmp/input/mapdata'': No files matching path file:/tmp/input/mapdata                                        (對目錄沒有權限)
或者是
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.CopyTask
                                                          (對文件沒有權限)
l  文件的owner需要為執行命令的用戶
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/input/mapdata] for operation LOAD : [OBJECT OWNERSHIP]
l  當前用戶需要對該文件有讀、寫權限
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/input/mapdata] for operation LOAD : [SELECT, INSERT, DELETE]
l  要求文件的格式與表指定的存儲格式相同。如創建表時指定stored as rcfile,但是文件格式為txt,則不符合要求。
校驗不通過時的錯誤信息
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
注意:創建表時如果沒有指定存儲格式,則默認為rcfile。
l 文件名不能以下橫線(_)或點(.)開頭,以這些開頭的文件會被忽略

3      將查詢結果寫入到HDFS上

insert overwrite directory ‘dir’ ……
u  如果目錄不存在
l  要求對此目錄的父目錄有讀、寫、執行權限
校驗不通過時的錯誤信息
HiveAuthzPluginException Error getting permissions for /tmp/out/abc: Permission denied: user=user1, access=EXECUTE, inode="/tmp/out":admin:hive:drwxr-----
或者是
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=DFS_URI, name=/tmp/out/abc] for operation QUERY : [INSERT]
u  如果目錄存在
l  要求對此目錄有讀、寫、執行權限(如果此目錄下有子目錄或子文件,要求對子目錄有讀、寫、執行權限,對子文件有寫權限)
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=DFS_URI, name=/tmp/out/abc] for operation QUERY : [INSERT]
或者是
HiveAuthzPluginException Error getting permissions for /tmp/out/abc: Permission denied: user=user1, access=READ_EXECUTE, inode="/tmp/out/abc/aaa":admin:hive:drwxrw----
                                                   (對子目錄沒有執行權限)
l  由於會先將此目錄刪掉,所以要求對此目錄的父目錄有讀、寫、執行權限
校驗不通過時的錯誤信息
HiveAuthzPluginException Error getting permissions for /tmp/out/abc: Permission denied: user=user1, access=EXECUTE, inode="/tmp/out":admin:hive:drwxr-----
(對父目錄沒有執行權限)
或者是
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
(對父目錄沒有寫權限)

4      將查詢結果寫入到操作系統(本地文件系統)上

insert overwrite local directory ‘dir’ ……
l  注意:dir必須加上file://前綴,否則會有很多權限不正確的錯誤
l  由於所有的命令都是發送的主HiveServer上去執行的,所以要求此目錄在主HiveServer節點上
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/out] for operation QUERY : [INSERT]
u  如果目錄不存在
l  HiveServer進程是以操作系統上的omm用戶啟動的,所以要求omm用戶對此目錄的父目錄有讀、寫、執行權限
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/out/1] for operation QUERY : [INSERT]
l  要求當前操作用戶對指定目錄的父目錄有寫權限
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/out/2] for operation QUERY : [INSERT]
l  如果父目錄中還有其他目錄或文件,則要求omm用戶對這些目錄有讀、寫、執行權限,對這些文件有寫權限,同時當前操作的用戶對這些目錄和文件有寫權限
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/out/2] for operation QUERY : [INSERT]
u  如果目錄存在
l  HiveServer進程是以操作系統上的omm用戶啟動的,所以要求omm用戶對此目錄有讀、寫、執行權限(如果此目錄下有子目錄或子文件,要求對子目錄有讀、寫、執行權限,對子文件有寫權限)
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/out/2] for operation QUERY : [INSERT]
l  要求當前操作用戶對指定目錄有寫權限(如果此目錄下有子目錄或子文件,要求對這些目錄/文件有寫權限)
校驗不通過時的錯誤信息
HiveAccessControlException Permission denied. Principal [name=user1, type=USER] does not have following privileges on Object [type=LOCAL_URI, name=file:/tmp/out/2] for operation QUERY : [INSERT]
l  由於會先將此目錄刪掉,所以要求對此目錄的父目錄有讀、寫、執行權限
校驗不通過時的錯誤信息
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


大並發add jar語句導致HiveServer報錯stream close問題

大並發的beeline連接,關閉,連接,其中使用udf, add jar, using jar兩種方式會從hdfs下載jar包,new ClassLoader加載這個jar包 
在加載這個jar包的時候 會用到jvm里一個全局的stream,關閉beeline的時候 會關閉這個classloader,關閉這個classloader的時候會關閉這個stream,其他線程還在使用。。然后就掛了。 

修改規避方式是將udf包放到hive的lib下,然后加入aux path,再直接添加,就避免了這個過程。




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

針對數據目錄文件非常多建立Hive外部表會卡很久的問題

Hive在編譯階段是串行的,編譯開始時會加鎖保護,對於其他等候執行命令的語句只能排隊等候。正常情況一條SQL語句的編譯階段會在數秒內返回。 

但是由於編譯最后階段會進行鑒權,此處有個坑,既,如果在創建表的時候指定路徑並且路徑下有大量文件的話,鑒權會用很長時間。這就會讓其他語句由於不能獲取鎖而卡死。 

可以先把數據目錄rename成別的目錄,等創建好表之后,再rename回來。 

后續Hive會從內核優化該問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM