個(gè)推 Spark 實(shí)踐教你繞過開發(fā)那些“坑” - V2EX https://www.v2ex.com/t/241917
//
個(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é)們哦~
最后編輯于 :2017.12.06 04:50:10
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者