自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spark優(yōu)化之小文件是否需要合并?

大數(shù)據(jù) Spark
我們知道,大部分Spark計算都是在內(nèi)存中完成的,所以Spark的瓶頸一般來自于集群(standalone, yarn, mesos, k8s)的資源緊張,CPU,網(wǎng)絡帶寬,內(nèi)存。Spark的性能,想要它快,就得充分利用好系統(tǒng)資源,尤其是內(nèi)存和CPU。

我們知道,大部分Spark計算都是在內(nèi)存中完成的,所以Spark的瓶頸一般來自于集群(standalone, yarn, mesos, k8s)的資源緊張,CPU,網(wǎng)絡帶寬,內(nèi)存。Spark的性能,想要它快,就得充分利用好系統(tǒng)資源,尤其是內(nèi)存和CPU。有時候我們也需要做一些優(yōu)化調(diào)整來減少內(nèi)存占用,例如將小文件進行合并的操作。

一、問題現(xiàn)象

我們有一個15萬條總數(shù)據(jù)量133MB的表,使用SELECT * FROM bi.dwd_tbl_conf_info全表查詢耗時3min,另外一個500萬條總數(shù)據(jù)量6.3G的表ods_tbl_conf_detail,查詢耗時23秒。兩張表均為列式存儲的表。

大表查詢快,而小表反而查詢慢了,為什么會產(chǎn)生如此奇怪的現(xiàn)象呢?

二、問題探詢

數(shù)據(jù)量6.3G的表查詢耗時23秒,反而數(shù)據(jù)量133MB的小表查詢耗時3min,這非常奇怪。我們收集了對應的建表語句,發(fā)現(xiàn)兩者沒有太大的差異,大部分為String,兩表的列數(shù)也相差不大。

  1. CREATE TABLE IF NOT EXISTS  `bi`.`dwd_tbl_conf_info`  ( 
  2.   `corp_id` STRING COMMENT ''
  3.   `dept_uuid` STRING COMMENT ''
  4.   `user_id` STRING COMMENT ''
  5.   `user_name` STRING COMMENT ''
  6.   `uuid` STRING COMMENT ''
  7.   `dtime` DATE COMMENT ''
  8.   `slice_number` INT COMMENT ''
  9.   `attendee_count` INT COMMENT ''
  10.   `mr_id` STRING COMMENT ''
  11.   `mr_pkg_id` STRING COMMENT ''
  12.   `mr_parties` INT COMMENT ''
  13.   `is_mr` TINYINT COMMENT 'R'
  14.   `is_live_conf` TINYINT COMMENT '' 

 

  1. CREATE TABLE IF NOT EXISTS `bi`.`ods_tbl_conf_detail` ( 
  2.     `id` string, 
  3.     `conf_uuid` string, 
  4.     `conf_id` string, 
  5.     `name` string, 
  6.     `number` string, 
  7.     `device_type` string, 
  8.     `j_time` bigint
  9.     `l_time` bigint
  10.     `media_type` string, 
  11.     `dept_name` string, 
  12.     `UPDATETIME` bigint
  13.     `CREATETIME` bigint
  14.     `user_id` string, 
  15.     `USERAGENT` string, 
  16.     `corp_id` string, 
  17.     `account` string 
  18.   ) 

因為兩張表均為很簡單的SELECT查詢操作,無任何復雜的聚合join操作,也無UDF相關的操作,所以基本確認查詢慢的應該發(fā)生的讀表的時候,我們將懷疑的點放到了讀表操作上。通過查詢兩個查詢語句的DAG和任務分布,我們發(fā)現(xiàn)了不一樣的地方。

查詢快的表,查詢時總共有68個任務,任務分配比如均勻,平均7~9s左右,而查詢慢的表,查詢時總共1160個任務,平均也是9s左右。如下圖所示:

至此,我們基本發(fā)現(xiàn)了貓膩所在。大表6.3G但文件個數(shù)小,只有68個,所以很快跑完了。而小表雖然只有133MB,但文件個數(shù)特別多,導致產(chǎn)生的任務特別多,而由于單個任務本身比較快,大部分時間花費在任務調(diào)度上,導致任務耗時較長。

那如何才能解決小表查詢慢的問題呢?

三、業(yè)務調(diào)優(yōu)

那現(xiàn)在擺在我們面前就存在現(xiàn)在問題:

  • 為什么小表會產(chǎn)生這么小文件
  • 已經(jīng)產(chǎn)生的這么小文件如何合并

帶著這兩個問題,我們和業(yè)務的開發(fā)人員聊了一個發(fā)現(xiàn)小表是業(yè)務開發(fā)人員從原始數(shù)據(jù)表中,按照不同的時間切片查詢并做數(shù)據(jù)清洗后插入到小表中的,而由于時間切片切的比較小,導致這樣的插入次數(shù)特別多,從而產(chǎn)生了大量的小文件。

那么我們需要解決的問題就是2個,如何才能把這些歷史的小文件進行合并以及如何才能保證后續(xù)的業(yè)務流程中不再產(chǎn)生小文件,我們指導業(yè)務開發(fā)人員做了以下優(yōu)化:

  • 使用INSERT OVERWRITE bi.dwd_tbl_conf_info SELECT * FROM bi.dwd_tbl_conf_info合并下歷史的數(shù)據(jù)。由于DLI做了數(shù)據(jù)一致性保護,OVERWRITE期間不影響原有數(shù)據(jù)的讀取和查詢,OVERWRITE之后就會使用新的合并后的數(shù)據(jù)。合并后全表查詢由原來的3min縮短到9s內(nèi)完成。
  • 原有表修改為分區(qū)表,插入時不同時間放入到不同分區(qū),查詢時只查詢需要的時間段內(nèi)的分區(qū)數(shù)據(jù),進一步減小讀取數(shù)據(jù)量。

 

責任編輯:未麗燕 來源: segmentfault.com
相關推薦

2012-10-09 16:37:20

FastDFS

2013-03-11 14:42:08

Hadoop

2017-12-21 11:19:40

SparkHive表HadoopRDD

2023-01-31 10:22:00

HiveMapReduce文件合并

2022-12-08 08:27:18

HystrixQPS數(shù)據(jù)

2011-07-14 13:41:33

緩存小文件Redis

2016-12-14 19:04:16

Spark SQL優(yōu)化

2017-10-12 11:30:34

Spark代碼PR

2022-04-21 09:26:41

FastDFS開源分布式文件系統(tǒng)

2013-05-07 09:58:20

RequireJS優(yōu)化RequireJS項目

2011-06-22 17:11:18

SEO

2023-06-08 07:34:19

HDFS小文件壓縮包

2024-05-31 13:29:47

2015-10-21 11:39:41

Ceph小文件存儲海量數(shù)據(jù)存儲

2010-12-28 13:32:07

.NET文件合并

2013-09-04 09:55:32

C++

2009-01-03 15:32:26

SAN存儲區(qū)域網(wǎng)存儲設備

2019-08-23 09:56:41

公共云云遣返多云

2009-11-12 09:29:11

ChromeGoogleToolbar

2021-10-17 19:49:52

CPURedis緩存
點贊
收藏

51CTO技術棧公眾號