工程环境概述
java 8 ;maven;jfinal 3.3;hive 1.1.0-cdh5.4.1;
由于系统上云,需要在新的环境中重新部署。系统的功能是获取hive元数据,对元数据进行分析和生命周期管理等功能。框架采用JFinal和Cron4jPlugin插件实现任务定时调度。
部署工程中出现的问题
在部署的过程中主要存在两方面的问题,一方面是代码需要重新更新到最新的配置,例如一些ip更新,端口更新,还有代码需要和现在线上的hiveserver2版本相适应;另一方面是服务器环境的问题,此项目特殊之处在于需要hadoop角色进行启动,用此用户来访问hive。
代码问题
问题一:
hive配置文件在原代码中是使用localhost:8080方式来访问服务中的文件,但是这样需要修改tomcat的配置,使系统本身能通过接口访问tomcat中的配置文件。但是通过修改tomcat server.xml 中的Host配置节点,并没有解决这个问题。
原代码:
HiveConf.setHiveSiteLocation(new URL(hiveClientUrl));
HiveConf.setHiveSiteLocation(new URL("http://localhost:8080/hive-site/hive-site.xml"));
我们通过固定的文件存放路径,代替接口访问方式。
示例代码:
String confDir = "/opt/tomcat7/data/conf/hive-site-cloudprod-dp.xml";
URL url = new File(confDir).toURI().toURL();
HiveConf.setHiveSiteLocation(url);
logger.info("hiveClientUrl-------3:" + url);
HiveConf conf = new HiveConf();
client = new HiveMetaStoreClient(conf);
问题二:hive获取client失败,报Error loading PartitionExpressionProxy 错误,org.apache.hadoop.hive.ql.optimizer.ppr.PartitionExpressionForMetastore class not found。通过升级jar版本并没有解决这个问题。故从类上入手,加入hive.ql路径所在的hive-exec jar包,解决这个问题。
报错日志:
17:22:08.562 [Thread-4] ERROR org.apache.hadoop.hive.metastore.RetryingHMSHandler - java.lang.RuntimeException: Error loading PartitionExpressionProxy: org.apache.hadoop.hive.ql.optimizer.ppr.PartitionExpressionForMetastore class not found
at org.apache.hadoop.hive.metastore.ObjectStore.createExpressionProxy(ObjectStore.java:432)
at org.apache.hadoop.hive.metastore.ObjectStore.initializeHelper(ObjectStore.java:406)
at org.apache.hadoop.hive.metastore.ObjectStore.initialize(ObjectStore.java:340)
at org.apache.hadoop.hive.metastore.ObjectStore.setConf(ObjectStore.java:301
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
at org.apache.hadoop.hive.metastore.RawStoreProxy.<init>(RawStoreProxy.java:58)
at org.apache.hadoop.hive.metastore.RawStoreProxy.getProxy(RawStoreProxy.java:67)
at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.newRawStoreForConf(HiveMetaStore.java:628)
at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMSForConf(HiveMetaStore.java:594)
at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:588)
at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:655)
at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:431)
at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invokeInternal(RetryingHMSHandler.java:148)
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:107)
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:79)
at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:92)
at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:6891)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:164)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:129)
at com.husor.core.util.HiveMetaUtils.init(HiveMetaUtils.java:72)
at com.husor.core.util.HiveMetaUtils.getHiveClient(HiveMetaUtils.java:78)
at com.husor.lifecyclemodel.LifeCycleExec.checkTable(LifeCycleExec.java:106)
at com.husor.lifecyclemodel.LifeCycleExec.exec(LifeCycleExec.java:78)
at com.husor.core.plugin.job.LifeCycle.run(LifeCycle.java:16)
服务器环境问题
hadoop角色拥有文件夹权限。
启动脚本
chown -R hadoop:hadoop /opt/tomcat7/ ;su -s /bin/bash -c "sh /opt/tomcat7/bin/startup.sh" hadoop;tail -f /opt/tomcat7/logs/catalina.out;
解决方案
问题二解决方案:
升级hive-jdbc 从1.1.0 到2.3.5.
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.3.5</version>
</dependency>
添加缺少的类所在的包:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.5</version>
</dependency>