让Hive跑在tez上

 Tez是从MapReduce计算框架演化而来的通用DAG计算框架,可作为MapReduceR/Pig/Hive等系统的底层数据处理引擎,它天生融入Hadoop 2.0中的资源管理平台YARN。

 
Tez有以下几个特色:
(1) 丰富的数据流接口;
(2) 扩展性良好的“Input-Processor-Output”运行模型;
(3) 简化数据部署(充分利用了YARN框架,Tez本身仅是一个客户端编程库,无需事先部署相关服务)
(4) 性能优于MapReduce
(5) 优化的资源管理(直接运行在资源管理系统YARN之上)
(6) 动态生成物理数据流
 
hive on tez,直接配置hive支持tez,其实是在yarn上面启动一个app,这个app永久运行,接受不同sql,除非退出hive cli此app才会结束
tez runing app在yarn上面和spark on yarn很类似,而且tez,spark底层原理也很相似!
在切换底层为mr引擎的时候也会重启app运行,但是tez那个app也没结束,等待mr app运行结束后,两个一起结束!
 
原本打算自己编译的,发现编译到tez-ui的时候总是报错,除非跳过不使用tez-ui;多次编译都是失败了,暂时先放一边了;直接使用官网已经编译好的包吧;
 
备注:Tez-ui是一个 Web界面可以看到Job的信息的执行时间,通过它可以更好、更直观的了解到程序慢在哪个位置;
 
集群测试环境:
192.168.18.56 spark.hd1        [NameNode]
192.168.18.57 spark.hd2 [DataNode]
192.168.18.58 spark.hd3 [DataNode]
 
在NameNode节点上操作:
 
#官网下载Tez包:
 https://mirrors.tuna.tsinghua.edu.cn/apache/tez/0.8.4/apache-tez-0.8.4-bin.tar.gz
#解压:
 
  1. tar xf apache-tez-0.8.4-bin.tar.gz 
  2. cd apache-tez-0.8.4-bin 
 
#由于要把tez.tar.gz包上传到HDFS上面,所以在HDFS创建一个目录:
 
  1. [otouser@spark apache-tez-0.8.4-bin]$ hdfs dfs -mkdir /app 
  2. 上传文件到/app目录下: 
  3. [otouser@spark apache-tez-0.8.4-bin]$ hdfs dfs -put share/tez.tar.gz /app 
  4.  
  5. #检查是否上传成功: 
  6. [otouser@spark apache-tez-0.8.4-bin]$ hdfs dfs -ls /app 
  7. Found 1 items 
  8. -rw-r--r--   2 otouser supergroup   42892768 2016-12-23 13:52 /app/tez.tar.gz 
 
#添加tez-site.xml修改配置文件,让tez支持Hive:
cd hadoop/etc/hadoop/  Hadoop的配置目录下;cat tez-site.xml
 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
  3. <configuration> 
  4. <property> 
  5.     <name>tez.lib.uris</name> 
  6.     <value>${fs.defaultFS}/app/tez.tar.gz</value> 
  7. </property> 
  8. <property> 
  9.    <name>tez.history.logging.service.class</name> 
  10.    <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value> 
  11.  </property> 
  12.  
  13.  <property> 
  14.   <description>URL for where the Tez UI is hosted</description> 
  15.   <name>tez.tez-ui.history-url.base</name> 
  16.   <value>http://spark.hd1:9999/tez-ui/</value> 
  17.  </property> 
  18.  
  19. <property> 
  20.     <name>tez.runtime.convert.user-payload.to.history-text</name> 
  21.     <value>true</value> 
  22. </property> 
  23. <property> 
  24.     <name>tez.task.generate.counters.per.io</name> 
  25.     <value>true</value> 
  26. </property> 
  27. </configuration> 
yarn-site.xml 添加以下几行配置:用于tez-ui获取tez引擎的数据;
 
  1. <configuration> 
  2. <property> 
  3.     <name>yarn.timeline-service.enabled</name> 
  4.     <value>true</value> 
  5. </property> 
  6. <property> 
  7.     <name>yarn.timeline-service.hostname</name> 
  8.     <value>spark.hd1</value> 
  9. </property> 
  10. <property> 
  11.     <name>yarn.timeline-service.http-cross-origin.enabled</name> 
  12.     <value>true</value> 
  13. </property> 
  14. <property> 
  15.     <name>yarn.timeline-service.generic-application-history.enabled</name> 
  16.     <value>true</value> 
  17. </property> 
  18. <property> 
  19.     <name>yarn.resourcemanager.system-metrics-publisher.enabled</name> 
  20.     <value>true</value> 
  21. </property> 
  22. <property> 
  23.   <name>yarn.timeline-service.address</name> 
  24.   <value>${yarn.timeline-service.hostname}:10200</value> 
  25. </property> 
  26.  
  27. <property> 
  28.   <name>yarn.timeline-service.webapp.address</name> 
  29.   <value>${yarn.timeline-service.hostname}:8188</value> 
  30. </property> 
  31.  
  32. <property> 
  33.   <name>yarn.timeline-service.webapp.https.address</name> 
  34.   <value>${yarn.timeline-service.hostname}:8190</value> 
  35. </property> 
  36.  
  37. <property> 
  38.   <description>Handler thread count to serve the client RPC requests.</description> 
  39.   <name>yarn.timeline-service.handler-thread-count</name> 
  40.   <value>10</value> 
  41. </property> 
  42. <property> 
  43.   <name>yarn.timeline-service.generic-application-history.enabled</name> 
  44.   <value>false</value> 
  45. </property> 
  46.  
  47. <property> 
  48.   <name>yarn.timeline-service.generic-application-history.store-class</name> 
  49.   <value>org.apache.hadoop.yarn.server.applicationhistoryservice.FileSystemApplicationHistoryStore</value> 
  50. </property> 
  51. </configuration> 
 
把上面的配置修改完后同步到每个节点上;
 
  1. for h in spark.hd2 spark.hd3 ; do rsync -vaz --exclude=logs /home/otouser/software/hadoop/etc/ $h:~/home/otouser/software/hadoop/etc/ ; done 
 
由于我的Hive也是安装在NameNode节点上,所以:
#修改hive-env.sh配置:加入以下几行配置:
 
  1. export HADOOP_USER_CLASSPATH_FIRST=true 
  2. export TEZ_HOME=/home/otouser/software/apache-tez-0.8.4-bin 
  3. export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/*:$TEZ_HOME/lib/* 
 
 
#由于tez-ui是基于Tomcat下运行的一个项目,所以我也在Hive的节点上部署了一个Tomcat程序;
#把Tomcat目录下的webapps里的文件删除,再把把上面的apache-tez-0.8.4-bin 下的tez-ui2-0.8.4.war 复制到webapps目录里:
 
  1. cp apache-tez-0.8.4-bin/tez-ui2-0.8.4.war /home/software/tomcat7/webapps/tez-ui.war 
 
这里的名字注意跟上面tez-site.xml配置文件里的要相同:
 
修改Tomcat的配置文件:service.xml 修改8080端口为9999,也是跟上面的配置一样;
 
通过上面可以看出:
修改过的tez-site.xml和yarn-site.xml要同步到Hadoop各个节点上。
但是tez在这里只安装在Hive节点上,同时也部署了一个Tomcat服务;
 
启动方法:
由于上面修改过了配置,所以要重新启动HDFS集群和Hive程序;而且还要启动一个叫:timelineserver服务;
 
 ./stop-all.sh  #停止HDFS集群 
./start-dfs.sh
./start-yarn.sh
./mr-jobhistory-daemon.sh start historyserver
./yarn-daemon.sh start timelineserver       #必须要先启动HDFS集群后才可以启动起来
 
  1. [otouser@spark sbin]$ jps 
  2. 23642 NameNode 
  3. 24515 ApplicationHistoryServer   #这个就是timelineserver服务 
  4. 24835 Jps 
  5. 24391 JobHistoryServer 
  6. 24800 Bootstrap                 #这个就是Tomcat启动的项目:tez-ui 
  7. 23891 SecondaryNameNode 
  8. 24071 ResourceManager 
 
启动Hive:
 
  1. nohup hive --service metastore &  
  2. nohup hive --service hiveserver2 & 
进入Hive命令操作窗口;切换到tez引擎;
 
  1. hive> use test; 
  2. hive> set hive.execution.engine=tez
  3. hive> select count(*) from product; 
  4. Query ID = otouser_20161223150809_afbcd62c-76eb-4126-84c9-915ff6fa94ea 
  5. Total jobs = 1 
  6. Launching Job 1 out of 1 
  7.  
  8.  
  9. Status: Running (Executing on YARN cluster with App id application_1482476260992_0001) 
  10.  
  11. ---------------------------------------------------------------------------------------------- 
  12.         VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED   
  13. ---------------------------------------------------------------------------------------------- 
  14. Map 1 .......... container     SUCCEEDED      4          4        0        0       0       0   
  15. Reducer 2 ...... container     SUCCEEDED      1          1        0        0       0       0   
  16. ---------------------------------------------------------------------------------------------- 
  17. VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 27.28 s     
  18. ---------------------------------------------------------------------------------------------- 
  19. OK 
  20. 1548417 
  21. Time taken: 30.694 seconds, Fetched: 1 row(s) 

以下图是昨天截取的;
 
此时再查看Tez-ui界面:
 
 
总结:我的环境中使用Hadoop-2.7.2,直接使用官网的包是没问题的,但是由于之前编译Tez包时总报错,浪费了很多时间,而且Tez目前的社区还不是很活沃,所以遇到很多问题。这里主要是做一个测试对比现有Mr的速度,效率;在简单的测试发现Tez确实是比Mr有提升,但稳定性还有待一段时间的测试使用;Spark在计算里是快,但是在我简单的测试sql语句时,并不比Tez快;