Spark JDBC系列--讀取優(yōu)化

本文旨在介紹 Spark 通過JDBC讀取數(shù)據(jù)時常用的一些優(yōu)化手段

關(guān)于數(shù)據(jù)庫索引

無論使用哪種JDBC API,spark拉取數(shù)據(jù)最終都是以select語句來執(zhí)行的府喳,所以在自定義分區(qū)條件或者指定的long型column時岖寞,都需要結(jié)合表的索引來綜合考慮稠曼,才能以更高性能并發(fā)讀取數(shù)據(jù)庫數(shù)據(jù)逊移。

API的使用可以參考文檔:Spark JDBC系列--取數(shù)的四種方式

離散型的分區(qū)字段

當使用spark拉取table_example表的數(shù)據(jù)時呼盆,使用的分區(qū)字段吧彪,并不是連續(xù)或均勻分布的土铺。這時如果簡單的按預(yù)期的numPartitions做均分萤悴,則會造成數(shù)據(jù)傾斜瘾腰,讀取性能也會受到影響。

ID離散型例舉

背景

一般情況下稚疹,表的ID字段居灯,都會設(shè)置成自增,即使 step!=1内狗,也是均勻分布的的怪嫌。但是當數(shù)據(jù)積累到一定程度,需要進行分庫分表時柳沙,多個實例中ID的唯一性就需要借助分庫分表中間件岩灭,使用如snowflake之類的全局唯一編號,來生成全局唯一ID了赂鲤,此時必定會出現(xiàn)一定程度的ID離散噪径。

入?yún)?/h4>

min_id:1,max_id:1000000,數(shù)據(jù)集中在:1~500柱恤,10000~20000,100000~400000 找爱。梗顺。。即存在多段不均勻分布

普通處理方式

sqlContext.read.jdbc(url,tableName, "id", 1, 1000000,400,prop)

此方式的分區(qū)where查詢條件车摄,會存在很多的無用查詢(返回了空結(jié)果)寺谤,劃分的task為400,但實際有效的可能只有200個,且數(shù)據(jù)還可能存在一定程度的傾斜吮播,對后續(xù)的計算產(chǎn)生影響变屁。

自定義處理方式

def getPredicates = {
    
    //1.獲取表total數(shù)據(jù)。
    //2.按numPartitions均分意狠,獲得offset粟关,可以確保每個分片的數(shù)據(jù)一致
    //3.獲取每個分片內(nèi)的最大最小ID,組裝成條件數(shù)組
     
     环戈。闷板。。實現(xiàn)細節(jié)省略
}

sqlContext.read.jdbc(url,table, getPredicates,connectionProperties)

通過自由組裝方式谷市,可以達到精確控制蛔垢,但是實現(xiàn)成本較高击孩。

ID取模方式

sqlContext.read.jdbc(url,tableName, "id%200", 1, 1000000,400,prop)

根據(jù)numPartitions確定合理的模值迫悠,可以盡量做到數(shù)據(jù)的連續(xù),且寫法簡單巩梢,但是由于在ID字段上使用了函數(shù)計算创泄,所以索引將失效,此時需要配合其他包含索引的where條件加以輔助括蝠,才能使查詢性能最大化鞠抑。

原理:

API中的columnName其實只會作為where條件進行簡單的拼接,所以數(shù)據(jù)庫中支持的語法忌警,都可以使用搁拙。tableName的原理也一樣,僅會作為from 后的內(nèi)容進行拼接法绵,所以也可以寫一個子句傳入tableName中箕速,但依然要在保證性能的前提下。

結(jié)語

不僅僅是取模操作朋譬,數(shù)據(jù)庫語法支持的任何函數(shù)盐茎,都可以在API中傳入使用,關(guān)鍵在于性能是否達到預(yù)期徙赢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末字柠,一起剝皮案震驚了整個濱河市探越,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窑业,老刑警劉巖钦幔,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異常柄,居然都是意外死亡节槐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門拐纱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铜异,“玉大人,你說我怎么就攤上這事秸架∽嶙” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵东抹,是天一觀的道長蚂子。 經(jīng)常有香客問我,道長缭黔,這世上最難降的妖魔是什么食茎? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮馏谨,結(jié)果婚禮上别渔,老公的妹妹穿的比我還像新娘。我一直安慰自己惧互,他們只是感情好哎媚,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喊儡,像睡著了一般拨与。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艾猜,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天买喧,我揣著相機與錄音,去河邊找鬼匆赃。 笑死淤毛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炸庞。 我是一名探鬼主播钱床,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼埠居!你這毒婦竟也來了查牌?” 一聲冷哼從身側(cè)響起事期,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纸颜,沒想到半個月后兽泣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡胁孙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年唠倦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涮较。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡稠鼻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狂票,到底是詐尸還是另有隱情候齿,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布闺属,位于F島的核電站慌盯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掂器。R本人自食惡果不足惜亚皂,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望国瓮。 院中可真熱鬧灭必,春花似錦、人聲如沸巍膘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峡懈。三九已至,卻和暖如春与斤,著一層夾襖步出監(jiān)牢的瞬間肪康,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工撩穿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磷支,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓食寡,卻偏偏與公主長得像雾狈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抵皱,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容