hadoop 和spark如何系統的學習?
最近將hadoop spark都了解了,編過很簡單的例子,簡單學習了scala,想問下如何深入學習這些?如何實踐?
下面講的基本是矩陣相關的,因為當時寫的都是矩陣相關的代碼…現在看來之前寫的這個有點偏題。最好的建議就是認真學習官方文檔,多寫代碼多實踐,多看別人寫的好的代碼。稍微不注意的話用Scala寫出來的代碼可讀性會很不好,所以還要重視代碼規範。
……………………………
公司實習中,工作中寫Spark代碼,給點我自己的心得。只學了一個月左右,也只能算剛入門吧。關於Hadoop,只了解配置相關,除了寫過從hdfs讀文件的代碼,沒有寫過其他代碼。
關於Spark,講一下我從入門開始的學習過程:
我用了兩個星期時間學習了Scala,先參考一下這個問題:如何學好Scala?請給出一條科學的時間線 - 陳曉宇的回答。學完了Scala之後再學習一下Spark的RDD,據說這篇論文一定要看https://www.usenix.org/system/files/conference/nsdi12/nsdi12-final138.pdf。然後在網上多看看別人在Spark踩過的坑和Spark的使用經驗,自己不要再跳就行。剩下的就是多寫Spark代碼了,在寫代碼的時候要多思考,有問題直接去 Stack Overflow 上問,提問之前先問一下自己這個問題我是不是真的找不到解決方法,我的這個問題是不是一個有價值的問題。
另外,寫比較複雜的程序的時候,Spark的源碼是要看的,你要看某個類提供了哪些方法可以調用,調用這個方法返回的是什麼樣的返回值等等。
在寫代碼的過程中會遇到很多坑,只有你自己慢慢去發現,慢慢積累了,所以沒有什麼捷徑,實踐是硬道理。比如說關於序列化,哪些變數需要用@transient聲明不可序列化;zipWithUniqueId並不是從0開始連續計數;MLlib中RowMatrix並沒有行號的概念,不關心矩陣中行的順序,如果行號對你很重要你必須使用IndexedRowMatrix(具體參考這個問題 scala - Converting CoordinateMatrix to RowMatrix doesn"t preserve row order);列印CoordinateMatrix可以先toBlockMatrix然後再toLocalMatrix(一般情況下不把distributed的矩陣轉為local矩陣,我是調試過程中輸出矩陣的值才用到,具體參考這個問題 scala - Converting CoordinateMatrix to Array?);還有一個連接MySQL中"No suitable driver found for jdbc"的問題(參考 mysql - No suitable driver found for jdbc in Spark)等等這些坑我都踩過。
遇到過的另一個問題:RDD transformations and actions can only be invoked by the driver, not
inside of other transformations; for example, rdd1.map(x =&> rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. 簡單的說,就是RDD的操作裡面不允許再出現RDD的操作。An error about Dataset.filter in Spark SQL 這個問題也是因為該原因引起的。關於你提的如何實踐?那就自己找找可以用Spark寫的小項目,MLlib中有很多example你可以看一下,MLlib - Spark 1.6.0 Documentation 里的很多演算法可以讓你練習很久了,如果沒有大的數據量就自己構造數據,先寫小實驗開始入門。
雲棲社區圍繞大數據技術——Spark整理了一份詳盡的學習、實踐課程,整個課程分為三大部分:
一、基礎打磨:《Scala入門到精通》《LinuxAkka基礎》的系列學習課程;
二、深入理解:本部分主要包含《源碼走讀》、《組件解析》兩部分內容;
三、應用實踐:從語言的場景實踐到技術應用提供了全方的實戰演練案例,讀者可以根據內容手把手地進行;
課程介紹如下,提供給各位同學提前預覽各取所需,課程學習頁面請點擊此處進入:
一、基礎打磨篇:
1.1 《Scala入門到精通》
· 第一節:Scala語言初步
· 第二節:Scala基本類型及操作、程序控制結構
· 第三節:Array、List
· 第四節:Set、Map、Tuple、隊列操作實戰
· 第五節:函數與閉包
· 第六節:類和對象(一)
· 第七節:類和對象(二)
· 第八節:包和引入
· 第九節:繼承與組合
· 第十節:Scala類層次結構、Traits初步
· 第十一節:Trait進階
· 第十二節:I/O與正則表達式
· 第十三節:高階函數
· 第十四節:Case Class與模式匹配(一)
· 第十五節:Case Class與模式匹配(二)
· 第十六節:泛型與註解
· 第十七節:類型參數(一)
· 第十八節:隱式轉換與隱式參數(一)
· 第十九節:隱式轉換與隱式參數(二)
· 第二十節:類型參數(二)
· 第二十一節:類型參數(三)
· 第二十二節:高級類型 (一)
· 第二十三節:高級類型 (二)
· 第二十四節:高級類型 (三)
· 第二十五節:提取器(Extractor)
· 第二十六節:Scala並發編程基礎
· 第二十七節:Scala操縱XML
· 第二十八節:Scala與JAVA互操作
· 第二十九節:Scala資料庫編程
· 第三十節:Scala腳本編程與結束語
1.2 《Linux Akka基礎》
· 第一節:Linux介紹、安裝及使用初步
· 第二節:Linux文件系統、目錄(一)
· 第三節:用戶和組 · 第四節:Linux文件系統(二)
· 第五節:vi、vim編輯器(一)
· 第六節:vi、vim編輯器(二)
· 第七節:進程管理
· 第八節:網路管理
· 第九節:Shell編程入門(一)
· 第十節:Shell編程入門(二)
· 第十一節:Shell編程入門(三)
· 第十二節:Shell編程入門(四)
· 第十三節:Shell編程入門(五)
· 第十四節:Shell編程入門(六)
· 第十五節:基礎正則表達式(一)
· Akka並發編程(一):並發編程簡介
· Akka並發編程(二)::Actor模型(一)
· Akka並發編程(三):Actor模型(二)
· Akka並發編程(四):Actor模型(三)
· Akka並發編程(五):Actor模型(四)
· Akka並發編程(六):Actor模型(五)
· Akka並發編程(七):Actor模型(六)
· Akka並發編程(八):Actor模型(七)
二、深入理解篇
2.1 《源碼走讀》
· 第一節:Spark應用程序提交流程
· 第二節:SparkContext的創建
· 第三節:Spark Job的提交
· 第四節:Stage劃分
· 第五節:Stage提交
· 第六節:Task提交
· 第七節:ResourceOffers與LaunchTasks解析
· 第八節:Task執行
· 第九節:Task執行成功時的結果處理
· 第十節:Standalone運行模式解析
· 第十一節:Spark SQL 處理流程分析
· 第十二節:Spark SQL之SQLContext(一)
2.2 《組件解析》
· 第一節:Spark 1.5.0集群搭建
· 第二節:Hadoop、Spark生成圈簡介
· 第三節:Spark Intellij IDEA開發環境搭建
· 第四節:Spark編程模型(一)
· 第五節:Spark編程模型(二)
· 第六節:Spark編程模型(三)
· 第七節:Spark運行原理
· 第八節:Spark SQL與DataFrame(一)
· 第九節:Spark SQL運行流程解析
· 第十節:Spark SQL案例實戰(一)
· 第十一節:Spark Streaming(一)
· 第十二節:Spark Streaming(二)
· 第十三節:Spark Streaming(三)
· 第十四節:Spark Streaming(四)
· 第十五節:Kafka 0.8.2.1 集群搭建
· 第十六節:Spark Streaming與Kafka
三、應用實踐篇
3.1 《場景實踐》
· 和封神一起「深挖」Spark
· 商品搜索引擎---推薦系統設計
· 阿里Spark實踐與探索
· 如何做Spark 版本兼容
· 用線性回歸無編碼實現文章瀏覽數預測
· Spark Streaming+Spark SQL實現可配置ETL
· 2016中國spark技術峰會見聞摘要
· Spark Streaming 流式計算實戰
· 利用 Spark DataSource API 實現Rest數據源
· 協同過濾演算法多語言實現 · Spark 數據傾斜的一些表現
· Spark性能優化 · Spark性能優化——和shuffle搏鬥
· Kafka+Spark Streaming+Redis實時計算實踐
· 數據處理平台架構中的SMACK組合
3.2 《技術應用》
· SparkSQL實戰(一):DataFrames基礎
· SparkSQL實戰(二):DataFrames進階
· SparkSQL實戰(三):SparkSQL應用案例
· ML On Spark(一):基礎數據結構
· ML On Spark(二):基礎數據結構
· ML On Spark(三):統計基礎
· ML On Spark(四):統計基礎
更多:E-MapReduce實踐應用場景介紹
· 泰為基於EMR的考量與實踐
· 基於E-MapReduce梨視頻推薦系統
· Databricks、Intel、阿里、梨視頻的實踐
· E-MapReduce集群搭建HAWQ實踐
· E-MapReduce支持計算與存儲分離,成本降1倍
· 阿里雲MongoDB與EMR的HelloWorld
· E-MapReduce(Hadoop)10大類問題集群規劃
· 雲上Hadoop之優勢
點擊此處查看課程詳細內容
更多技術乾貨歡迎點擊關注知乎機構號:阿里云云棲社區 - 匯聚阿里技術精粹
熟悉基本的操作後,看看優秀的工程化的代碼會很有幫助。多拿點數據來跑跑,做複雜的實驗,遇到問題解決問題便是最好的學習方法
大數據是一個概念,hadoop是來實現這個概念的工具、技術,它們之間並沒有絕對的聯繫。Hadoop作為一代分散式系統的基礎,特別是第二代Hadoop YARN推出以後,這個位置更加牢固。目前在市面上並沒有可以與之相匹敵的系統存在。
1.首先,不管你之前有沒有接觸過hadoop,或者你在某個方向特別牛逼,你都要有空杯心態,這才是學習的根據。
2. 你要有編程基礎,比如Java,C,python,linux,不一定要在某個方向多麼牛逼,有這些基礎學起來就會很快上手。
3. 詳細研究,現在大型網站包括Sina,騰訊網(門戶),Weibo(微博),天貓,京東(電商)的架構與實現,先從自己的角度去理解,然後去跟實際情況做比對,提升自己對數據和技術的敏感程度。
4.熟悉,理解,並運用Hadoop對於你以後在大型計算機公司任職非常重要(阿里,騰訊,百度內部的系統或多或少都是借鑒於Hadoop的)。
5. 科班的同學,在學校的以基礎為根基,在公司的以業務為導向,這樣的技術才不盲目,這樣的技術才腳踏實地。
6.不過,Hadoop說到底只是一項分散式系統的工具,學習的本質是:理解分散式系統設計中的原則以及方法,例如負載均衡,故障恢復,並發程序設計,並發數據結構,等等。理解這些設計原理,並走入底層讀懂每一行Hadoop的源碼更加的重要
hadoop只是雲計算的一隅,任何東西學的深入了都會發生質變。
對很多人來說,技術都不是一生的職業導向,那麼,提升自己的眼界,站在更高的角度思考問題就顯得尤為重要,從自己,到團隊,公司,再到整個業界,眼界寬廣了,技術也就是你的左膀右臂。
hadoop和Spark是兩種不同的大數據生態系統,各自的組件都非常豐富,往往也不容易學,我把他們兩者整理在一幅圖中,給大家一個全貌的感覺,大家可以把這幅圖當做學習導航圖,逐個組件的去攻破。至於各組件的詳細介紹、相關聯繫和區別、學習要點,以及它們在大數據平台建設中的具體實施關注點,待點贊數達到1000,我再對帖子進行詳細的更新,請大家隨手幫忙點個贊。
以上這些大數據組件是日常大數據工作中經常會碰到的,每個組件大概的功能,我已經在圖中做了標識。下面,針對這幅圖我給大家兩點重要提示:
a.藍色部分,是Hadoop生態系統組件,黃色部分是Spark生態組件,雖然他們是兩種不同的大數據處理框架,但它們不是互斥的,Spark與hadoop 中的MapReduce是一種相互共生的關係。Hadoop提供了Spark許多沒有的功能,比如分散式文件系統,而Spark 提供了實時內存計算,速度非常快。有一點大家要注意,Spark並不是一定要依附於Hadoop才能生存,除了Hadoop的HDFS,還可以基於其他的雲平台,當然啦,大家一致認為Spark與Hadoop配合默契最好擺了。
b.技術趨勢:Spark在崛起,hadoop和Storm中的一些組件在消退。大家在學習使用相關技術的時候,記得與時俱進掌握好新的趨勢、新的替代技術,以保持自己的職業競爭力。
HSQL未來可能會被Spark SQL替代,現在很多企業都是HIVE SQL和Spark SQL兩種工具共存,當Spark SQL逐步成熟的時候,就有可能替換HSQL;
MapReduce也有可能被Spark 替換,趨勢是這樣,但目前Spark還不夠成熟穩定,還有比較長的路要走;
Hadoop中的演算法庫Mahout正被Spark中的演算法庫MLib所替代,為了不落後,大家注意去學習Mlib演算法庫;
Storm會被Spark Streaming替換嗎?在這裡,Storm雖然不是hadoop生態中的一員,但我仍然想把它放在一起做過比較。由於Spark和hadoop天衣無縫的結合,Spark在逐步的走向成熟和穩定,其生態組件也在逐步的完善,是冉冉升起的新星,我相信Storm會逐步被擠壓而走向衰退。
歡迎大家關注我的知乎專欄「大數據實踐與職業生涯」並留言,專欄會陸續的推出過往十多年的大數據工作經驗總結和我的一些研究實踐成果。如果你是大數據新人,或者想轉行進入大數據領域,或者大數據職業生涯上存在一些疑惑,都歡迎關注我的知乎live分享「大數據人的職業生涯規劃」 、 「數據分析師-從零入門到精通」、「大數據人的數據科學家之路」。
應用層面的話,最好找一些實際的例子來完成,解決實際的一些問題,spark example裡面有很多例子,可以仔細看下,也可以自己嘗試著自己實現下kmeans、lr、pagerank之類的演算法。應用比較熟練之後,可以去閱讀spark的源碼,網上各種源碼解析的資料非常多,Databricks官網也有很多博客,非常不錯。
看了上面的大佬的見解,我只能挑出Hadoop和spark集群搭建的問題,作為初學者弱弱地講一下自己的見解。的確在初學Hadoop或者spark的時候,第一件事情就是搭建環境,這是一件看似很簡單但是很浪費時間的偉大工程(後來我們發現凡是學一個新的計算機方面的知識,搭建環境這件事,你慢慢習慣就好了,對,習慣就好)。作為一個對大數據感興趣,想了解它實際運行的模式,總覺得不搭建一個真實的集群,跑一跑程序,老是感覺我搞的是「假」Hadoop或者spark,心裡總是有一種缺失感(就好比在某寶上買東西和到實體店中買東西的感覺)。如果你手頭上沒有資源搭建真正的資源,我覺得還是在虛擬機裡面搭建一個3-4個節點的集群,搭建的過程多看看官方的文檔,雖然是英文的,但是耐心點,還是能琢磨透的。這個過程肯定有很多坑,但是還是要耐心吧,多和人交流,心平氣和。作為搞開發的,心平氣和可以「續命」,對,你沒聽錯,「續命」。
前提會SQL,如果SQL都不太熟的話建議先把SQL搞明白,這些工具做的事情歸根結底就是SQL在做的事情,只不過實現是分散式而已。然後看源碼,把源碼中的例子看懂。
推薦閱讀:
※MapReduce過程中,如果Map之後每個Key對應Value的數量不平衡會不會影響效率?
※Spark 為什麼 不允許 RDD 嵌套(如 RDD[RDD[T]])?
※怎樣理解spark中的partition和block的關係?
※在Spark集群中,集群的節點個數、RDD分區個數、?cpu內核個數三者與並行度的關係??
※1.5版本的Spark自己來管理內存而不是使用JVM,這不使用JVM而是自己來管理內存是咋回事?