启动HiveServer2抛出"java.lang.IllegalArgumentException: Invalid time unit l"异常

部署Hive后启动HiveServer2居然抛出了以下的异常:

反复检查了配置文件,配置都是正确,就是启动失败,实在没有办法只能根据错误信息排查。

* 找到HiveConf.java-->unitFor(String unit, TimeUnit defaultUnit)方法,通过代码可以看出是因为unit这个变量都是false才抛出的异常,那么就继续看是哪里调用了这个方法。

 1   public static TimeUnit unitFor(String unit, TimeUnit defaultUnit) {
 2     unit = unit.trim().toLowerCase();
 3     if (unit.isEmpty()) {
 4       if (defaultUnit == null) {
 5         throw new IllegalArgumentException("Time unit is not specified");
 6       }
 7       return defaultUnit;
 8     } else if (unit.equals("d") || unit.startsWith("day")) {
 9       return TimeUnit.DAYS;
10     } else if (unit.equals("h") || unit.startsWith("hour")) {
11       return TimeUnit.HOURS;
12     } else if (unit.equals("m") || unit.startsWith("min")) {
13       return TimeUnit.MINUTES;
14     } else if (unit.equals("s") || unit.startsWith("sec")) {
15       return TimeUnit.SECONDS;
16     } else if (unit.equals("ms") || unit.startsWith("msec")) {
17       return TimeUnit.MILLISECONDS;
18     } else if (unit.equals("us") || unit.startsWith("usec")) {
19       return TimeUnit.MICROSECONDS;
20     } else if (unit.equals("ns") || unit.startsWith("nsec")) {
21       return TimeUnit.NANOSECONDS;
22     }
23     throw new IllegalArgumentException("Invalid time unit " + unit);
24   }

* 通过错信息知道是HiveConf.java-->toTime(String value, TimeUnit inputUnit, TimeUnit outUnit)方法调用了unitFor方法,并且传递处理后的value值,继续看代码。

1   public static long toTime(String value, TimeUnit inputUnit, TimeUnit outUnit) {
2     String[] parsed = parseTime(value.trim());
3     return outUnit.convert(Long.valueOf(parsed[0].trim().trim()), unitFor(parsed[1].trim(), inputUnit));
4   }

* 通过错信息知道是HiveConf.java-->getTimeVar(Configuration conf, ConfVars var, TimeUnit outUnit)方法调用了toTiime方法,并且通过getVar(conf, var)方法传递处理后的var值,继续看代码。

1   public static long getTimeVar(Configuration conf, ConfVars var, TimeUnit outUnit) {
2     return toTime(getVar(conf, var), getDefaultTimeUnit(var), outUnit);
3   }

* getTimeVar方法被CLIServer.java-->getOperationStatus方法调用了,继续看代码。

 1   public OperationStatus getOperationStatus(OperationHandle opHandle)
 2       throws HiveSQLException {
 3     Operation operation = sessionManager.getOperationManager().getOperation(opHandle);
 4     /**
 5      * If this is a background operation run asynchronously,
 6      * we block for a configured duration, before we return
 7      * (duration: HIVE_SERVER2_LONG_POLLING_TIMEOUT).
 8      * However, if the background operation is complete, we return immediately.
 9      */
10     if (operation.shouldRunAsync()) {
11       HiveConf conf = operation.getParentSession().getHiveConf();
12       long timeout = HiveConf.getTimeVar(conf,
13           HiveConf.ConfVars.HIVE_SERVER2_LONG_POLLING_TIMEOUT, TimeUnit.MILLISECONDS);
14       try {
15         operation.getBackgroundHandle().get(timeout, TimeUnit.MILLISECONDS);
16       } catch (TimeoutException e) {
17         // No Op, return to the caller since long polling timeout has expired
18         LOG.trace(opHandle + ": Long polling timed out");
19       } catch (CancellationException e) {
20         // The background operation thread was cancelled
21         LOG.trace(opHandle + ": The background operation was cancelled", e);
22       } catch (ExecutionException e) {
23         // The background operation thread was aborted
24         LOG.warn(opHandle + ": The background operation was aborted", e);
25       } catch (InterruptedException e) {
26         // No op, this thread was interrupted
27         // In this case, the call might return sooner than long polling timeout
28       }
29     }
30     OperationStatus opStatus = operation.getStatus();
31     LOG.debug(opHandle + ": getOperationStatus()");
32     sessionManager.clearIpAddress();
33     return opStatus;
34   }

* 在上面的方法有以下这句代码。

1 long timeout = HiveConf.getTimeVar(conf, HiveConf.ConfVars.HIVE_SERVER2_LONG_POLLING_TIMEOUT, TimeUnit.MILLISECONDS);

* 可以看到是把HiveConf.ConfVars.HIVE_SERVER2_LONG_POLLING_TIMEOUT这个参数的值传递到getTimeVar方法的,现在看看这个参数。

1 HIVE_SERVER2_LONG_POLLING_TIMEOUT("hive.server2.long.polling.timeout", "5000ms", new TimeValidator(TimeUnit.MILLISECONDS))

* 对应配置文件的hive.server2.long.polling.timeout参数,在hive-site.xml查看这个值是多少。

1 <property>
2   <name>hive.server2.long.polling.timeout</name>
3   <value>5000L</value>
4   <description>Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling</description>
5 </property>

* 可以看到这个参数对应的值是5000L,回头看看抛出异常的方法,发现if语句的判断根本没有L这个单位,到这就明白了原来是配置文件错是一个BUG,把配置文件这个参数值单位修改为ms,问题解决。

1 <property>
2   <name>hive.server2.long.polling.timeout</name>
3   <value>5000ms</value>
4   <description>Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling</description>
5 </property>

使用的版本是:hive-0.13.1-cdh5.2.1,已经确认后续的版本已经修复这个BUG。

时间: 2024-11-01 07:57:50

启动HiveServer2抛出"java.lang.IllegalArgumentException: Invalid time unit l"异常的相关文章

spring3.2的架构在tomcat6.0中无法正常启动,抛出java.lang.NoClassDefFoundError: javax/servlet/AsyncListener错误

原因: 1:org.springframework.web.servlet-3.2支持Servlet3.0的版本. 2:tomcat6.0只支持Servlet2.5,而tomcat7.0支持Servlet3.0. 从而造成需求方和供应方对Servlet版本的不兼容. 解决方案: 将tomcat6.0/lib文件夹下的servlet-api.jar文件替换为tomcat7.0的. 注意:一定要替换tomcat/lib下的jar,如果放到WEB-INF/lib中同样会报错. 原因:tomcat6.0

mybatis的判定时间字段问题 java.lang.IllegalArgumentException: invalid comparison: cn.hutool.core.date.DateTime and java.lang.String

今天听组员说: mybatis在3.30版本及以上判定时间时 <if test="date_time != null and date_time != '' "> date_time, </if> java.lang.IllegalArgumentException: invalid comparison: cn.hutool.core.date.DateTime and java.lang.String 去掉 and date_time != ' ' 就可以正

android 如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常

该类问题的分析,一般是需要找到bitmap对象在那个位置有被recyle,然后再检查代码. 如何定位到是在哪个代码位置有把bitmap 对象recyle,可以在 Bitmap.java的recycle方法中,加log打印出call stack来定位. 具体的修改参考如下: public void recycle() { if (!mRecycled) { if (nativeRecycle(mNativeBitmap)) { // return value indicates whether n

tomcat启动报错:java.lang.IllegalArgumentException: Document base D:\apache-tomcat-6.0.45\webapps\activiti-explorer does not exist or is not a readable directory

java.lang.IllegalArgumentException: Document base D:\apache-tomcat-6.0.45\webapps\erp does not exist or is not a readable directory at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142) at org.apache.catalina.core.Standard

【Servlet+Struts2】文件下载时抛出java.lang.IllegalStateException异常的解决方法

java.lang.IllegalStateException这种异常,不代表文件不能下载,不代表程序写错,它在Tomcat抛出完异常之后依然能够正常运行的.只是看着不爽而已,每次下载都要在Tomcat抛出一大堆异常. java.lang.IllegalStateException主要是用了后台把文件丢进respond的缓冲区,然后respond再把下载的文件扔回JSP的情况所造成的.Servlet与Struts2反正是JSP都有可能存在.其主要原因JSP在对缓冲区读,后台JAVA在对缓冲写所导

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

微信小程序前后台使用get方式传参时报错如图.但在微信开发平台和苹果测试都没事,在安卓手机上就报这个错,猜想原因是get传递了汉字的原因. 尝试了下在后台输出从前台获取的参数,但是后台什么也没有获取到,直接报错. 最后用id替换了url里的中文:因为搜索功能不能替换中文的,改成了post请求. 参考:[Java EE]get和post请求的编码过程get请求中文参数乱码的解决之道 网上也有很多报这个错的原因是含有特殊字符:有些版本的Tomcat严格按照 RFC 3986规范进行访问解析,而 RF

java.lang.IllegalArgumentException: Invalid character found in the request target.

http参数存在特殊字符: 特殊字符是出现在后面跟的参数中,对参数进行 URL 编码,可以使用 JavaScript 中的 encodeURIComponent() 函数. 原文地址:https://www.cnblogs.com/YuyuanNo1/p/9717274.html

mybatis报错:java.lang.IllegalArgumentException: invalid comparison: java.util.Arrays$ArrayList and java.lang.String

一开始,我的写法是在java中给这个变量赋值时,直接分割,引号包起来,然后再mybatis中的这个SQL中直接用${}引用,效果是能达到,后被告知这样会有被攻击的可能.便改成:赋值前转成list,然后再mybatis中遍历. 遍历: 一开始里面没用 ,jdbcType=VARCHAR ,报错....jdbcType...,网上找了需要加上这个. 报错: 原因:传入的东西是list,不能用""来比较 修改:那个判断条件" != null " 去掉或者改成size都可

mybatis报Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串''进行对比判断则会引发异常. 所以在上面的代码中去该该判断, 只保留非空判断就正常了 <if test="createTime != null and createTime !='' " >  date(create_time) = date(#{createTime,jdbcType=TIMESTAMP}) </if> 改为 <if test="