进入到解压目录 cd protobuf-2.5.0
进行执行./configure
(如果提示C错误,则执行
yum install glibc-headers
yum install gcc-c++
)
make
make check
make install
安装完成后lib文件会在/usr/local/lib目录下
设置变量 vi /etc/profile export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
生效 source /etc/profile
查看 protoc --version
下载后放在/usr/local目录下
解压
tar -xvf apache-maven-3.0.3-bin.tar.gz
设置环境变量,编辑/etc/profile,添加如下文件
export MAVEN_HOME=/usr/local/apache-maven-3.0.3
export PATH=$MAVEN_HOME/bin:$PATH
编译,编译之前注意修改pom.xml中的相关配置,主要是把hadoop.version和protobuf.version修改成你环境下的版本号。
<protobuf.version>2.5.0</protobuf.version>
<hadoop.version>2.5.0</hadoop.version>
执行命令:
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.default.name}/user/apps/tez-0.4.1-incubating-full,${fs.default.name}/user/apps/tez-0.4.1-incubating-full/lib</value>
</property>
</configuration>
修改mapred-site.xml文件,将mapreduce.framework.name的值由yarn修改成yarn-tez(值为yarn-tez时通过tez执行,但正常的hive查询不能执行,如果使hive可以执行,必须修改为yarn)
将mapreduce.map.output.compress的值由true改为false(true为压缩输出,但是执行Tez的时候会出现错误——很有可能是没有安装hadoop-snappy,false为非压缩输出,可执行查询语句,但没输出结果——仅仅192.168.8.206出现此情况,其它三个可以正常输出结果)
修改两个:
<property>
<name>mapreduce.framework.name</name>
<value>yarn-tez</value>
</property>
<property>
<name>mapreduce.map.output.compress</name>
<value>false</value>
</property>
在hive/conf/hive-site.xml添加一个:
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
以上三个参数可以再hive下修改,通过"set mapreduce.framework.name;"命令查看值,
通过"set mapreduce.framework.name=yarn;"命令修改值。
配置HADOOP_CLASS 在hadoop-env.sh中添加
export TEZ_HOME=/etc/tez/tez-dist/target/tez-0.4.1-incubating-full/tez-0.4.1-incubating-full
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_HOME}/*:${TEZ_HOME}/lib/*
export TEZ_CONF_DIR=/etc/tez/conf/tez-site.xml
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_CONF_DIR
配置完成,重新启动Hive
第四部分 安装过程中遇到的问题就解决方法
1.第一个问题就是在安装protoc的时候,执行./configure时提示找不到C
解决方法:安装C以及C++
yum install glibc-headers
yum install gcc-c++
2.在下载完tez-0.4.1-incubating-src.tar.gz之后进行解压,但是没有找到.../tez-0.4.1-incubating-src/tez-dist
下没有发现target目录
解决方法:缺少tez jars和依赖包,执行这条命令:
mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true
3.没有找到mvn
解决方法:安装mvn
4.在配置好tez-site.xml参数之后,执行查询语句,出现tez.lib.uris路径错误
解决方法:缺少${fs.default.name}。依赖包放在hdfs上,在hdfs的绝对路径前添加${fs.default.name}。
5.在修改完mapred-site.xml之后,hive不能正常执行
解决方法:mapreduce.framework.name和hive.execution.engine的参数要保持一致,
如果mapreduce.framework.name=yarn-tez,则hive.execution.engine=tez
如果mapreduce.framework.name=yarn,则hive.execution.engine=mr
6.tez的时候查询语句出现错误vertex failed
解决方法:将输出设置为非压缩形式,即mapreduce.map.output.compress=false
7.DEPRECATED: Configuration property hive.metastore.local no longer has any effect. Make sure to provide a valid value for hive.metastore.uris if you are connecting to a remote metastore.
环境变量配置出错,在hadoop-env.sh中添加相关配置。
四个节点已经全部安装了Tez,都可以通过tez正常执行,其中209,207可以正常输出结果,208,206没有输出结果.
测试结果如下:
1.通过查询插入10G的数据分别通过tez和mr
tez:用时943s
mr:用时1122s
2.对1G大小的数据进行倒序输出前10条记录
tez:用时200s左右
mr:用时 560s左右
3.对50G数据分组查询
tez:用时 1428s
mr:用时 2576s
4.对小表数据进行统计行数
tez:Time taken: 1.269 seconds, Fetched: 1 row(s)
mr:Time taken: 36.005 seconds, Fetched: 1 row(s)
5.对1G大小的数据进行统计
mr:Time taken: 544.501 seconds, Fetched: 1 row(s)
tez:Time taken: 25.666 seconds, Fetched: 1 row(s)
Tez纵向分析:
a 统计查询
统计几条记录:总记录数4:Time taken: 1.276 seconds, Fetched: 1 row(s)
统计10M数据:总记录数579631:Time taken: 1.277 seconds, Fetched: 1 row(s)
统计100M数据:总记录数5796310:Time taken: 2.915 seconds, Fetched: 1 row(s)
统计1G数据,总记录数57963100:Time taken: 25.666 seconds, Fetched: 1 row(s)
统计10G数据,总记录数579631000:Time taken: 176.39 seconds, Fetched: 1 row(s)
b 按条件统计查询:
select count(*) from t_test_1000 where age=34;
统计10G数据,总记录数14489000:Time taken: 229.171 seconds, Fetched: 1 row(s)
c 分组排序统计查询(多个MapReduce)
select age,count(id) from t_test_1000 group by age order by age asc;
统计10G数据,总记录数579631000:Time taken: 352.427 seconds, Fetched: 33 row(s)
d 按条件分组排序统计查询
select age,count(id) from t_test_1000 group by age order by age desc having count(id)>14492000
统计10G数据,总记录数579631000:Time taken: 294.501 seconds, Fetched: 7 row(s)
e 联合查询
大表(1G)与小表(10M)关联,Tez中已进行了优化,当大表与小表关联时,优先小表加入内存。
select a.id,a.name,b.id,b.name from t_test_1 a join t_test_100 b on a.id=b.id limit 20;
Time taken: 213.145 seconds, Fetched: 20 row(s)
mr纵向分析
a 统计查询
统计几条记录:总记录数4:mr:Time taken: 36.005 seconds, Fetched: 1 row(s)
统计10M数据:总记录数579631:Time taken: 36.708 seconds, Fetched: 1 row(s)
统计100M数据:总记录数5796310:Time taken: 39.837 seconds, Fetched: 1 row(s)
统计1G数据,总记录数57963100:Time taken: 63.206 seconds, Fetched: 1 row(s)
统计10G数据,总记录数579631000:Time taken: 373.66 seconds, Fetched: 1 row(s)
b 按条件统计查询:
select count(*) from t_test_1000 where age=34;
统计10G数据,输出总记录数14489000:Time taken: 443.052 seconds, Fetched: 1 row(s)
c 分组排序统计查询(多个MapReduce)
select age,count(id) from t_test_1000 group by age order by age asc;
统计10G数据,总记录数579631000:Time taken: 607.55 seconds, Fetched: 33 row(s)
Stage-Stage-1: Map: 40 Reduce: 10 Cumulative CPU: 719.15 sec HDFS Read: 10414134363 HDFS Write: 1693 SUCCESS
Stage-Stage-2: Map: 1 Reduce: 1 Cumulative CPU: 4.28 sec HDFS Read: 4088 HDFS Write: 394 SUCCESS
d 按条件分组排序统计查询
select age,count(id) from t_test_1000 group by age having count(id)>14492000 order by age desc;
统计10G数据,总记录数579631000:e 联合查询
大表与小表关联,小表(10M)在前大表(1G)在后
select a.id,a.name,b.id,b.name from t_test_1 a join t_test_100 b on a.id=b.id limit 20;
Time taken: 51.731 seconds, Fetched: 20 row(s)
大表与小表关联,小表(10M)在前大表(10G)在后
select a.id,a.name,b.id,b.name from t_test_1 a join t_test_1000 b on a.id=b.id limit 20;
Time taken: 233.442 seconds, Fetched: 20 row(s)
大表与小表关联,大表(10G)在前小表(10M)在后
Time taken: 235.153 seconds, Fetched: 20 row(s)
将统计结果以统计表形式呈现如下:
方式
| 数据大小 | Tez方式 | Mr方式 |
统计查询 | 统计几条记录 | 1.276s | 36.005s |
统计10M数据 | 1.277s | 36.708s | |
统计100M数据 | 2.914s | 39.837s | |
统计1G数据 | 25.666s | 63.206s | |
统计10G数据 | 176.39s | 373.66s | |
按条件统计查询 | 统计10G数据 | 229.171s | 443.052s |
分组排序统计查询 | 统计10G数据 | 352.427s | 607.55s |
按条件分组排序统计查询 | 统计10G数据 | 294.501s | / |
联合查询 | 大表(1G)小表(10M) | 213.145s | 51.73s |
总结:
Tez更适合对大量数据进行排序
在有排序的情况下tez的效率是mr的2.5~3.5倍。
在没有排序的情况下,tez的效率是mr的1.5~2倍。
在执行join的时候Tez的效率明显低于mr的执行效率,
tez执行时间不稳定,第一次执行时间较长,以后再次执行时间减少。