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.keytab1. 首先确认获取的用户名和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_hive1. 客户端与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服务状态为Bad1. 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 HealthyHbase服务不可用会导致Hive服务的健康状态变为Partially Healthy。
3.3 Hive服务状态为 Unknown1. Hive服务停止。 2. hiveserver实例出现双主,双备,双unknown。
3.4 hiveserver 或者metastore 实例的健康状态为unknownhiveserver 或者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 | | | | | | | | Percentage of Sessions Connected to the HiveServer to Maximum Number Allowed Exceeds the Threshold | | 16001 | | | Hive Warehouse Space Usage Exceeds the Threshold | | | | | The Successful Hive SQL Operations Lower than The Threshold | | | | | | | | | | | |
告警触发的场景如下 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时触发告警。 说明: 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会从内核优化该问题。
|