最近集群准备升级到cdh5.2.0,并使用tez,在测试集群cdh5.2.0已经稳定运行了很长时间,因此开始折腾hive on tez了,期间遇到不少问题,这里记录下。

hive on tez的部署比较简单,可以参考wiki.主要注意几个地方

1.编译的时候

mvn clean package -Dtar -DskipTests=true -Dmaven.javadoc.skip=true

2.需要将tez相关的包upload到hdfs中,并设置tez-site.xml

  <property><name>tez.lib.uris</name><value>${fs.defaultFS}/tez,${fs.defaultFS}/tez/lib</value></property>

设置mapred-site.xml

  <property><name>mapreduce.framework.name</name><value>yarn-tez</value></property>

3.注意更新hadoop-env.sh中classpath的设置

export TEZ_HOME=/home/vipshop/platform/tez
for jar in `ls $TEZ_HOME |grep jar`; doexport HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; doexport HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/lib/$jar
done

否则会报如下错误(加载不到对应的tez相关类,导致Cluster 初始化时失败):

java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:120)at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:82)at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:75)at org.apache.hadoop.mapreduce.Job$9.run(Job.java:1265)at org.apache.hadoop.mapreduce.Job$9.run(Job.java:1261)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:396)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)at org.apache.hadoop.mapreduce.Job.connect(Job.java:1260)at org.apache.hadoop.mapreduce.Job.submit(Job.java:1289)at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1313)at org.apache.hadoop.mapreduce.SleepJob.run(SleepJob.java:261)at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)at org.apache.hadoop.mapreduce.SleepJob.main(SleepJob.java:194)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:72)at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:145)at org.apache.hadoop.test.MapredTestDriver.run(MapredTestDriver.java:118)at org.apache.hadoop.test.MapredTestDriver.main(MapredTestDriver.java:126)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

部署完毕后,使用hadoop jar提交tez job运行正常,测试hive on tez:

hive -hiveconf hive.execution.engine=tez -hiveconf hive.root.logger=DEBUG,console

出现如下报错:

Exception in thread "main" java.lang.NoSuchMethodError:
org.apache.tez.mapreduce.hadoop.MRHelpers.updateEnvironmentForMRAM(Lorg/apache/hadoop/conf/Configuration;Ljava/util/Map;)Vat org.apache.hadoop.hive.ql.exec.tez.TezSessionState.open(TezSessionState.java:182)at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.open(TezSessionState.java:123)at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:355)at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681)at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:625)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

从堆栈上来看是由于session初始化异常导致,

org.apache.hadoop.hive.cli.CliDriver.main->org.apache.hadoop.hive.cli.CliDriver.run->
org.apache.hadoop.hive.ql.session.SessionState.start

在SessionState.start方法中:

 if (HiveConf.getVar(startSs.getConf(), HiveConf.ConfVars.HIVE_EXECUTION_ENGINE)  .equals( "tez") && (startSs.isHiveServerQuery == false)) { //如果设置hive.execution.engine为tez(默认为mr)try {if (startSs.tezSessionState == null) {startSs.tezSessionState = new TezSessionState(startSs.getSessionId()); //实例化一个TezSessionState对象}startSs.tezSessionState.open(startSs.conf ); //调用TezSessionState.open方法} catch (Exception e) {throw new RuntimeException(e);}} else {LOG.info( "No Tez session required at this point. hive.execution.engine=mr.");}

TezSessionState.open中,首先使用createTezDir创建临时文件目录

    // create the tez tmp dirtezScratchDir = createTezDir(sessionId);String dir = tezScratchDir.toString();// Localize resources to session scratch dirlocalizedResources = utils.localizeTempFilesFromConf(dir, conf); //DagUtils.localizeTempFilesFromConf方法List<LocalResource> handlerLr = utils.localizeTempFiles(dir, conf, additionalFiles); // DagUtils.localizeTempFiles方法if (handlerLr != null) {if (localizedResources == null) {localizedResources = handlerLr;} else {localizedResources.addAll(handlerLr);}additionalFilesNotFromConf = new HashSet<String>();for (String originalFile : additionalFiles) {additionalFilesNotFromConf.add(originalFile);}}// generate basic tez configTezConfiguration tezConfig = new TezConfiguration(conf); //然后实例化一个TezConfiguration对象tezConfig.set(TezConfiguration.TEZ_AM_STAGING_DIR, tezScratchDir.toUri().toString()); //设置tez的staging目录,设置项为tez.staging-dir,默认值为/tmp/tez/staging
//这里默认最终为"/tmp/hive-" + System. getProperty( "user.name")/_tez_session_dir/sessionIdappJarLr = createJarLocalResource(utils.getExecJarPathLocal()); //localize hive-exec.jar// configuration for the application masterMap<String, LocalResource> commonLocalResources = new HashMap<String, LocalResource>();commonLocalResources.put( utils.getBaseName( appJarLr), appJarLr );if (localizedResources != null) {for (LocalResource lr : localizedResources) {commonLocalResources.put( utils.getBaseName(lr), lr);}}// Create environment for AM.Map<String, String> amEnv = new HashMap<String, String>();MRHelpers.updateEnvironmentForMRAM(conf, amEnv); //调用MRHelpers类的updateEnvironmentForMRAM方法

对于org.apache.tez.mapreduce.hadoop.MRHelpers类来说,在0.5.0中,这个updateEnvironmentForMRAM方法是不存在的,对应存在updateEnvBasedOnMRTaskEnv(配置Mappers和Reducers的环境变量)和updateEnvBasedOnMRAMEnv(配置am的环境变量)

public static void updateEnvBasedOnMRAMEnv(Configuration conf, Map<String, String> environment) {TezYARNUtils.appendToEnvFromInputString(environment, conf.get(MRJobConfig.MR_AM_ADMIN_USER_ENV),File.pathSeparator);TezYARNUtils.appendToEnvFromInputString(environment, conf.get(MRJobConfig.MR_AM_ENV),File.pathSeparator);
}

而在0.4.1-incubating中是有updateEnvironmentForMRAM这个方法的:

public static void updateEnvironmentForMRAM(Configuration conf, Map<String, String> environment) {TezYARNUtils.setEnvFromInputString(environment, conf.get(MRJobConfig.MR_AM_ADMIN_USER_ENV),File.pathSeparator);TezYARNUtils.setEnvFromInputString(environment, conf.get(MRJobConfig.MR_AM_ENV),File.pathSeparator);
}

对应的hive中:
hive0.13中:

    // Create environment for AM.Map<String, String> amEnv = new HashMap<String, String>();MRHelpers.updateEnvironmentForMRAM(conf, amEnv);

hive0.14中:

    // Create environment for AM.      Map<String, String> amEnv = new HashMap<String, String>();      MRHelpers.updateEnvBasedOnMRAMEnv(conf, amEnv);

可以看到0.4.x到0.5.x版本的tez api变动比较大,0.5.x的tez已经和hive0.13.x不能兼容了,要想使用tez-0.5.x版本,必须使用hive0.14.x版本。        
在github下载hive0.14的源码,编译并测试运行hive on tez:
https://codeload.github.com/apache/hive/zip/branch-0.14

mvn clean package -DskipTests -Phadoop-2 -Pdist

转载于:https://blog.51cto.com/caiguangguang/1604087

hive on tez踩坑记1-hive0.13 on tez相关推荐

  1. hive on tez踩坑记2-hive0.14 on tez

    在测试hive0.14.0 on tez时遇到的问题比较多: 1.在使用cdh5.2.0+hive0.14.0+tez-0.5.0测试时,首先遇到下面的问题 java.lang.NoSuchMetho ...

  2. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  3. 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题

    ❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...

  4. Spring @Transactional踩坑记

    @Transactional踩坑记 总述 ​ Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...

  5. 服务器重新部署踩坑记

    服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...

  6. IdentityServer 部署踩坑记

    IdentityServer 部署踩坑记 Intro 周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目,踩了几个坑,在此记录分享一下. 部署架构 项目是 ...

  7. windows container 踩坑记

    windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...

  8. Spark踩坑记——数据库(Hbase+Mysql)转

    转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...

  9. android小程序_小程序踩坑记

    小程序踩坑记 希望这个文章能尽量记录下小程序的那些坑,避免开发者们浪费自己的生命来定位到底是自己代码导致的还是啥神秘的字节跳变原因. 前记 小程序大多数坑是同一套代码在不同平台上表现不一致导致的,微信 ...

最新文章

  1. 数据库设计的三大范式
  2. rabbitmq 限制速度_技术干货分享:RabbitMQ消息积压的几种解决思路
  3. python 生成code128c
  4. 8086数据寄存器介绍
  5. AOL、WebEx共同开发新AIM即时通讯
  6. jolokia_Hawtio和Jolokia的Hibernate统计
  7. 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
  8. CSDN创作的markdown语法效果示意图
  9. ubuntu 安装php redis,ubuntu上安装php redis
  10. html流星雨代码_HTML制作流星雨特效
  11. Shell 编程知识点集锦
  12. lisp 任意点 曲线距离_lisp程序能求多段线上任意一点到其中一个端点的距离,,每次要量桩号很烦...哪位大侠给个..谢谢了...........
  13. 面试官:设计一个对外的接口,需要考虑那些安全问题?我有点懵...
  14. OnlyOffice在线部署
  15. 掌握这2个关键点,轻松摆脱沉迷游戏的现状(醍醐灌顶)
  16. 大学生创新创业类竞赛参赛指南
  17. UE脱机激活如何不拔网线实现在线激活
  18. 千峰JAVA逆战班Day34
  19. 【FXCG】海龟交易法的使用方法和注意事项
  20. 支付宝小程序使用MQTT over WebSocket连接阿里云IoT物联网平台

热门文章

  1. ES9新特性_ES9扩展运算符与rest参数---JavaScript_ECMAScript_ES6-ES11新特性工作笔记053
  2. OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
  3. SpringCloud工作笔记066---断路器(Curcuit Breaker)模式
  4. springcache使用笔记003_注释驱动的 Spring cache 基本原理,注意和限制,@CacheEvict 的可靠性问题
  5. Java中遍历文件夹的2种方法
  6. 随想录(产品-工程开发-算法)
  7. ftk学习记(脚本篇)
  8. 一步一步写算法(之 回数)
  9. oracle存储过程遍历,oracle存储过程中遍历的疑惑
  10. 基于51单片机LCD1602电子时钟实物制作