Tez的web UI简单体验

Posted 虎鲸不是鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tez的web UI简单体验相关的知识,希望对你有一定的参考价值。

Tez的web UI简单体验

前言

由于CDP7默认是Hive On Tez,不再有Map Reduce和Spark什么事,查看监控、分析数据倾斜等原因导致的HQL任务跑不快的问题没有使用Spark那会儿那么容易。加之DataPhin中台各种封装隐藏了很多Log,更是不方便调优。笔者在USDP集群上简单测试下效果,尝试从Tez的web UI看出点端倪。

Hive On Tez运行原理可以参考:https://lizhiyong.blog.csdn.net/article/details/126688391

Web UI访问

USDP2大数据集群安装好之后:http://zhiyong2:9999/tez/

大概是这样:

相当的朴素。。。经过笔者多次测试,只有需要调度到Yarn上的任务才会显示在这个web UI中。普通的select操作如果不用Yarn跑,并不会显示在这里。

启动运算任务

笔者采用了Java手写JDBC的方式执行HQL,之后使用了Hive的Cli方式执行。

JDBC方式启动任务

Hive3.1.2的Maven冲突真的是一言难尽。。。

String sql_Insert = "insert into db_lzy.digital_monster values(1000,'暴龙兽1')";
String sql_Select = "select distinct name,rpad(name,50,'*') from db_lzy.digital_monster";

//聪明的你一定比肤浅的SQL Boy们更熟悉中间的过程
        final String HIVE_JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver";
        final String HIVE_HOST = "192.168.88.101";
        final String HIVE_PORT = "10000";
        final String HIVE_USER = "root";
        final String HIVE_PASSWORD = "123456";

        String HIVE_URL = "jdbc:hive2://" + HIVE_HOST + ":" + HIVE_PORT + "/default";

        Connection conn = null;
        Statement stmt = null;
        ResultSet resultSet = null;
        Class.forName(HIVE_JDBC_DRIVER);
        conn = DriverManager.getConnection(HIVE_URL, HIVE_USER, HIVE_PASSWORD);
        stmt = conn.createStatement();
//聪明的你一定比肤浅的SQL Boy们更熟悉中间的过程

boolean execute = stmt.execute(sql_Insert);
resultSet = stmt.executeQuery(sql_Select);

这样子必定失败。。。然后就可以获取到2个失败记录:

一屏截不下,真宽。。。Client的类型当然是HS2,执行引擎就是默认的MR。

由于是宿主机的Idea吊起JVM访问虚拟机,Client的IP=192.168.88.1这个网关也没什么毛病。分别来看看。

去重查询失败

点进来可以看到执行的HQL。所谓的细节,信息也不是很多。。。

这里可以看到时间线TimeLine。从中可以看出编译耗时最长【551ms】,并且编译完在SQL转换AST时就失败了。

这些配置可以参考。

于是可以初步判断这个HQL任务是解析AST时失败。

插入数据失败

这个任务在Idea会报错:

Exception in thread "main" java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. org.apache.hadoop.yarn.exceptions.InvalidResourceRequestException: Invalid resource request, requested resource type=[memory-mb] < 0 or greater than maximum allowed allocation. Requested resource=<memory:8192, vCores:1>, maximum allowed allocation=<memory:5000, vCores:8>, please note that maximum allowed allocation is calculated by scheduler based on maximum resource of registered NodeManagers, which might be less than configured maximum allocation=<memory:5000, vCores:8>
	at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.throwInvalidResourceException(SchedulerUtils.java:397)
	at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.checkResourceRequestAgainstAvailableResource(SchedulerUtils.java:379)
	at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.validateResourceRequest(SchedulerUtils.java:288)
	at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.normalizeAndValidateRequest(SchedulerUtils.java:259)
	at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.normalizeAndValidateRequest(SchedulerUtils.java:223)
	at org.apache.hadoop.yarn.server.resourcemanager.RMAppManager.validateAndCreateResourceRequest(RMAppManager.java:529)
	at org.apache.hadoop.yarn.server.resourcemanager.RMAppManager.createAndPopulateNewRMApp(RMAppManager.java:381)
	at org.apache.hadoop.yarn.server.resourcemanager.RMAppManager.submitApplication(RMAppManager.java:320)
	at org.apache.hadoop.yarn.server.resourcemanager.ClientRMService.submitApplication(ClientRMService.java:645)
	at org.apache.hadoop.yarn.api.impl.pb.service.ApplicationClientProtocolPBServiceImpl.submitApplication(ApplicationClientProtocolPBServiceImpl.java:277)
	at org.apache.hadoop.yarn.proto.ApplicationClientProtocol$ApplicationClientProtocolService$2.callBlockingMethod(ApplicationClientProtocol.java:563)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:872)
	at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:818)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2678)

	at org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:401)
	at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:266)
	at com.zhiyong.JdbcDemo.main(JdbcDemo.java:78)

Process finished with exit code 1

这种任务Map Reduce居然嫌弃5G内存太小了,想要8G。。。也是在做梦。。。这年头除非数据量大的离谱,很少有跑MapReduce任务的软件厂了。。。

从时间线可以看出,同样是编译完做AST解析转换时报错了。。。

Hive Cli方式启动任务

Hive Cli方式启动无Shuffle任务

hive (db_lzy)> insert into db_lzy.digital_monster values(1000,'暴龙兽1');
Query ID = root_20220906002627_7ddef917-17ff-44e4-bd73-e33acbaef415
Total jobs = 1
Launching Job 1 out of 1
2022-09-06 00:26:29 INFO client.AHSProxy: Connecting to Application History server at zhiyong3/192.168.88.102:10201
2022-09-06 00:26:29 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm2
Status: Running (Executing on YARN cluster with App id application_1662378283798_0003)

----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED      1          1        0        0       0       0
Reducer 2 ...... container     SUCCEEDED      1          1        0        0       0       0
----------------------------------------------------------------------------------------------
VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 11.34 s
----------------------------------------------------------------------------------------------
Status: DAG finished successfully in 11.34 seconds

Query Execution Summary
----------------------------------------------------------------------------------------------
OPERATION                            DURATION
----------------------------------------------------------------------------------------------
Compile Query                           0.82s
Prepare Plan                           16.34s
Get Query Coordinator (AM)              0.04s
Submit Plan                             0.56s
Start DAG                               0.14s
Run DAG                                11.34s
----------------------------------------------------------------------------------------------

Task Execution Summary
----------------------------------------------------------------------------------------------
  VERTICES      DURATION(ms)   CPU_TIME(ms)    GC_TIME(ms)   INPUT_RECORDS   OUTPUT_RECORDS
----------------------------------------------------------------------------------------------
     Map 1           3615.00          5,280            577               3                1
 Reducer 2            502.00          1,390             18               1                0
----------------------------------------------------------------------------------------------

Loading data to table db_lzy.digital_monster
OK
col1    col2
Time taken: 31.919 seconds

这么简单的一句insert操作,Tez提交到了Yarn,并且花费31.919s后执行成功。

并且在HDFS生成了小文件:

[root@zhiyong2 conf]# hadoop fs -ls /zhiyong-1/user/hive/warehouse/db_lzy.db/digital_monster
Found 2 items
-rw-r--r--   3 root supergroup        598 2022-08-05 12:59 /zhiyong-1/user/hive/warehouse/db_lzy.db/digital_monster/000000_0
-rw-r--r--   3 root supergroup        489 2022-09-06 00:26 /zhiyong-1/user/hive/warehouse/db_lzy.db/digital_monster/000000_0_copy_1

Tez在运行时会在web UI显示:

完成后点进去看到:

在时间线可以看到:

可以看到run成功时,编译和AST解析转换、构建DAG其实总共1s多。集群本身资源充足,提交DAG和Yarn吊起任务其实也就1s左右。比较耗时的是DAG运行的那11s。耗时最多的生成执行计划【16s】居然没有出现在Tez的web UI【只出现在Hive的Cli】。。。

其实单表【当然包括读写性能很好的大宽表】没什么好看的,性能瓶颈大多是由于上古年代的SAS盘阵列后IO依然低达30m/s,交换机带宽不足【例如还不都是全千兆口】,光纤损耗高等导致读写慢从而影响了Map过程,致使任务慢。这种问题换硬盘、改阵列、多来几组大带宽交换机,减少跨机房跨机架甚至跨地区组集群的不科学规划【没错,说的就是用多区域云主机组集群的】,尽量把Hive表的文件存放在离计算节点近的机器【数据本地性】,都有良好的效果。

如果是where的条件很多,数据量又大,需要启用向量化执行等功能,运算密集型任务+CPU+内存再调参【给Tez分配更多计算资源】即可。。。

一般来说,+机器能解决的问题不是太过于恐怖的问题。怕就怕+机器也解决不了的问题。。。

Hive Cli方式启动有Shuffle任务

肤浅的SQL Boy们总是不听劝,不喜欢用读写性能更好的大宽表,坚持要做多表Join来拉宽这种性能极烂的骚操作。。。这种不合理的操作反倒是大多数情况。。。简单做个测试:

create table db_lzy.td_tb1(
	`id` int,
	`location_1` string,
	`location_2` string
)
stored as parquet
;	--Hive的Cli最好手动换单行去运行

insert into db_lzy.td_tb1 values(1,'cn','bj');
insert into db_lzy.td_tb1 values(2,'cn','sh');
insert into db_lzy.td_tb1 values(3,'cn','gz');
insert into db_lzy.td_tb1 values(4,'cn','tj');
insert into db_lzy.td_tb1 values(5,'jp','cs');
insert into db_lzy.td_tb1 values(6,'jp','gd');

成功后:

hive (db_lzy)> select * from db_lzy.td_tb1;
OK
td_tb1.id       td_tb1.location_1       td_tb1.location_2
1       cn      bj
2       cn      sh
3       cn      gz
4       cn      tj
5       jp      cs
6       jp      gd
Time taken: 0.219 seconds, Fetched: 6 row(s)
hive (db_lzy)> select * from db_lzy.digital_monster;
OK
digital_monster.num     digital_monster.name
1       亚古兽
2       暴龙兽
3       机械暴龙兽
4       丧尸暴龙兽
5       战斗暴龙兽
6       大地暴龙兽
7       闪光暴龙兽
1000    暴龙兽1
Time taken: 0.197 seconds, Fetched: 8 row(s)
hive (db_lzy)>

来个性能极差的Join:

select
	t1.num,
	t1.name,
	t2.id,
	t2.location_1,
	t2.location_2
from
	db_lzy.digital_monster t1
left join
	db_lzy.td_tb1 t2
	on t1.num=t2.id
;

压缩成1行后执行:

hive (db_lzy)> select t1.num,t1.name,t2.id,t2.location_1,t2.location_2 from db_lzy.digital_monster t1 left join db_lzy.td_tb1 t2 on t1.num=t2.id;
Query ID = root_20220906012440_25c33094-952c-4b31-9b3b-a8e45fda1861
Total jobs = 1
Launching Job 1 out of 1
Tez session was closed. Reopening...
2022-09-06 01:24:41 INFO client.AHSProxy: Connecting to Application History server at zhiyong3/192.168.88.102:10201
2022-09-06 01:24:41 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm2
Session re-established.
Session re-established.
Status: Running (Executing on YARN cluster with App id application_1662378283798_0006)

----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED      1          1        0        0       0       0
Map 3 .......... container     SUCCEEDED      1          1        0        0       0       0
Reducer 2 ...... container     SUCCEEDED      1          1        0        0       0       0
----------------------------------------------------------------------------------------------
VERTICES: 03/03  [==========================>>] 100%  ELAPSED TIME: 10.92 s
----------------------------------------------------------------------------------------------
Status: DAG finished successfully in 10.92 seconds

Query Execution Summary
----------------------------------------------------------------------------------------------
OPERATION                            DURATION
----------------------------------------------------------------------------------------------
Compile Query                           0.41s
Prepare Plan                            0.13s
Get Query Coordinator (AM)              0.00s
Submit Plan                             8.72s
Start DAG                               0.64s
Run DAG                                10.92s
----------------------------------------------------------------------------------------------

Task Execution Summary
----------------------------------------------------------------------------------------------
  VERTICES      DURATION(ms)   CPU_TIME(ms)    GC_TIME(ms)   INPUT_RECORDS   OUTPUT_RECORDS
----------------------------------------------------------------------------------------------
     Map 1           4173.00          9,760          1,291               8                8
     Map 3           2593.00          3,990            160               6                6
 Reducer 2           1339.00          2,630             10              14                0
----------------------------------------------------------------------------------------------

OK
t1.num  t1.name t2.id   t2.location_1   t2.location_2
1       亚古兽  1       cn      bj
2       暴龙兽  2       cn      sh
3       机械暴龙兽      3       cn      gz
4       丧尸暴龙兽      4       cn      tj
5       战斗暴龙兽      5       jp      cs
6       大地暴龙兽      6       jp      gd
7       闪光暴龙兽      NULL    NULL    NULL
1000    暴龙兽1 NULL    NULL    NULL
Time taken: 20.856 seconds, Fetched: 8 row(s)

显然Join的select查数据就要比没有Join的表慢1个数量级。。。

web UI中:

明显和之前无Shuffle的任务不同。

DAG Counters中还有很多细节。

在Graphical View中可以看到具体的DAG图。先走2个Map任务读取t1和t2表,然后来个Reduce去Join起来,最终输出结果,没什么毛病。

这里可以看到3个子任务的细节。

这里貌似还有日志【可以跳转到Yarn的Web UI】。

半差不差。

这个Vertex Swimlane有点像总体的时间线,鼠标放上去有细节显示:

这样就可以看到每个小阶段的耗时情况。

这里的Map3和Map1可不单单是先后顺序,还有一部分重叠,Map3的柱图被Map1遮盖了!!!

于是可以看出先后执行2个Map任务【Map1和Map3】读数据,读完后执行了一个Reduce任务【Reduce2】去做Shuffle混洗和汇总结果。

由于Map1读的t1表数据量比Map3读的t2表数据量大一点,故运行时间稍长。

这类有Shuffle的多表Join任务分析问题相当麻烦,且随着参与Join的表个数增多、条件越发复杂、HQL越套越长,性能指数级下降,最终遇到明显的性能问题就不得不考虑调优【调参也是调优的一种】。Shuffle过多时,可以将常用的、数据量不大的表缓存到Alluxio或者使用Alluxio做RSS【Spark可以,Tez尚未尝试】加速Shuffle。

查看Yarn日志

最稳妥的当然是查看Yarn的日志。

yarn logs -applicationId application_1662378283798_0006 > /root/tezLog1

重定向后的Log删减掉无用内容后也有1000多行。。。
这种Info级别的Log删除无用部分后依旧很多很乱,直接看不可能不累。如果是肤浅的SQL Boy们最喜欢的几十个表Join写几千行的一句HQL,那Yarn的Log复杂度可能不是人看的。。。

Web UI的实际意义

由于人都是对图形更敏感,根据每个stage的耗时情况结合DAG可以分析出整个Tez任务的瓶颈在哪里,协助定位有性能问题的HQL段【聚焦主要问题】,从而可以高效地分析问题,并且有针对性地调优,解决因数据倾斜、SX锁、资源不足等多种原因导致的性能差的问题。

如果只局限于从SQL层面肉眼分析,只从数据库的那种传统模式考虑SQL层面的优化,例如agg运算不动,先agg再union all数据集再agg,不能说完全无用。。。数据倾斜之类的问题可能根本不是出现在这里。对于非SQL问题,不去看Log,只是傻傻地改HQL,可能也是南辕北辙。

转载请注明出处:https://lizhiyong.blog.csdn.net/article/details/126717025

以上是关于Tez的web UI简单体验的主要内容,如果未能解决你的问题,请参考以下文章

Tez的web UI简单体验

在Tez ui看不到任何d ..

记一发Hive on tez的配置(Hive 3.1.1, Hadoop 3.0.3, Tez 0.9.1)

移动webapp前端ui用哪个框架好

在 HIVE 中运行查询时如何更改 Tez 作业名称

用户体验设计师是做啥的?