ambari开启kerberos

本文详细记录了在Ambari集群上启用Kerberos的安全认证过程中遇到的各种问题及解决办法,包括YARN资源配置错误、Hive与HBase的Kerberos连接、HDFS和Kylin的Kerberos配置、Zepplin和DBeaver的访问设置,以及Ranger权限管理的配合使用。在Kerberos环境下,各种组件的配置和调试成为关键,任何细节都可能导致启动失败或功能受限。

网上一些跟Ambari启用Kerberos,看似很简单,但实际按照这个配置,遇到的问题连解决方案都不好找。启用了kerberos,想要也没有那么简单,ambari关闭kerberos,大数据集群起都起不来,因为有些内容还得手工删除,真是骑虎难下。我之前开启了ranger,比较简单。后来想着kerberos也一样,于是也起来,结果发现安全模式下,会更改ambari的一些配置,导致一堆报错
Remove ats-hbase before switching between clusters,出了问题找这篇文章,才知道切换之前应该先卸载ats-hbase,可是大多数文章都不会有这些。

Ambari集群启用Kerberos安全认证
这里说把 krb5.conf kadm5.acl kdc.conf 复制到另外机器上,实际只需要复制一个krb5.conf就可以,其他两个在客户端机器上不会有影响。

在ambari中查看Tez Service Check,发现检查失败检查的原因也是yarn resouce manager 没有起来造成的

检查yarn的配置,发现Advanced yarn-hbase-sitezookeeper.znode.parent少了个配置atsv2-hbase-unsecure,应该为/atsv2-hbase-unsecure
无意间少敲了一个/,这个问题导致排查了两天,一切均在细节里面,更正过来,Resource Manager正常启动了,这种问题在网上也真是不会找到了。tez check也正常了

1 yarn中的配置会改
yarn中下图的配置之前是/atsv2-hbase-unsecure,但是开启kerberos之后,这个会变成/atsv2/hbase/secure,而这个时候因为yarn resource manager找不到zookeeper中的配置信息,就会一直报错。

1
2 hive启用kerberos
安装pyhive的依赖,sasl安装依赖Microsoft Visual C++ 14.0,下载地址为
sasl‑0.2.1‑cp37‑cp37m‑win_amd64.whl

#pip install sasl
pip install sasl-0.2.1-cp37-cp37m-win_amd64.whl
pip install thrift
pip install thrift-sasl
pip install PyHive
# -*- coding: utf-8 -*-
from pyhive.hive import connect
con = connect(host='bg4.test.com.cn',port=10000,auth='KERBEROS',kerbers_service_name='hive')
cursor = con.cursor()
cursor.execute('select * from student')
datas = cursor.fetchall()
print(datas)
cursor.close()
con.close()

开启kerberos后,hive连接不是那么直接,没用好会提示下面的错误,在window机器上执行会提示

Traceback (most recent call last):
  File "f:/pywork/bigdata/hive_test.py", line 3, in <module>
PS F:\pywork\bigdata> & D:/Python/Python37/python.exe f:/pywork/bigdata/hive_test.py
Traceback (most recent call last):
  File "f:/pywork/bigdata/hive_test.py", line 3, in <module>
    con = connect(host='bg4.test.com.cn',port=10000,auth='KERBEROS',kerberos_service_name='hive')
  File "D:\Python\Python37\lib\site-packages\pyhive\hive.py", line 94, in connect
    return Connection(*args, **kwargs)
  File "D:\Python\Python37\lib\site-packages\pyhive\hive.py", line 192, in __init__
    self._transport.open()
  File "D:\Python\Python37\lib\site-packages\thrift_sasl\__init__.py", line 85, in open
    message=("Could not start SASL: %s" % self.sasl.getError()))
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'

在hive的服务器上yum install cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi gcc-c++ -y
如果不安装gcc-c++,那么安装sasl的时候会提示下面的错误,这个就跟windows下面要安装vs14++原理是一样的。

    gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -Isasl -I/usr/local/python3/include/python3.8 -c sasl/saslwrapper.cpp -o build/temp.linux-x86_64-3.8/sasl/saslwrapper.o
    gcc: error trying to exec 'cc1plus': execvp: No such file or directory
    error: command 'gcc' failed with exit status 1

把刚刚那段代码,在服务器上执行,提示错误信息

Traceback (most recent call last):
  File "hive_test.py", line 3, in <module>
    con = connect(host='bg4.test.com.cn',port=10000,auth='KERBEROS',kerberos_service_name='hive')
  File "/usr/local/python3/lib/python3.8/site-packages/pyhive/hive.py", line 94, in connect
    return Connection(*args, **kwargs)
  File "/usr/local/python3/lib/python3.8/site-packages/pyhive/hive.py", line 192, in __init__
    self._transport.open()
  File "/usr/local/python3/lib/python3.8/site-packages/thrift_sasl/__init__.py", line 84, in open
    raise TTransportException(type=TTransportException.NOT_OPEN,
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure.  Minor code may provide more information (No Kerberos credentials available (default cache: /tmp/krb5cc_0))'

换一种方式,通过impyla来连接hive

pip install impyla - https://pypi.tuna.tsinghua.edu.cn/simple

脚本如下,执行成功.这个impala.dbapiimpyla来操作hive,我还以为需要装impala,我多虑了。

# _*_ coding:utf-8 _*_
import os
from krbcontext import krbcontext
from impala.dbapi import connect

keytab_file = '/etc/security/keytabs/hive.service.keytab'
user = 'hive/bg8.test.com.cn@HADOOP.COM'

def _connect(host,port,sso_ticket=None):
    try:
        active_str = 'kinit -kt {0} {1}'.format(keytab_file, user)
        os.system(active_str)
        with krbcontext(using_keytab=True, principal=user, keytab_file=keytab_file):
            conn = connect(host=host, port=port, auth_mechanism='GSSAPI', kerberos_service_name='hive')
            cursor = conn.cursor()
            cursor.execute("insert into student(id,name,sex) values(3,'zhangsan','man')")
            cursor.execute("insert into student(id,name,sex) values(4,'wangyu','man')")
            cursor.execute("insert into student(id,name,sex) values(5,'zhaoliu','woman')")
            cursor.execute('select * from student')
            datas = cursor.fetchall()
            print(datas)
            cursor.close()
            conn.close()
    except Exception as e:
        raise e

if __name__ == '__main__':
    _connect('bg8.test.com.cn',10000)

在服务器上执行结果如下,这个是hive的内表

[root@bg8 scrpits]# python3 hive_test_2.py 
[(1, 'xiaoming', 'boy', 15, 'dep'), (2, 'dd', 'boy', 35, 'dep'), (3, 'zhangsan', 'man', None, None), (4, 'wangyu', 'man', None, None), (5, 'zhaoliu', 'woman', None, None)]

上面这能算是入门级的,因为上面的student是MANAGED_TABLE,也就是hive的内表。
如果是hive的EXTERNAL_TABLE,就有些区别了,内外表可以通过命令desc formatted student来查看。
接下来实验改成外表cursor.execute("select count(*) from test.ods_ri_category")可以查询出结果。
继而,再进一步做一次验证,通过hive向外表cursor.execute("insert into pro.kylin_intermediate_ods_jd_category2_82e06390_c8ad_2fe2_84bc_76c01bea2ae4 values('2021-01-23','20210123')")中写入数据,写入正常。
最后在验证,从外表查询数据,将结果再写入到另外一张表中。

INSERT OVERWRITE TABLE `pro.kylin_intermediate_ods_jd_category2_82e06390_c8ad_2fe2_84bc_76c01bea2ae4` SELECT
`ODS_JD_CATEGORY`.`UPDATE_DATE` as `ODS_JD_CATEGORY_UPDATE_DATE`
,`ODS_JD_CATEGORY`.`ID` as `ODS_JD_CATEGORY_ID`
 FROM `PRO`.`ODS_JD_CATEGORY` as `ODS_JD_CATEGORY`
WHERE 1=1 AND (`ODS_JD_CATEGORY`.`UPDATE_DATE` >= '2021-01-14' AND `ODS_JD_CATEGORY`.`UPDATE_DATE` < '2021-01-15');

接着就出现了困扰已久的问题,如下面所示:

Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 1, vertexId=vertex_1611301884780_0075_1_00, diagnostics=[Vertex vertex_1611301884780_0075_1_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: ods_jd_category initializer failed, vertex=vertex_1611301884780_0075_1_00 [Map 1], org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=16, exceptions:
Sat Jan 23 14:27:20 CST 2021, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=68737: Connection closed row 'pro:ods_jd_category,,' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=bg3.test.com.cn,16020,1611149386882, seqNum=-1

        at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.throwEnrichedException(RpcRetryingCallerWithReadReplicas.java:298)
        at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:242)
        at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:58)
        at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithoutRetries(RpcRetryingCallerImpl.java:192)
        at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:268)
        at org.apache.hadoop.hbase.client.ClientScanner.loadCache(ClientScanner.java:436)
        at org.apache.hadoop.hbase.client.ClientScanner.nextWithSyncCache(ClientScanner.java:311)
        at org.apache.hadoop.hbase.client.ClientScanner.next(ClientScanner.java:596)
        at org.apache.hadoop.hbase.MetaTableAccessor.scanMeta(MetaTableAccessor.java:754)
        at org.apache.hadoop.hbase.MetaTableAccessor.scanMeta(MetaTableAccessor.java:670)
        at org.apache.hadoop.hbase.MetaTableAccessor.scanMetaForTableRegions(MetaTableAccessor.java:665)
        at org.apache.hadoop.hbase.client.HRegionLocator.listRegionLocations(HRegionLocator.java:152)
        at org.apache.hadoop.hbase.client.HRegionLocator.getAllRegionLocations(HRegionLocator.java:88)
        at org.apache.hadoop.hbase.mapreduce.RegionSizeCalculator.getRegionServersOfTable(RegionSizeCalculator.java:103)
        at org.apache.hadoop.hbase.mapreduce.RegionSizeCalculator.init(RegionSizeCalculator.java:79)
        at org.apache.hadoop.hbase.mapreduce.RegionSizeCalculator.<init>(RegionSizeCalculator.java:61)
        at org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.oneInputSplitPerRegion(TableInputFormatBase.java:294)
        at org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.getSplits(TableInputFormatBase.java:257)
        at org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat.getSplitsInternal(HiveHBaseTableInputFormat.java:349)
        at org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat.access$200(HiveHBaseTableInputFormat.java:68)
        at org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat$2.run(HiveHBaseTableInputFormat.java:271)
        at org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat$2.run(HiveHBaseTableInputFormat.java:269)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
        at org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat.getSplits(HiveHBaseTableInputFormat.java:269)
        at org.apache.hadoop.hive.ql.io.HiveInputFormat.addSplitsForGroup(HiveInputFormat.java:524)
        at org.apache.hadoop.hive.ql.io.HiveInputFormat.getSplits(HiveInputFormat.java:779)
        at org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator.initialize(HiveSplitGenerator.java:243)
        at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:278)
        at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:269)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
        at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:269)
        at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:253)
        at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:108)
        at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:41)
        at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:77)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

我没搞懂这个异常是什么意思,于是执行命令echo "scan 'hbase:meta'" | hbase shell > hbaseout1.txt,将hbase:meta导出来看看。
Hive with HBase (both Kerberos) java.net.SocketTimeoutException … on table ‘hbase:meta’,这个人遇到的问题,跟我的有些像。

3 hbase启用kerberos
启动kerberos之后,直接进入到hbase shell中是查不到东西的

[root@bg8 ~]# su - hbase
Last login: Fri Jan 22 17:42:30 CST 2021
-bash-4.2$ hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hdp/3.1.0.0-78/phoenix/phoenix-5.0.0.3.1.0.0-78-server.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/3.1.0.0-78/hadoop/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.0.2.3.1.0.0-78, r, Thu Dec  6 12:27:45 UTC 2018
Took 0.0014 seconds                                                                                                                 
hbase(main):001:0> list
TABLE                                                                                                                               

ERROR: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)

这个时候就需要采取下面的方式

su - hbase
kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-xxx@HADOOP.COM
hbase shell
# 接着你就可以执行之如list之类的命令

接下来参考https://github.com/normal-cock/happybase-kerberos-patch,
安装pip install -U git+https://github.com/littlebear-xbz/happybase-kerberos-patch.git -i https://pypi.tuna.tsinghua.edu.cn/simple
写一个脚本在服务器上执行

# -*- coding: utf-8 -*-
from happybase_kerberos_patch import KerberosConnection, KerberosConnectionPool
connection = KerberosConnection('bg2.test.com.cn', protocol='compact', use_kerberos=True)
test_table = connection.table('test:student')
test_table.put('0001', {'o:id':'1'})
test_table.put('0001', {'o:name':'superstart'})
test_table.put('0001', {'o:sex':'man'})

print(test_table.row('0001'))

执行之后提示下面的错误,连接超时.

Traceback (most recent call last):
  File "hbase_test_2.py", line 3, in <module>
    connection = KerberosConnection('bg2.test.com.cn', protocol='compact', use_kerberos=True)
  File "/usr/local/python3/lib/python3.8/site-packages/happybase_kerberos_patch.py", line 225, in __init__
    self.open()
  File "/usr/local/python3/lib/python3.8/site-packages/happybase/connection.py", line 176, in open
    self.transport.open()
  File "/usr/local/python3/lib/python3.8/site-packages/happybase_kerberos_patch.py", line 92, in open
    status, challenge = self.recv_sasl_msg()
  File "/usr/local/python3/lib/python3.8/site-packages/happybase_kerberos_patch.py", line 118, in recv_sasl_msg
    header = readall(self.transport.read, 5)
  File "/usr/local/python3/lib/python3.8/site-packages/thriftpy2/transport/__init__.py", line 14, in readall
    chunk = read_fn(sz - have)
  File "thriftpy2/transport/buffered/cybuffered.pyx", line 44, in thriftpy2.transport.buffered.cybuffered.TCyBufferedTransport.read
  File "thriftpy2/transport/cybase.pyx", line 137, in thriftpy2.transport.cybase.CyTransportBase.get_string
  File "thriftpy2/transport/buffered/cybuffered.pyx", line 65, in thriftpy2.transport.buffered.cybuffered.TCyBufferedTransport.c_read
  File "thriftpy2/transport/buffered/cybuffered.pyx", line 69, in thriftpy2.transport.buffered.cybuffered.TCyBufferedTransport.read_trans
  File "thriftpy2/transport/cybase.pyx", line 61, in thriftpy2.transport.cybase.TCyBuffer.read_trans
  File "/usr/local/python3/lib/python3.8/site-packages/thriftpy2/transport/socket.py", line 110, in read
    buff = self.sock.recv(sz)
socket.timeout: timed out

如果不用这个补丁,直接连接会怎样,这个结论是一样的。同样连接超时。

# _*_ coding:utf-8 _*_
import happybase
connection = happybase.Connection(host='bg2.test.com.cn',timeout=10000,autoconnect=False,protocol='binary')
connection.open()
print(connection.tables())#查看hbase现有的所有表名
connection.close()

查看tail -fn50 /appdata/home/hadoop/var/log/hbase/hbase-hbase-thrift-bg8.test.com.cn.log的日志,

2021-01-23 21:24:23,896 INFO  [thrift-worker-28] client.RpcRetryingCallerImpl: Call exception, tries=22, retries=36, started=269589 ms ago, cancelled=false, msg=java.io.IOException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hbase/master, details=
2021-01-23 21:24:40,053 INFO  [thrift-worker-29] client.RpcRetryingCallerImpl: Call exception, tries=17, retries=36, started=169031 ms ago, cancelled=false, msg=java.io.IOException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hbase/master, details=

查看zookeeper中,确实没有这个

[zk: localhost:2181(CONNECTED) 1] ls /hbase/master
Node does not exist: /hbase/master

注意更正Hbase.py中python2 的语法,except IOError, io:改成 except IOError as io:等和from .ttypes import *,参考ModuleNotFoundError: No module named ‘ttypes‘

# pip install hbase-python
pip install hbase-thrift 
pip install protobuf
pip install kazoo

执行hbase hbck,命令查看到这个是直接切入到hbase用下面之后的效果。


2021-01-23 19:50:04,872 INFO  [main] client.RpcRetryingCallerImpl: Call exception, tries=19, retries=36, started=209864 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.exceptions.ConnectionClosedException: Connection closed, details=
2021-01-23 19:50:24,915 INFO  [main] client.RpcRetryingCallerImpl: Call exception, tries=20, retries=36, started=229907 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.exceptions.ConnectionClosedException: Connection closed, details=
2021-01-23 19:50:44,995 INFO  [main] client.RpcRetryingCallerImpl: Call exception, tries=21, retries=36, started=249987 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.exceptions.ConnectionClosedException: Connection closed, details=
2021-01-23 19:51:05,184 INFO  [main] client.RpcRetryingCallerImpl: Call exception, tries=22, retries=36, started=270176 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.exceptions.ConnectionClosedException: Connection closed, details=
2021-01-23 19:51:25,271 INFO  [main] client.RpcRetryingCallerImpl: Call exception, tries=23, retries=36, started=290263 ms ago, cancelled=false, msg=org.apache.hadoop.hbase.exceptions.ConnectionClosedException: Connection closed, details=

接着我执行kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-test_data@HADOOP.COM,接着再执行hbase hbck,程序就可以往下走了。

Table KYLIN_QJPJY381BR is okay.
    Number of regions: 1
    Deployed on:  bg5.test.com.cn,16020,1611387529866
0 inconsistencies detected.
Status: OK

通过python访问开启kerberos的hbase,解决方案参考开启kerberos后hbase连接
3 hdfs开启kerberos
参考踩坑记之—python3连接kerberos认证的hdfs
4 kylin 开启kerberos
参考【大数据安全】Apache Kylin 安全配置(Kerberos)

Kerberos server上创建kylin账号

kadmin.local
kadmin.local:  addprinc kylin
kadmin.local:  ktadd -norandkey -k /etc/security/keytabs/kylin.keytab kylin@HADOOP.COM

在kylin的机器上执行

useradd kylin
usermod -a -G hadoop kylin
chown -R kylin:hadoop kylin.keytab

4 zepplin开启kerberos
在kerberos主节点上执行,ambari不会自动创建,那样zepplin登录不进去,故执行下面的命令,同步过去就可以了。

scp hdfs.headless.keytab root@bg13.test.com.cn:/etc/security/keytabs

5 dbeaver与kerberos
使用DBeaver访问Kerberos环境下的Hive
先现在两个客户端软件,装好Kerberos
DBeaver
5.1 kerberos
在kdc server上执行

kadmin.local
addprinc my_computer@HADOOP.COM
ktadd -norandkey -k /etc/security/keytabs/my_computer.keytab my_computer@HADOOP.COM
# 创建错了可以delete_principal my_computer@HADOOP.COM

非root用户下需要将生成的keytab文件,权限设置到644以上
在我的windows电脑上
配置环境变量
2
将kdc server中生成my_computer.keytab复制到本地,然后执行
keytab进行初始化处理

kdestroy
kinit -kt C:\keytabs\my_computer.keytab my_computer@HADOOP.COM
klist

在windows上连接不上,应该是服务器上防火墙做了限制,88端口没有开放,88端口是kerberos身份验证和票证授予。开放之后,就ok了。
2
登录成功后,可以看到
2
5.2 dbeaver
dbeaver.ini中添加配置

-Djavax.security.auth.useSubjectCredsOnly=false
-Djava.security.krb5.conf=C:\ProgramData\MIT\Kerberos5\krb5.ini
-Dsun.security.krb5.debug=true

URL模板应该按照下面的进行设置

jdbc:hive2://{host}[:{port}]/[{database}];principal=hive/{host}@HADOOP.COM

2
2

执行链接测试出现的问题:

Illegal char <"> at index 0: "C:\ProgramData\MIT\Kerberos5\krb5.ini"

那是因为使用DBeaver访问Kerberos环境下的Hive犯了个小错误,-Djava.security.krb5.conf=C:\ProgramData\MIT\Kerberos5\krb5.ini这样的配置才是对的。找到DBeaver链接kerberos安全认证的Phoenix集群找到了正确的解决方案。
不增加这个配置,则提示

Unexpected driver error occurred while connecting to the database
  Can't get Kerberos realm
  Can't get Kerberos realm
    
    java.lang.reflect.InvocationTargetException
      KrbException: Cannot locate default realm
      Cannot locate default realm

参考windows下dbeaver客户端连接hive–kerberos认证方式,添加dbeaver与hive的配置
出现下面的问题,主要是下面的问题,这里借鉴了kerberos+sentry集成hive测试,因为端口后面少了/

jdbc:hive2://bg1.test.com.cn:10000/;principal=hive/bg1.test.com.cn@HADOOP.COM

导致出现hive Are you missing a '/' after the hostname ?的问题
2
5.3 ranger
按照上面的执行一般都没有什么问题,但是配置了ranger之后,就不一样了。如下面异常,虽然创建了kerberos用户访问权限,但是跟ranger结合之后,就有差异了。

SQL 错误 [40000] [42000]: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [test04] does not have [CREATE] privilege on [default/school]
  Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [test04] does not have [CREATE] privilege on [default/school]
  Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [test04] does not have [CREATE] privilege on [default/school]
    org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAccessControlException:Permission denied: user [test04] does not have [CREATE] privilege on [default/school]
    org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAccessControlException:Permission denied: user [test04] does not have [CREATE] privilege on [default/school]

2
解决这个问题,只需要在ranger中分配权限就可以了
在ranger中创建用户,这里是一个internal用户,它不是从服务器上同步过来的。
在这里插入图片描述
在这里插入图片描述

给用户分配权限
2
接着,就可以在dbeaver中可以加载出表了。
2
按照前面配置权限,表可以读取出来,但是查询表里面的数据,就有问题了.

SQL 错误 [40000] [42000]: Error while compiling statement: FAILED: SemanticException Unable to fetch table student. java.security.AccessControlException: Permission denied: user=test01, access=EXECUTE, inode="/warehouse/tablespace/managed/hive":hive:hadoop:drwx------
	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:399)
	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:315)
	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:242)
	at org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer$RangerAccessControlEnforcer.checkDefaultEnforcer(RangerHdfsAuthorizer.java:589)

在ranger中hdfs添加上这个用户的权限,就可以了。
2
这个时候,数据就查出来了。
2
选择其中一条数据,修改并保存报错,错误信息如下,这个问题比较头疼。

SQL 错误 [1] [08S01]: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask
  Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask
  Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask

3
查看hiveserver2的日志,执行命令tail -fn50 /appdata/home/hadoop/var/log/hive/hiveserver2.log,这个里面才能看到完整的错误信息。看来真的原因test01用户没有提交queue的权限。

Caused by: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.security.AccessControlException: User test01 does not have permission to submit application_1611301884780_0087 to queue default
	at org.apache.hadoop.yarn.ipc.RPCUtil.getRemoteException(RPCUtil.java:38)
	at org.apache.hadoop.yarn.server.resourcemanager.RMAppManager.createAndPopulateNewRMApp(RMAppManager.java:427)
	at org.apache.hadoop.yarn.server.resourcemanager.RMAppManager.submitApplication(RMAppManager.java:320)
	at org.apache.hadoop.yarn.server.resourcemanager.ClientRMService.submitApplication(ClientRMService.java:645)
	at org.apache.hadoop.yarn.api.impl.pb.service.ApplicationClientProtocolPBServiceImpl.submitApplication(ApplicationClientProtocolPBServiceImpl.java:277)
	at org.apache.hadoop.yarn.proto.ApplicationClientProtocol$ApplicationClientProtocolService$2.callBlockingMethod(ApplicationClientProtocol.java:563)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:524)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1025)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:876)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:822)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2682)
Caused by: org.apache.hadoop.security.AccessControlException: User test01 does not have permission to submit application_1611301884780_0087 to queue default
	at org.apache.hadoop.yarn.server.resourcemanager.RMAppManager.createAndPopulateNewRMApp(RMAppManager.java:429)
	... 12 more

难道给test01在ranger中创建用户还是没有用,无法执行修改操作,只可以读或者写。
接着我在服务器上创建用户,同样在ranger上赋上权限。在所有的hadoop集群都添加此用户,添加一个节点并不能起到什么作用。

useradd test01
passwd test01

在每个节点添加用户之后,就不会出现下面的问题了。

TaskAttempt 3 failed, info=[Container container_e34_1611301884780_0091_01_000010 finished with diagnostics set to [Container failed, exitCode=-1000. [2021-01-24 21:07:17.742]Application application_1611301884780_0091 initialization failed (exitCode=255) with output: main : command provided 0
main : run as user is test01
main : requested yarn user is test01
User test01 not found

]]], Vertex did not succeed due to OWN_TASK_FAILURE

但是又出现新的问题,真是功夫都在细节里面,没有办法,做什么都不是那么顺利,只能说明自己的功夫不到家。

2021-01-24T21:16:05,290 ERROR [HiveServer2-Background-Pool: Thread-17373]: operation.Operation (:()) - Error running hive query: 
org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 1, vertexId=vertex_1611301884780_0092_1_00, diagnostics=[Task failed, taskId=task_1611301884780_0092_1_00_000001, diagnostics=[TaskAttempt 0 failed, info=[Error: Error while running task ( failure ) : attempt_1611301884780_0092_1_00_000001_0:java.lang.IllegalArgumentException: tez.runtime.io.sort.mb 3514 should be larger than 0 and should be less than the available task memory (MB):3276
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
	at org.apache.tez.runtime.library.common.sort.impl.ExternalSorter.getInitialMemoryRequirement(ExternalSorter.java:360)
	at org.apache.tez.runtime.library.output.OrderedPartitionedKVOutput.initialize(OrderedPartitionedKVOutput.java:97)
	at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask$InitializeOutputCallable._callInternal(LogicalIOProcessorRunt

上面的错误说的tez.runtime.io.sort.mb有些大了,先调整小为3000
2
想要干掉kerberos,怎么办呢?Ambari+HDP集群关闭kerberos认证后遇到的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warrah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值