??[個(gè)推]Spark實(shí)踐教你繞過開發(fā)那些“坑”

個(gè)推 Spark 實(shí)踐教你繞過開發(fā)那些“坑” - V2EX https://www.v2ex.com/t/241917

典型的 lambda 架構(gòu).png

//
個(gè)推教你繞過開發(fā)那些坑

1 、數(shù)據(jù)處理經(jīng)常出現(xiàn)數(shù)據(jù)傾斜扁位,導(dǎo)致負(fù)載不均衡的問題曾棕,需要做統(tǒng)計(jì)分析找到傾斜數(shù)據(jù)特征刊懈,定散列策略把将。

2 夷恍、使用 Parquet 列式存儲童擎,減少 IO ,提高 Spark SQL 效率苏章。

3 寂嘉、實(shí)時(shí)處理方面:一方面要注意數(shù)據(jù)源( Kafka ) topic 需要多個(gè) partition 奏瞬,并且數(shù)據(jù)要散列均勻,使得 Spark Streaming 的 Recevier 能夠多個(gè)并行泉孩,并且均衡地消費(fèi)數(shù)據(jù) 硼端。使用 Spark Streaming ,要多通過 Spark History 排查 DStream 的操作中哪些處理慢寓搬,然后進(jìn)行優(yōu)化珍昨。另外一方面我們自己還做了實(shí)時(shí)處理的監(jiān)控系統(tǒng),用來監(jiān)控處理情況如流 入句喷、流出數(shù)據(jù)速度等镣典。通過監(jiān)控系統(tǒng)報(bào)警,能夠方便地運(yùn)維 Spark Streaming 實(shí)時(shí)處理程序。這個(gè)小監(jiān)控系統(tǒng)主要用了 influxdb+grafana 等實(shí)現(xiàn)唾琼。

4 兄春、我們測試網(wǎng)經(jīng)常出現(xiàn)找不到第三方 jar 的情況,如果是用 CDH 的同學(xué)一般會遇到锡溯,就是在 CDH 5.4 開始赶舆, CDH 的技術(shù)支持人員說他們?nèi)サ袅?hbase 等一些 jar ,他們認(rèn)那些 jar 已經(jīng)不需要耦合在自己的 classpath 中祭饭,這個(gè)情況可以通過 spark.executor.extraClassPath 方式添加進(jìn)來芜茵。

5 、一些新入門的人會遇到搞不清 transform 和 action 倡蝙,沒有明白 transform 是 lazy 的夕晓,需要 action 觸發(fā),并且兩個(gè) action 前后調(diào)用效果可能不一樣悠咱。

6 、大家使用過程當(dāng)中征炼,對需要重復(fù)使用的 RDD 析既,一定要做 cache ,性能提升會很明顯谆奥。

//
Spark 在個(gè)推業(yè)務(wù)上的具體使用現(xiàn)狀

1 眼坏、個(gè)推做用戶畫像、模型迭代以及一些推薦的時(shí)候直接用了 MLLib 酸些, MLLib 集成了很多算法宰译,非常方便。

2 魄懂、個(gè)推有一個(gè) BI 工具箱沿侈,讓一些運(yùn)營人員提取數(shù)據(jù),我們是用 Spark SQL+Parquet 格式寬表實(shí)現(xiàn)市栗, Parquet 是列式存儲格式缀拭,使用它你不用加載整個(gè)表咳短,只會去加載關(guān)心那些字段,大大減少 IO 消耗蛛淋。

3 咙好、實(shí)時(shí)統(tǒng)計(jì)分析這塊:例如個(gè)推有款產(chǎn)品叫個(gè)圖,就是使用 Spark streaming 來實(shí)時(shí)統(tǒng)計(jì)褐荷。

4 勾效、復(fù)雜的 ETL 任務(wù)我們也使用 Spark 。例如:我們個(gè)推推送報(bào)表這一塊叛甫,每天需要做很多維度的推送報(bào)表統(tǒng)計(jì)层宫。使用 Spark 通過 cache 中間結(jié)果緩存,然后再統(tǒng)計(jì)其他維度合溺,大大地減少了 I/O 消耗卒密,顯著地提升了統(tǒng)計(jì)處理速度。


Spark 作為一個(gè)開源數(shù)據(jù)處理框架棠赛,它在數(shù)據(jù)計(jì)算過程中把中間數(shù)據(jù)直接緩存到內(nèi)存里哮奇,能大大地提高處理速度,特別是復(fù)雜的迭代計(jì)算睛约。 Spark 主要包括 SparkSQL 鼎俘, SparkStreaming , Spark MLLib 以及圖計(jì)算辩涝。

Spark 核心概念簡介 1 贸伐、 RDD 即彈性分布式數(shù)據(jù)集,通過 RDD 可以執(zhí)行各種算子實(shí)現(xiàn)數(shù)據(jù)處理和計(jì)算怔揩。比如用 Spark 做統(tǒng)計(jì)詞頻捉邢,即拿到一串文字進(jìn)行 WordCount ,可以把這個(gè)文字?jǐn)?shù)據(jù) load 到 RDD 之后商膊,調(diào)用 map 伏伐、 reducebyKey 算子,最后執(zhí)行 count 動作觸發(fā)真正的計(jì)算晕拆。 2 藐翎、寬依賴和窄依賴。工廠里面有很多流水線实幕,一款產(chǎn)品上游有一個(gè)人操作吝镣,下游有人進(jìn)行第二個(gè)操作,窄依賴和這個(gè)很類似昆庇,下游依賴上游末贾。而所謂寬依賴類似于有多條流水線, A 流水線的一個(gè)操作是需要依賴一條流水線 B 凰锡,才可以繼續(xù)執(zhí)行未舟,要求兩條流水線之間要做材料運(yùn)輸圈暗,做協(xié)調(diào),但效率低裕膀。
從上圖可以看到员串,如果 B 只依賴 A 則是一種窄依賴。像圖中這種 reduceByKey 的操作昼扛,就是剛剛舉例的寬依賴寸齐,類似于多條流水線之間某一些操作相互依賴,如: F 對 E 抄谐、 B 的依賴渺鹦。寬依賴最大的問題是會導(dǎo)致洗牌過程。 Spark Streaming 介紹 流式計(jì)算蛹含,即數(shù)據(jù)生成后毅厚,實(shí)時(shí)對數(shù)據(jù)進(jìn)行處理。 Spark 是一個(gè)批處理框架浦箱,那它如何實(shí)現(xiàn)流式處理吸耿? Spark 是把數(shù)據(jù)裁成一段一段的處理,即一個(gè)數(shù)據(jù)流離散化成許多個(gè)連續(xù)批次,然后 Spark 對每個(gè)批次進(jìn)行處理酷窥。
個(gè)推為什么選擇 Spark 咽安? 1 、 Spark 比較適合迭代計(jì)算蓬推,解決我們團(tuán)隊(duì)在之前使用 hadoop mapreduce 迭代數(shù)據(jù)計(jì)算這一塊的瓶頸妆棒。 2 、 Spark 是一個(gè)技術(shù)棧沸伏,但可以做很多類型的數(shù)據(jù)處理:批處理糕珊, SQL ,流式處理以及 ML 等毅糟,基本滿足我們團(tuán)隊(duì)當(dāng)時(shí)的訴求放接。 3 、它的 API 抽象層次非常高留特,通過使用 map 、 reduce 玛瘸、 groupby 等多種算子可快速實(shí)現(xiàn)數(shù)據(jù)處理蜕青,極大降低開發(fā)成本,并且靈活糊渊。另外 Spark 框架對于多語言支持也是非常好右核,很多負(fù)責(zé)數(shù)據(jù)挖掘算法同學(xué)對于 python 熟悉,而工程開發(fā)的同學(xué)熟悉 java 渺绒, 多語言支持可以把開發(fā)和分析的同學(xué)快速地引入過來贺喝。 4 菱鸥、在 2014 年的時(shí)候,我們用 hadoop Yarn 躏鱼,而 Spark 可以在 Yarn 部署起來氮采,使用 Spark 大大降低了切換成本,并且可以把之前的 hadoop 資源利用起來染苛。 5 鹊漠、 Spark 在社區(qū)很火,找資料非常方便茶行。 個(gè)推數(shù)據(jù)處理架構(gòu)
上圖是一個(gè)典型的 lambda 架構(gòu)躯概。主要分三層。上面藍(lán)色的框畔师,是做離線批量處理娶靡,下面一層是實(shí)時(shí)數(shù)據(jù)處理這一塊,中間這一層是對于結(jié)果數(shù)據(jù)做一些存儲和檢索看锉。 有兩種方式導(dǎo)入數(shù)據(jù)到 HDFS 姿锭,一部分?jǐn)?shù)據(jù)從業(yè)務(wù)平臺日志收集寫入到 Kafka ,然后直接 Linkedin Camus (我們做過擴(kuò)展) 準(zhǔn)實(shí)時(shí)地傳輸?shù)?HDFS 度陆,另外部分?jǐn)?shù)通過運(yùn)維那邊的腳本定時(shí)導(dǎo)入到 HDFS 上艾凯。 離線處理部分我們還是使用兩個(gè)方式( Hadoop MR 和 Spark )。原有的 hadoop MR 沒有放棄掉懂傀, 因?yàn)樵瓉砗芏嗟墓こ桃呀?jīng)是用 MR 做的了趾诗,非常穩(wěn)定,沒有必要推倒重來蹬蚁,只有部分迭代任務(wù)使用 Spark 重新實(shí)現(xiàn)恃泪。另外 Hive 是直接可以跟 Spark 做結(jié)合, Spark Sql 中就可以使用 Hive 的命令犀斋。 個(gè)推 Spark 集群的部署狀況 個(gè)推最開始用 Spark 是 1.3.1 版本贝乎,用的是刀片服務(wù)器,就是刀框里面可以塞 16 個(gè)刀片服務(wù)器,單個(gè)內(nèi)存大小 192G 叽粹, CPU 核數(shù)是 24 核的览效。在 Spark 官方也推薦用萬兆網(wǎng)卡,大內(nèi)存設(shè)備虫几。我們權(quán)衡了需求和成本后锤灿,選擇了就用刀片機(jī)器來搭建 Spark 集群。刀框有個(gè)好處就是通過背板把刀片機(jī)器連接起來辆脸,傳輸速度快但校,相對成本小。部署模式上采用的是 Spark on Yarn 啡氢,實(shí)現(xiàn)資源復(fù)用状囱。 Spark 在個(gè)推業(yè)務(wù)上的具體使用現(xiàn)狀 1 术裸、個(gè)推做用戶畫像、模型迭代以及一些推薦的時(shí)候直接用了 MLLib 亭枷, MLLib 集成了很多算法袭艺,非常方便。 2 奶栖、個(gè)推有一個(gè) BI 工具箱匹表,讓一些運(yùn)營人員提取數(shù)據(jù),我們是用 Spark SQL+Parquet 格式寬表實(shí)現(xiàn)宣鄙, Parquet 是列式存儲格式袍镀,使用它你不用加載整個(gè)表,只會去加載關(guān)心那些字段冻晤,大大減少 IO 消耗苇羡。 3 、實(shí)時(shí)統(tǒng)計(jì)分析這塊:例如個(gè)推有款產(chǎn)品叫個(gè)圖鼻弧,就是使用 Spark streaming 來實(shí)時(shí)統(tǒng)計(jì)设江。 4 、復(fù)雜的 ETL 任務(wù)我們也使用 Spark 攘轩。例如:我們個(gè)推推送報(bào)表這一塊叉存,每天需要做很多維度的推送報(bào)表統(tǒng)計(jì)。使用 Spark 通過 cache 中間結(jié)果緩存度帮,然后再統(tǒng)計(jì)其他維度歼捏,大大地減少了 I/O 消耗,顯著地提升了統(tǒng)計(jì)處理速度笨篷。 個(gè)推 Spark 實(shí)踐案例分享
上圖是個(gè)推熱力圖的處理架構(gòu)瞳秽。左邊這一側(cè)利用業(yè)務(wù)平臺得到設(shè)備的實(shí)時(shí)位置數(shù)據(jù),通過 Spark Streaming 以及計(jì)算得到每一個(gè) geohash 格子上的人數(shù)率翅,然后統(tǒng)計(jì)結(jié)果實(shí)時(shí)傳輸給業(yè)務(wù)服務(wù)層练俐,在 push 到客戶端地圖上面去渲染,最終形成一個(gè)實(shí)時(shí)熱力圖冕臭。 Spark Streaming 主要用于數(shù)據(jù)實(shí)時(shí)統(tǒng)計(jì)處理上腺晾。 個(gè)推教你繞過開發(fā)那些坑 1 、數(shù)據(jù)處理經(jīng)常出現(xiàn)數(shù)據(jù)傾斜辜贵,導(dǎo)致負(fù)載不均衡的問題丘喻,需要做統(tǒng)計(jì)分析找到傾斜數(shù)據(jù)特征,定散列策略念颈。 2 、使用 Parquet 列式存儲连霉,減少 IO 榴芳,提高 Spark SQL 效率嗡靡。 3 、實(shí)時(shí)處理方面:一方面要注意數(shù)據(jù)源( Kafka ) topic 需要多個(gè) partition 窟感,并且數(shù)據(jù)要散列均勻讨彼,使得 Spark Streaming 的 Recevier 能夠多個(gè)并行,并且均衡地消費(fèi)數(shù)據(jù) 。使用 Spark Streaming ,要多通過 Spark History 排查 DStream 的操作中哪些處理慢斩芭,然后進(jìn)行優(yōu)化阅羹。另外一方面我們自己還做了實(shí)時(shí)處理的監(jiān)控系統(tǒng),用來監(jiān)控處理情況如流 入揽祥、流出數(shù)據(jù)速度等。通過監(jiān)控系統(tǒng)報(bào)警,能夠方便地運(yùn)維 Spark Streaming 實(shí)時(shí)處理程序。這個(gè)小監(jiān)控系統(tǒng)主要用了 influxdb+grafana 等實(shí)現(xiàn)重荠。 4 、我們測試網(wǎng)經(jīng)常出現(xiàn)找不到第三方 jar 的情況虚茶,如果是用 CDH 的同學(xué)一般會遇到戈鲁,就是在 CDH 5.4 開始, CDH 的技術(shù)支持人員說他們?nèi)サ袅?hbase 等一些 jar 嘹叫,他們認(rèn)那些 jar 已經(jīng)不需要耦合在自己的 classpath 中婆殿,這個(gè)情況可以通過 spark.executor.extraClassPath 方式添加進(jìn)來。 5 罩扇、一些新入門的人會遇到搞不清 transform 和 action 婆芦,沒有明白 transform 是 lazy 的,需要 action 觸發(fā)暮蹂,并且兩個(gè) action 前后調(diào)用效果可能不一樣寞缝。 6 、大家使用過程當(dāng)中仰泻,對需要重復(fù)使用的 RDD 荆陆,一定要做 cache ,性能提升會很明顯集侯。 以上內(nèi)容根據(jù)個(gè)推講師袁凱在 11 月 28 號 Segmentfault 北京 D-Day 沙龍的分享整理被啼,希望給廣大開發(fā)者一些啟示。小伙伴們記得將 get 到的干貨順手分享給身邊的同學(xué)們哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棠枉,一起剝皮案震驚了整個(gè)濱河市浓体,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辈讶,老刑警劉巖命浴,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡生闲,警方通過查閱死者的電腦和手機(jī)媳溺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碍讯,“玉大人悬蔽,你說我怎么就攤上這事∽叫耍” “怎么了蝎困?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倍啥。 經(jīng)常有香客問我禾乘,道長,這世上最難降的妖魔是什么逗栽? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任盖袭,我火速辦了婚禮,結(jié)果婚禮上彼宠,老公的妹妹穿的比我還像新娘鳄虱。我一直安慰自己,他們只是感情好凭峡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布拙已。 她就那樣靜靜地躺著,像睡著了一般摧冀。 火紅的嫁衣襯著肌膚如雪倍踪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天索昂,我揣著相機(jī)與錄音建车,去河邊找鬼。 笑死椒惨,一個(gè)胖子當(dāng)著我的面吹牛缤至,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播康谆,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼领斥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沃暗?” 一聲冷哼從身側(cè)響起月洛,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孽锥,沒想到半個(gè)月后嚼黔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體细层,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年唬涧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了今艺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爵卒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撵彻,到底是詐尸還是另有隱情钓株,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布陌僵,位于F島的核電站轴合,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碗短。R本人自食惡果不足惜受葛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望偎谁。 院中可真熱鬧总滩,春花似錦、人聲如沸巡雨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐望。三九已至冈涧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間正蛙,已是汗流浹背督弓。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乒验,地道東北人愚隧。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像徊件,于是被迫代替她去往敵國和親奸攻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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