我們知道,大部分Spark計算都是在內(nèi)存中完成的,所以Spark的瓶頸一般來自于集群(standalone, yarn, mesos, k8s)的資源緊張,CPU,網(wǎng)絡(luò)帶寬,內(nèi)存。Spark的性能,想要它快,就得充分利用好系統(tǒng)資源,尤其是內(nèi)存和CPU。有時候我們也需要做一些優(yōu)化調(diào)整來減少內(nèi)存占用,例如將小文件進行合并的操作。
彭陽網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。一、問題現(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,這非常奇怪。我們收集了對應(yīng)的建表語句,發(fā)現(xiàn)兩者沒有太大的差異,大部分為String,兩表的列數(shù)也相差不大。
CREATETABLEIFNOTEXISTS`bi`.`dwd_tbl_conf_info`(`corp_id`STRINGCOMMENT\'\',`dept_uuid`STRINGCOMMENT\'\',`user_id`STRINGCOMMENT\'\',`user_name`STRINGCOMMENT\'\',`uuid`STRINGCOMMENT\'\',`dtime`DATECOMMENT\'\',`slice_number`INTCOMMENT\'\',`attendee_count`INTCOMMENT\'\',`mr_id`STRINGCOMMENT\'\',`mr_pkg_id`STRINGCOMMENT\'\',`mr_parties`INTCOMMENT\'\',`is_mr`TINYINTCOMMENT\'R\',`is_live_conf`TINYINTCOMMENT\'\') CREATETABLEIFNOTEXISTS`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查詢操作,無任何復(fù)雜的聚合join操作,也無UDF相關(guān)的操作,所以基本確認查詢慢的應(yīng)該發(fā)生的讀表的時候,我們將懷疑的點放到了讀表操作上。通過查詢兩個查詢語句的DAG和任務(wù)分布,我們發(fā)現(xiàn)了不一樣的地方。
查詢快的表,查詢時總共有68個任務(wù),任務(wù)分配比如均勻,平均7~9s左右,而查詢慢的表,查詢時總共1160個任務(wù),平均也是9s左右。如下圖所示:
至此,我們基本發(fā)現(xiàn)了貓膩所在。大表6.3G但文件個數(shù)小,只有68個,所以很快跑完了。而小表雖然只有133MB,但文件個數(shù)特別多,導(dǎo)致產(chǎn)生的任務(wù)特別多,而由于單個任務(wù)本身比較快,大部分時間花費在任務(wù)調(diào)度上,導(dǎo)致任務(wù)耗時較長。
那如何才能解決小表查詢慢的問題呢?
三、業(yè)務(wù)調(diào)優(yōu)
那現(xiàn)在擺在我們面前就存在現(xiàn)在問題:
為什么小表會產(chǎn)生這么小文件 已經(jīng)產(chǎn)生的這么小文件如何合并
帶著這兩個問題,我們和業(yè)務(wù)的開發(fā)人員聊了一個發(fā)現(xiàn)小表是業(yè)務(wù)開發(fā)人員從原始數(shù)據(jù)表中,按照不同的時間切片查詢并做數(shù)據(jù)清洗后插入到小表中的,而由于時間切片切的比較小,導(dǎo)致這樣的插入次數(shù)特別多,從而產(chǎn)生了大量的小文件。
那么我們需要解決的問題就是2個,如何才能把這些歷史的小文件進行合并以及如何才能保證后續(xù)的業(yè)務(wù)流程中不再產(chǎn)生小文件,我們指導(dǎo)業(yè)務(wù)開發(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ù)量。
分享文章:Spark優(yōu)化之小文件是否需要合并?
路徑分享:http://jinyejixie.com/article44/choiee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、Google、搜索引擎優(yōu)化、網(wǎng)頁設(shè)計公司、App開發(fā)、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)