暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

0083.C cloudera中hive创建hbase表报错connection is closed处理过程

rundba 2021-08-18
2667

hive创建hbase表报错connection is closed",之前采用重启服务解决,本次又出现,经排查遇到hbase JIRA问题,后续建议关闭MOB特性,再使用时,通过hbase shell或java API方式开始,以关闭MOB方式进行设置后观察。

0.ENV

CentOS 7.8;

CDP 7.1.4;

当前启用kerberos。

1. 现象

hive创建hbase表报错connection is closed"

创建语句:

    CREATE EXTERNAL TABLE it01_hivebig (key string,CUST_NAME string,PHONE_NUM int,BRD_WORK_FLUX double)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,bd:CUST_NAME,bd:PHONE_NUM#b,bd:BRD_WORK_FLUX#b")
    TBLPROPERTIES ("hbase.table.name" = "it01_hivebig");

    提示"java.io.IOException: connection is closed",报错内容:

      Error while compiling statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. 
      MetaException(message:java.io.IOException: connection is closed at
      org.apache.hadoop.hbase.MetaTableAccessor.getMetaHTable(MetaTableAccessor.java:241) at
      org.apache.hadoop.hbase.MetaTableAccessor.getTableState(MetaTableAccessor.java:1116) at
      org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:440) at
      org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.prepareCreate(CreateTableProcedure.java:250) at
      org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.executeFromState(CreateTableProcedure.java:88) at
      org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.executeFromState(CreateTableProcedure.java:52) at
      org.apache.hadoop.hbase.procedure2.StateMachineProcedure.execute(StateMachineProcedure.java:194) at
      org.apache.hadoop.hbase.procedure2.Procedure.doExecute(Procedure.java:962) at
      org.apache.hadoop.hbase.procedure2.ProcedureExecutor.execProcedure(ProcedureExecutor.java:1662) at
      org.apache.hadoop.hbase.procedure2.ProcedureExecutor.executeProcedure(ProcedureExecutor.java:1409) at
      org.apache.hadoop.hbase.procedure2.ProcedureExecutor.access$1100(ProcedureExecutor.java:78) at
      org.apache.hadoop.hbase.procedure2.ProcedureExecutor$WorkerThread.run(ProcedureExecutor.java:1979) )

      使用当前普通用户在hue中,或者使用hbase用户在hbase shell中,通过hive创建hbase表,也同样报错,说明不是权限问题,是hbase问题。

      2. 问题处理过程

      1) 重启hbase

      之前出现过一次,当时由于Ranger的policy-cache缓存没更新过来,本次通过重启hbase服务暂时解决了问题,所以我们只能通过分析日志来争取找到问题原因。

      2) 查看完整的报错信息

      把Hbase服务的 master 及 region server 日志上传到本case。

      默认情况下hbase日志都是在各个服务角色所在节点下的/var/log/hbase/目录下面,但是为了保险起见,您先在CM->Hbase->配置 当中,查看hbase服务日志路径设置,之后到各个Hbase节点对应的目录下面把日志打包上传上来。

      上传信息:

      CM界面中所有MASTER日志、所有REGIONSERVER日志、所有HBASETHRIFTSERVER:

        hbase-cmf-hbase-MASTER-nn01.rundba.com.log.out
        hbase-cmf-hbase-REGIONSERVER-dn01.rundba.com.log
        hbase-cmf-hbase-HBASETHRIFTSERVER-nn01.rundba.com.log.out

        根据语句操作时间(或hbase重启时间)进一步查看日志。

        3) 是否使用Hbase的MOB功能--当前未使用

        经过确认,您的问题是遇到了如下的JIRA。

        https://issues.apache.org/jira/browse/HBASE-25166

        不知道您是否使用了Hbase的MOB功能?

        https://docs.cloudera.com/runtime/7.2.1/configuring-hbase/topics/hbase-configure-col-store-mobs.html

        根据上面的文档,您需要describe您的所有表,然后查看各个表是否有"IS_MOB => true"。

        如果没有的话,就没有使用MOB功能。

        # hbase shell

        list

        describe 'table1' #查看每个表的定义语句

        以it01_hivebig表为例,通过当前结果查看,表定义不包含“IS_MOB => true”,每个表的查询结果来看,所有表均不为开启MOB功能。

          hbase(main):012:0> describe 'it01_hivebig'
          Table it01_hivebig is ENABLED
          it01_hivebig
          COLUMN FAMILIES DESCRIPTION
          {NAME => 'bd', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER
          => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}

          1 row(s)

          QUOTAS
          0 row(s)
          Took 0.0737 seconds

          4) 建议关闭MOB

          既然没有使用MOB,您可以将MOB功能停止掉。

          在hbase service wide hbase-site.xml中,添加以下的两个参数。

              hbase.mob.compaction.chore.period=0
            hbase.master.mob.cleaner.period=0

            5) 关闭对业务的一些疑问咨询cloudera

            (1) 经贵公司分析后,MOB是否为最终原因?

            Answer: 这个问题很多客户都遇到,通过disable MOB以后,这个问题都消失了。

            (2) 重启hbase会对业务有何影响?

            Answer: 最好找个机会,可以停掉业务,重启Hbase服务。当然,您也可以rolling restart Hbase服务,这样做的话,您不需要停止业务。但Rolling restart有的时候,会造成一些Region in Transaction。

            (3) 如果后期用到MOB时,如何开启?

            Answer: 您可以参照以下的文档来启用MOB。

            https://docs.cloudera.com/runtime/7.2.1/configuring-hbase/topics/hbase-configure-col-store-mobs.html

            配置列来存储 MOB

            您可以使用 HBase Shell 或 Java API 配置一个列来存储 MOB。

            在 HBase Shell 或 Java API 中使用以下选项来配置用于存储 MOB 的列:

            IS_MOB指定该列是否可以存储 MOB。这是一个布尔选项,您可以在其中将其设置为 true或false。

            MOB_THRESHOLD配置将对象视为 MOB 的字节数。如果没有为 MOB_THRESHOLD 指定值,则默认值为 100 KB。如果写入的值大于此阈值,则将其视为 MOB。

            使用 HBase shell:

            hbase> create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 102400}

              hbase> alter 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 102400}

              使用 Java API:

              HColumnDescriptor hcd = new HColumnDescriptor(“f”);

                hcd.setMobEnabled(true);
                hcd.setMobThreshold(102400L);

                6) MOB和参数关系,如何关闭MOB 

                (1) 启用MOB和参数关联关系?

                答:我给您建议的两个参数是关于禁止MOB压缩与清理的功能。如果您没有使用MOB,最好直接禁用。

                如果您使用了MOB的话,可以有个变通的办法。您可以通过上面的功能将compaction与cleaner禁止。

                在需要的时候,手工在这个MOB表上执行"major_compact_mob"命令,可以达到一样的目的,但只是将自动改成手动。

                (2) 参数配置地方在哪?

                hbase service wide hbase-site.xml没有找到,是否是指在CM界面的hbase配置中,在如下xml中添加两个参数:

                  hbase-site.xml 的 HBase 服务高级配置代码段(安全阀) HBase(服务范围)

                  hbase.mob.compaction.chore.period=0

                  hbase.master.mob.cleaner.period=0

                答:您选择的地方是正常的,我给您的名字是英文的。

                3. 禁用MOB功能

                1) 禁用MOB

                CM--Hbase--配置,搜索“hbase-site.xml 的 HBase 服务高级配置代码段”,点击“+”,添加两个参数:

                名称:hbase.mob.compaction.chore.period,值0;

                名称:hbase.master.mob.cleaner.period,值0,点击保存更改。

                2) Hbase重启--非滚动重启

                Hbase重启,为避免临时或永久RIT(Region in Transaction),建议使用重启,而不是滚动重启。

                CM--Hbase右侧的3个点点图标--点击“重启”,后续再进行观察。

                4. 小结

                hive创建hbase表报错"java.io.IOException: connection is closed",之前出现过一次,当时由于Ranger的policy-cache缓存没更新过来,本次通过重启hbase服务暂时解决了问题。

                本次通过分析日志,结合使用经验,在目前hbase表未使用MOB情况下,建议关闭MOB,进一步观察,后续如果需要启用MOB,可通过上文HBase Shell或Java API配置一个列来存储 MOB。

                5. ref

                https://issues.apache.org/jira/browse/HBASE-25166

                https://docs.cloudera.com/runtime/7.2.1/configuring-hbase/topics/hbase-configure-col-store-mobs.html

                文章转载自rundba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论