你问我答3 - 关于Hive CLI与Beeline

2022-08-26 17:49:55 浏览数 (1)

请教一下,这个是cdp测试过程中,我这边想把hive命令默认client改为原来的hive cli,修改了use_beeline_for_hive_cli为false后,命令输入hive报了java.lang.NoClassDefFoundError: org/apache/tez/dag/api/SessionNotRunning,我尝试过将tez的jar包复制到hive 的lib目录下和修改hive-site.xml中的hive.server2.active.passive.ha.enable为false,但是都不行,你这边有啥修改的建议不


这个没有建议,我们的产品里给你禁用掉就是不让你用的,其实。还不如回到beeline你觉得哪里不方便或者挡住你使用了,我来给你解决。


在beeline使用insert overwrite directory的时候没有用到执行用户的权限,这样的话,在旧的脚本使用hive执行insert overwrite directory是没问题的,但是切换到beeline后,可能会报错


你们的集群是没有使用ldap也没有kerberos是吧?


生产上没有用,探查、生产测试用到了ldap


如果HS2启用了ldap登录认证的话,不会有你说的这个问题,因为敲beeline需要登录。或者beeline命令带参数直接登录


现在是这样得情况,在客户端模式 下 hive -e "INSERT OVERWRITE LOCAL DIRECTORY "  落到本地的文件  什么用户开的hive  落到本地的文件权限是什么用户的  。但是beeline模式下  是一直是hive 用户的文件权限。有没方法是落在本地的文件  是那个用户的文件权限呢


这个CLI和beeline是有问题,不过主要不是你这个问题,这两天测试了一下。生成的文件目录是-rw-r--r-- 1 hive hive,别的用户也能读到啊,你们是觉得有什么问题?


因为程序会进行删除合并文件

,目前只有读权限…关键一大部分代码是这么写的


哦,你说这个。代码不用改,多一步自己去改权限好了?

Hive CLI writes to local host when INSERT OVERWRITE LOCAL DIRECTORY. But Beeline writes to HS2 local directory. For a user migrating from CLI to Beeline, it might be a big chance.

其实一般人是关心这个问题


额,可能我这边airflow和hiveserver2部署在一起所以没发现吧


Hive CLI的方式在CDH5/6的时候就已经建议不再使用,而是使用beeline的方式连接Hive。在CDP中则是完全取消了Hive CLI的方式,即使输入hive命令,系统也会直接连到beeline。主要原因是集群开启Sentry/Ranger后,防止用户绕过HS2直接访问HMS中的敏感数据,实际上在开启安全后,Sentry/Ranger后也不支持Hive CLI。参考:

代码语言:javascript复制
https://docs.cloudera.com/documentation/enterprise/latest/topics/sg_sentry_overview.html#concept_q3l_5sw_jr__hiveclidisable

生产中使用beeline连接HS2提交Hive SQL的方式也可以更好的利用多装几个HS2,然后前端通过HAProxy或F5起到负载均衡的作用。

我们在cdh5或者cdh6执行insert overwrite directory的时候,数据会写到执行命令所在节点的本地目录,再没有启用安全的情况下,目录以及文件的权限属组即为执行命令的用户,但到CDP时,因一般都会建议上安全Kerberos Ranger,在取消掉doas功能后底层都是使用hive用户,所以生成的文件也都是-rw-r--r-- 1 hive hive,其他用户也都有读取的权限。

但是生成的文件在beeline连接的HS2所在节点的本地,参考jira:

代码语言:javascript复制
https://issues.apache.org/jira/browse/HIVE-11666

在CDP环境中如果使用fayson用户执行类似insert overwrite local directory '/tmp/fayson1' select * from test_hbase;语句的时候,程序会在HDFS中首先创建同名的/tmp/fayson1目录,所以要对执行语句的用户在Ranger中赋权:

另外还需要保证本地目录/tmp对于执行用户fayson有所有权限,因为测试使用/tmp所以不用担心。

对于旧的Hive CLI与beeline表现模式不一样的地方,目前暂未有太好的办法,只能基于beeline进行改造旧的应用,有以下workaround供参考:

1.改用export和import导出到本地,但是只能对分区或者全表;

2.rsync从HS2节点同步到自己节点的机器;

3.把结果打印到stdout然后保存到本地。

4.先导出到hdfs后然后get到本地目录

参考:

代码语言:javascript复制
https://my.cloudera.com/knowledge/ERROR-quotPermission-denied-user-xxx-does-not-have-WRITE?id=272389https://my.cloudera.com/knowledge/Beeline--INSERT-OVERWRITE-LOCAL-DIRECTORY-does-Not-Write-to?id=71345

注:

因为每次执行该语句的时候都需要在HDFS中创建于本地目录同名的目录,可以尝试在导出的时候进行设置:

代码语言:javascript复制
set hive.exec.stagingdir=/tmp/.hive-staging;

未进行测试。

测试了是这样子的,打开doas,不要ranger也还是hive用户,估计这个语句因为连接HS2以后,是以启动HS2的用户来做的move操作,这个没办法了。回到你的场景,要不insert本地完了以后再本地目录的属组吧,要不就使用hive用户跑这个操作,反正你集群是没安全可言,用什么用户其实没所谓。另外使用beeline替换掉Hive CLI,是社区的行动,对应到很多jira,你可以参考:

HiveServer2Clients

代码语言:javascript复制
https://cwiki.apache.org/confluence/display/Hive/HiveServer2 Clients 

Replacing the Implementation of Hive CLI Using Beeline 

代码语言:javascript复制
https://cwiki.apache.org/confluence/display/Hive/Replacing the Implementation of Hive CLI Using Beeline 

Replacing the implementation of Hive CLI using Beeline 

代码语言:javascript复制
https://issues.apache.org/jira/browse/HIVE-10511

升级后还是做一下转变吧。就是不要到Hive3了还尝试把老的CLI再调出来,没有意义了。

如果打开doas应该是你执行命令用户的属组


 我这边CDP好像是没开启安全的,kerberos是没有用的。落到本地文件依旧是只有hive有权限...


我说doas。。。我知道你没安全


那个默认开启了   我这边关了 也是 一样


你这里是要打开


以前是打开的状态 不行 是不是我这边应用启动 可不可以用hive 用户呢  ?  现在底层数据的用户都是hive吗? 


代码语言:javascript复制
测试了是这样子的,打开doas,不要ranger也还是hive用户,估计这个语句因为连接HS2以后,是以启动HS2的用户来做的move操作,这个没办法了。回到你的场景,要不insert本地完了以后再本地目录的属组吧,要不就使用hive用户跑这个操作,反正你集群是没安全可言,用什么用户其实没所谓。另外使用beeline替换掉Hive CLI,是社区的行动,对应到很多jira,你可以参考:
HiveServer2 Clientshttps://cwiki.apache.org/confluence/display/Hive/HiveServer2 ClientsReplacing the Implementation of Hive CLI Using Beelinehttps://cwiki.apache.org/confluence/display/Hive/Replacing the Implementation of Hive CLI Using BeelineReplacing the implementation of Hive CLI using Beelinehttps://issues.apache.org/jira/browse/HIVE-10511升级后还是做一下转变吧。

就是不要到Hive3了还尝试把老的CLI再调出来,没有意义了。


嗯,现在确实只能考虑这样子了。insert  到hdfs上,在从hdfs调回本地,此时本地文件权限应该启动用户吧。这应该不会变的,但是用户是没权限删除hdfs文件对吧。airflow目前是考虑集群外部署的,即使用insert  local  本地的话,也是落到hs2上的


如果开启了doas应该还是提交命令的用户,其他用户没权删除。但是一般是禁用掉,所以还是hive。但你可以get会本地。测试了,用insert overwrite directory语句生成的目录和文件都是hive:hive,其他用户有读取权限,无法删除,你可以get到本地。


嗯嗯,一般这种操作都是临时文件,这么看来hdfs上文件还得另外进程去定期删除,或者airflow用hive用户启动


除了airflow用hive用户启动外,还可以将你使用的用户加入到高权用户组也行。比如加到hive。如果开启了安全kerberos后,就跟启动用户没关系了,脚本里直接kinit hive用户好了。


这个出来权限不是755吗?还是775。收到,谢谢


hive:hive 755


这样来看,airflow应用是只能用hive启动了。现在集群上的数据是Hadoop用户权限,旧数据迁移到新集群时候会不会有权限问题呢?


迁数据的时候可以保留用户属组和权限,不过如果开安全的话,建议重新整理多租户包括的安全问题,然后重新设置。比如目录的ACL管理或者表的权限,调整过后就跟旧集群不一样了


明白了,谢谢

0 人点赞