|
我们知道,大部分Spark计算都是在内存中完成的,所以Spark的瓶颈一般来自于集群(standalone, yarn, mesos, k8s)的资源紧张,CPU,网络带宽,内存。Spark的性能,想要它快,就得充分利用好系统资源,尤其是内存和CPU。有时候我们也需要做一些优化调整来减少内存占用,例如将小文件进行合并的操作。
一、问题现象
我们有一个15万条总数据量133MB的表,使用SELECT * FROM bi.dwd_tbl_conf_info全表查询耗时3min,另外一个500万条总数据量6.3G的表ods_tbl_conf_detail,查询耗时23秒。两张表均为列式存储的表。
大表查询快,而小表反而查询慢了,为什么会产生如此奇怪的现象呢?
二、问题探询
数据量6.3G的表查询耗时23秒,反而数据量133MB的小表查询耗时3min,这非常奇怪。我们收集了对应的建表语句,发现两者没有太大的差异,大部分为String,两表的列数也相差不大。
-
CREATE TABLE IF NOT EXISTS `bi`.`dwd_tbl_conf_info` (
-
`corp_id` STRING COMMENT '',
-
`dept_uuid` STRING COMMENT '',
-
`user_id` STRING COMMENT '',
-
`user_name` STRING COMMENT '',
-
`uuid` STRING COMMENT '',
-
`dtime` DATE COMMENT '',
-
`slice_number` INT COMMENT '',
-
`attendee_count` INT COMMENT '',
-
`mr_id` STRING COMMENT '',
-
`mr_pkg_id` STRING COMMENT '',
-
`mr_parties` INT COMMENT '',
-
`is_mr` TINYINT COMMENT 'R',
-
`is_live_conf` TINYINT COMMENT ''
-
)
-
CREATE TABLE IF NOT EXISTS `bi`.`ods_tbl_conf_detail` (
-
`id` string,
-
`conf_uuid` string,
-
`conf_id` string,
-
`name` string,
-
`number` string,
-
`device_type` string,
-
`j_time` bigint,
-
`l_time` bigint,
-
`media_type` string,
-
`dept_name` string,
-
`UPDATETIME` bigint,
-
`CREATETIME` bigint,
-
`user_id` string,
-
`USERAGENT` string,
-
`corp_id` string,
-
`account` string
-
)
因为两张表均为很简单的SELECT查询操作,无任何复杂的聚合join操作,也无UDF相关的操作,所以基本确认查询慢的应该发生的读表的时候,我们将怀疑的点放到了读表操作上。通过查询两个查询语句的DAG和任务分布,我们发现了不一样的地方。

(编辑:我爱制作网_潮州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|