最近集群准备升级到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. ORA-4031错误深入解析
  2. 用Spring Web Flow和Terracotta搭建Web应用
  3. 分布式(distributed)是什么意思?
  4. Linux PXE批量网络装机与Kickstart 无人值守安装
  5. 基于c语言中调试工具的用法汇总(不包含gdb)【转】
  6. python求无序列表中位数_详解Python如何获取列表(List)的中位数
  7. oracle12c安装详解,Oracle12C安装教程
  8. Python 绘制属于你的世界地图
  9. phpcms移动端和pc端_phpcms 实现PC端、手机端的双模版
  10. 身份证后四位是否唯一
  11. 【JAVA复习系列】第一部分
  12. 微信公众号、微信小程序的详细介绍
  13. 基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控
  14. b站React禹哥版视频笔记-React面向组件编程(上)
  15. python语言表白语句简单_简短的表白语句280句
  16. 完美解决:STM32CubeMX生成MDK项目报错
  17. 用日记APP来记录生活,再也不用担心无法坚持写日记
  18. 【题解】 [SCOI2012]滑雪
  19. python基于模糊推理的智能家居安防系统设计
  20. 【Java多数据源实现教程】实现动态数据源、多数据源切换方式

热门文章

  1. 关于arguments,caller以及匿名函数调用的问题
  2. 技术圈儿002---高并发整体可用性:一文详解降级、限流和熔断
  3. Sharding-Proxy安装_以及_sharding-proxy自动分表配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记019
  4. MyCat分布式数据库集群架构工作笔记0011---高可用_主从读写分离配置
  5. security工作笔记007---spring security自定义AuthenticationProvider,验证规则
  6. WaitForMultipleObjects函数有效值分析
  7. stl之截取:以一段字符串截取字符串
  8. 计算机视觉农作物检测,基于计算机视觉的农作物病害检测系统的研究
  9. ucc编译器(语法解析)
  10. python编程(multiprocessing库)