CDH Hue连接Hbase报错TSocket read 0 bytes

    技术2022-07-11  128

    问题描述

    安装好CDH集群后,在Hue中查看HBase信息时,Hue界面报错如下:

    Api 错误:TSocket read 0 bytes

    Hue日志报错:

    exceptions_renderable ERROR Potential trace: [('/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hue/apps/hbase/src/hbase/api.py', 46, 'query', 'return getattr(self, action)(*args)'), ('/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hue/apps/hbase/src/hbase/api.py', 142, 'getTableList', "return [{'name': name, 'enabled': client.isTableEnabled(name, doas=self.user.username)} for name in client.getTableNames(doas=self.user.username)]"), ('/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hue/desktop/core/src/desktop/lib/thrift_util.py', 420, 'wrapper', 'raise StructuredThriftTransportException(e, error_code=502)')]

    HBase Thrift日志没有相关信息输出。

    解决

    启用安全

    这里指启用TLS/SSL安全,thrift服务无法连接kerberos安全的hbase。

    修改HBase配置如下:

    配置值hbase.regionserver.thrift.httptruehbase.thrift.support.proxyusertrue

    重启服务即可。

    未启用安全

    修改HBase配置如下:

    配置值hbase.regionserver.thrift.httptruehbase.thrift.support.proxyuserfalse

    重启服务即可。

    解决过程记录

    环境

    服务版本OSCentos7.8Cloudera Manager6.3.1CDH6.3.2

    探索和分析

    出了问题,没有头绪,于是开始在网上搜索解决方案。 在Cloudera社区找到了两个相关的问题及其解决方案,不过都没有解决问题。 这里贴出链接: 讨论一:https://community.cloudera.com/t5/Support-Questions/Hue-hbase-Api-Error-TSocket-read-0-bytes/td-p/21070 讨论二:https://community.cloudera.com/t5/Support-Questions/CDH-6-3-3-Hue-Hbase-Api-Error-TSocket-read-0-bytes/m-p/297091

    另外也参考了Hue官方文档集成HBase的说明,主要内容如下:

    Have HBase and Thrift Service 1 initiated (Thrift can be configured through Cloudera Manager or manually). Look at the HBase service configuration and check to see if the “Enable HBase Thrift Server Framed Transport” property is enabled. If it is, try unchecking it or set ‘thrift_transport=framed’ in the [hbase] section of the hue.ini.

    在按照上述两个讨论和Hue官方文档分别操作之后,问题没有得到解决。 根据讨论一,发现Hue貌似只支持Thrift1,而不支持Thrift2,不过讨论一是2014年的,时间有点久远了。 Hue官方文档在2020年初更新过,但是也明确说了使用Thrift1。

    CDH的HBase Thrift服务应该是Thrift1。

    现在看来,这个问题貌似无解了,不过通过对这几个资料的仔细研读,我的注意力集中到以下两个配置上。

    服务配置说明HBaseEnable HBase Thrift Server Framed Transport (hbase.regionserver.thrift.framed)启用 HBase Thrift 服务器框架运输Hue[hbase] thrift_transportHBase Thrift运输配置,默认值是buffered

    通过理解这两个配置,我发现这两个配置应该是需要保持同步的,但是在讨论一和Hue文档中,所作的操作最终使这两个配置不同步了。于是我决定尝试使两个配置保持同步。

    HBase保持原始配置不要动,我安装好的HBase有关Thrift的原始相关配置如下:

    配置值hbase.regionserver.thrift.compacttruehbase.regionserver.thrift.framedtruehbase.regionserver.thrift.server.typeTThreadPoolServer

    虽然我对这几个配置不是很了解,但是请保持这样配置。

    Hue配置中,找到 hue_safety_valve.ini 的 Hue 服务高级配置代码段(安全阀),添加如下配置:

    [hbase] thrift_transport=framed

    保存配置后,重启Hue服务,再次在Hue中访问HBase,可以成功访问,HBase Thrift日志也出现相应的输出信息。

    虽然可以解决了本文开篇提到的问题,但是Hue的配置检测结果提示: 这个提示说明,这样配置不对。

    于是继续搜索解决方案,发现许多文章引用了一个Stack Overflow的讨论。 地址:https://stackoverflow.com/questions/20415493/api-error-tsocket-read-0-bytes-when-using-hue-with-hbase

    按照这个尝试,完美解决了问题。

    其实在上面谈到HBase Thrift日志没有输出信息时,我就该想到可能是thrift服务连接不上,通过恢复HBase和Hue配置,进行Hue配置检测,发现以下问题: 这里啰嗦了这么多,只是为了提供更多的相关的内容,毕竟有时候问题相同,原因确实不同。

    Processed: 0.017, SQL: 10