新聞中心
周一我就有個困惑,還寫成文章了:如何從 Spark 的 DataFrame 中取出具體某一行,里面提了自己猜想的幾種解決方案。

北川羌族網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),北川羌族網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為北川羌族上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的北川羌族做網(wǎng)站的公司定做!
沒想到這么快就要面對這個問題了,我用小孩子都聽得懂的例子描述一下我在干什么。
簡單生動小例子
說一所小學(xué)有好幾個班級,現(xiàn)在要 以班級為單位 給孩子們按照身高進(jìn)行排序,并且記錄下來。
問題就是,全學(xué)校只有一條測身高的尺子,而且因?yàn)楹⒆觽冞^于頑劣等主客觀因素,測量身高、按身高排序、登記身高這些過程,必須在一間教室里進(jìn)行。 沒有被輪到測量的班級,就在操場活動。
而最讓老師感到頭疼的是:組織孩子們進(jìn)教室這一過程。測身高呀、記錄呀、排序呀,都用不了幾分鐘,唯獨(dú)讓孩子們進(jìn)教室這件事,要讓老師們使出九牛二虎之力,而且特別耗時。
孩子們快進(jìn)教室吧,求求了!
好消息是,組織一個班進(jìn)教室,和組織一百個班同時進(jìn)教室,花費(fèi)的時間差不多。 因此,一般來講,老師都是直接把所有學(xué)生全部叫進(jìn)這間教室來的。
但是我面臨一個棘手的情況。我的操場上,有 2200 個班級,每個班級有 16 萬人。我的教室也很大,但是肯定裝不下 2200 × 16 萬人 ≈ 3 億人。
于是我就想著,我一個班一個班測,這是最直觀的、最好管理的。
“來,一班,進(jìn)教室!”...花了十幾分鐘才都叫進(jìn)來...花了幾十秒就都測好了、排好序了、記錄好了...“好了!一班出去!二班進(jìn)來!”...
如此往復(fù),等到了第 2200 個班的時候,已經(jīng)過去了快一個月...
內(nèi)位看官講話了:你把他們都叫進(jìn)來不就行了?反正前面有條件:『組織一個班進(jìn)教室,和組織一百個班同時進(jìn)教室,花費(fèi)的時間差不多?!?/p>
有道理,這就是我上午在做的事:把教室修大一點(diǎn)。
我請了土地局的人、請了工程師、請了施工隊(duì),嘗試了各種方法,每次費(fèi)盡力氣修好(能容納 5 億人那種),教室就因?yàn)楦鞣N原因塌了。
唉!我計(jì)算過,理論上明明可以建成的呀!
我就不甘心,就一直嘗試,反反復(fù)復(fù),然后幾小時過去了。
這時又有位看官講話了:別修教室了,你把孩子們分成幾批,一次叫幾個班進(jìn)教室不就得了!
有道理,可是這樣原有的管理邏輯需要改一部分,著實(shí)花費(fèi)了我一些時間。此外,還花了大量時間 debug 。
我初步設(shè)置為 100 班為一批進(jìn)教室:
- 原來我需要做『喊孩子們進(jìn)教室』這件事 2200 次(每個班含一次)
- 現(xiàn)在我只做『喊孩子們進(jìn)教室』這件事 22 次,你看看,是不是快了 100 倍
對照解釋
上面其實(shí)就是我做的事的簡化版,其中:
「教室」就是計(jì)算機(jī)的「內(nèi)存」,你得把數(shù)據(jù)拿進(jìn)內(nèi)存才能對其進(jìn)行排序什么的計(jì)算
「進(jìn)教室」就是計(jì)算機(jī)的「IO操作」,計(jì)算機(jī)的內(nèi)存很貴,一般的電腦都是 8G、16G 這種,而硬盤相對便宜,有 256G、512G,甚至幾個 T 之多,因此數(shù)據(jù)一般都放在硬盤上,需要用時,在讀到內(nèi)存里,這個讀的過程叫做「IO操作」
「IO操作」相比計(jì)算,相當(dāng)耗費(fèi)時間
老師干活很利索,就是孩子們進(jìn)教室有點(diǎn)費(fèi)勁
以下是我的工作日志節(jié)選(脫敏版):
首先我是『把每個班級單獨(dú)叫進(jìn)教室』,很耗時。
7月19日早上大概9:30開始的,到7月20日半夜0:23結(jié)束,一共 2200 列,每一列都有 160000 個數(shù)據(jù),都要進(jìn)行排序操作,還涉及到 IO 操作,一共用時 15 小時。這其中用時為 IO時間 和 對每一列處理時間:
而其中,相比 IO ,計(jì)算時間(比如排序)可以忽略不計(jì),因此時間可以記為
于是我想著,能不能『把所有班級一下全叫進(jìn)教室』,畢竟:
- 我的機(jī)器內(nèi)存有 8G
- 數(shù)據(jù)頂多使用 4G
我開始著手「擴(kuò)大教室」,嘗試了很多,和配置文件 .conf 、 spark-shell 、 spark-env.cmd 、 JVM -Xmx4g 等等這種資料、操作大戰(zhàn)了一上午,無果。
一些截圖: .conf
我認(rèn)為我的嘗試產(chǎn)生了效果,因?yàn)樵械腻e誤不報(bào)了, collect 這個過程也能走完(孩子們都能進(jìn)教室,之前是進(jìn)不去的),但是一旦涉及到操作(collect 結(jié)束后會卡頓很久,無法返回應(yīng)有的 Array),就會爆 JVM heap 。此外,經(jīng)過一些其他調(diào)整后,不爆 heap 了,爆 GC overhead limit exceeded 這種垃圾回收問題。
那我有理由懷疑是性能被硬件限制了。
于是我考慮:『把孩子們分成幾批,一次叫幾個班進(jìn)教室』。
有很多 bug ,我最后選擇的是一次叫 100 個班級,用時大概 12 分鐘。
“調(diào)優(yōu)”結(jié)束。
總體來看,思路上幾乎沒什么難度,花費(fèi)了這么多時間,主要是因?yàn)椋?/p>
- 不甘心自己的某個思路不可行,一股腦硬試下去
- 經(jīng)驗(yàn)不足
啊!要是用時15小時的代碼不是1個月前的我寫的,而是別人寫的,那我把他調(diào)到 12 分鐘,還顯得我蠻厲害的?? 開個玩笑,我希望大家寫出的代碼都是很棒的,這樣咱們都可以節(jié)省出時間休息??
好了,回去睡覺了,明天還得接著給“孩子們”做別的工作;而且還有另一所學(xué)校另一個工作(同時被領(lǐng)導(dǎo)安排兩個工作并行有點(diǎn)難頂啊)。
本文名稱:痛苦調(diào)優(yōu)10小時,我把Spark腳本運(yùn)行時間從15小時縮短到12分鐘!
分享URL:http://www.dlmjj.cn/article/dhdhhip.html


咨詢
建站咨詢
