前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你问我答3 - 关于Hive CLI与Beeline

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

作者头像
Fayson
发布2022-08-26 17:49:55
1.2K0
发布2022-08-26 17:49:55
举报
文章被收录于专栏:Hadoop实操Hadoop实操

请教一下,这个是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管理或者表的权限,调整过后就跟旧集群不一样了


明白了,谢谢

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档