hive整合过程中导致hive重启后报错的问题分析

@[Hive整合 hbase添加phoenix jar导致hive启动异常分析

软件环境:hbase 1.2.6 hive2.3.2 hadoop2.7.6

硬件环境:centos 7

问题描述:

HBASE添加phoenix支持需要在hbase的lib目录添加phoenix的jar。重启hive服务时报如下错误:
[hadoop@hadoop01 ~]$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/apps/hbase-1.2.6/lib/phoenix-4.14.1-HBase-1.2-hive.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/apps/hbase-1.2.6/lib/phoenix-4.14.1-HBase-1.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.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.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread “main” java.lang.NoSuchMethodError: com.ibm.icu.impl.ICUBinary.getRequiredData(Ljava/lang/String;)Ljava/nio/ByteBuffer;
at com.ibm.icu.charset.UConverterAlias.haveAliasData(UConverterAlias.java:131)
at com.ibm.icu.charset.UConverterAlias.getCanonicalName(UConverterAlias.java:525)
at com.ibm.icu.charset.CharsetProviderICU.getICUCanonicalName(CharsetProviderICU.java:126)
at com.ibm.icu.charset.CharsetProviderICU.charsetForName(CharsetProviderICU.java:62)
at java.nio.charset.Charset$2.run(Charset.java:412)
at java.nio.charset.Charset 2. r u n ( C h a r s e t . j a v a : 407 ) a t j a v a . s e c u r i t y . A c c e s s C o n t r o l l e r . d o P r i v i l e g e d ( N a t i v e M e t h o d ) a t j a v a . n i o . c h a r s e t . C h a r s e t . l o o k u p V i a P r o v i d e r s ( C h a r s e t . j a v a : 406 ) a t j a v a . n i o . c h a r s e t . C h a r s e t . l o o k u p 2 ( C h a r s e t . j a v a : 477 ) a t j a v a . n i o . c h a r s e t . C h a r s e t . l o o k u p ( C h a r s e t . j a v a : 464 ) a t j a v a . n i o . c h a r s e t . C h a r s e t . f o r N a m e ( C h a r s e t . j a v a : 528 ) a t c o m . s u n . o r g . a p a c h e . x m l . i n t e r n a l . s e r i a l i z e r . E n c o d i n g s 2.run(Charset.java:407) at java.security.AccessController.doPrivileged(Native Method) at java.nio.charset.Charset.lookupViaProviders(Charset.java:406) at java.nio.charset.Charset.lookup2(Charset.java:477) at java.nio.charset.Charset.lookup(Charset.java:464) at java.nio.charset.Charset.forName(Charset.java:528) at com.sun.org.apache.xml.internal.serializer.Encodings 2.run(Charset.java:407)atjava.security.AccessController.doPrivileged(NativeMethod)atjava.nio.charset.Charset.lookupViaProviders(Charset.java:406)atjava.nio.charset.Charset.lookup2(Charset.java:477)atjava.nio.charset.Charset.lookup(Charset.java:464)atjava.nio.charset.Charset.forName(Charset.java:528)atcom.sun.org.apache.xml.internal.serializer.EncodingsEncodingInfos.findCharsetNameFor(Encodings.java:386)
at com.sun.org.apache.xml.internal.serializer.Encodings E n c o d i n g I n f o s . f i n d C h a r s e t N a m e F o r ( E n c o d i n g s . j a v a : 422 ) a t c o m . s u n . o r g . a p a c h e . x m l . i n t e r n a l . s e r i a l i z e r . E n c o d i n g s EncodingInfos.findCharsetNameFor(Encodings.java:422) at com.sun.org.apache.xml.internal.serializer.Encodings EncodingInfos.findCharsetNameFor(Encodings.java:422)atcom.sun.org.apache.xml.internal.serializer.EncodingsEncodingInfos.loadEncodingInfo(Encodings.java:450)
at com.sun.org.apache.xml.internal.serializer.Encodings E n c o d i n g I n f o s . &lt; i n i t &gt; ( E n c o d i n g s . j a v a : 308 ) a t c o m . s u n . o r g . a p a c h e . x m l . i n t e r n a l . s e r i a l i z e r . E n c o d i n g s EncodingInfos.&lt;init&gt;(Encodings.java:308) at com.sun.org.apache.xml.internal.serializer.Encodings EncodingInfos.<init>(Encodings.java:308)atcom.sun.org.apache.xml.internal.serializer.EncodingsEncodingInfos.(Encodings.java:296)
at com.sun.org.apache.xml.internal.serializer.Encodings.(Encodings.java:564)
at com.sun.org.apache.xml.internal.serializer.ToStream.(ToStream.java:134)
at com.sun.org.apache.xml.internal.serializer.ToXMLStream.(ToXMLStream.java:67)
at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.(ToUnknownStream.java:143)
at com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory.getSerializationHandler(TransletOutputHandlerFactory.java:160)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputHandler(TransformerImpl.java:446)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)
at org.apache.hadoop.conf.Configuration.writeXml(Configuration.java:2707)
at org.apache.hadoop.conf.Configuration.writeXml(Configuration.java:2686)
at org.apache.hadoop.hive.conf.HiveConf.getConfVarInputStream(HiveConf.java:3628)
at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:4051)
at org.apache.hadoop.hive.conf.HiveConf.(HiveConf.java:4003)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:81)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:65)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:702)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
[hadoop@hadoop01 ~]$ nohup hive --skiphbasecp --service metastore
nohup: ignoring input and appending output to `nohup.out’

问题分析:

1、看到这个问题首先百度了一番,只了解到是由于phoenix的jar包引起(验证确实是phoenix的jar的原因),但并未找到有效的解决方法。

2、在虚拟机搭建集群希望重现这个问题及能够大胆的各种操作去解决问题,通过虚拟机验证是正常的。

3、查看hive服务脚本,可以发现hive启动时会用到$HADOOP_CLASSPATH及加载spark、hive、hbase等目录下的jar包到HADOOP_CLASSPATH环境变量。

修改hive脚本在扫描hbase classpath的地方添加phoenix jar包过滤无效,如下:

在这里插入图片描述

最后排查export HADOOP_CLASSPATH=xxx的地方,定位到hadoop目录下的hadoop-evn.sh中有加载了hbase的目录。这是由于之前spark+hbase程序异常解决添加进来的(论做操作记录的重要性,没有头绪的时候查看记录可能会有新的发现)。
在这里插入图片描述

问题解决:

首先去掉该条export HADOOP_CLASSPATH=xxx,验证hive、hbase、phoenix能正常使用。但这样spark+hbase的问题又会重新暴露,拷贝hbase lib(无phoenix jar)到一个新的目录lib-hbase,export HADOOP_CLASSPATH=xxx/lib-hbase/*即可。问题实际的根本是phoenix jar中的icu包和hive/lib下的icu4j的包冲突了,或者移除hive/lib下的icu4j包,环境正常。

链接:https://www.jianshu.com/p/1501e59420e4

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值