-
1 # i網路心連心
-
2 # 中亞國際區塊鏈研究院
這個問題我應該可以回答,零基礎學習spark,因為專案需要,硬著頭皮上了,先佔坑。
這幾天剛好被這貨折騰得死去活來的,晚上來答一發。
背景:某文科出長的三流985的cs專業本科,現大三,即將升大四,成績剛好夠保研,已放棄,準備找工作。大一,大二因為活躍於校內各社團,成績並不是很好,並且,尤其重要的是程式碼能力很渣。
大三才開始真正接觸程式設計。
交代背景只是想讓看到這個答案的朋友具有更好的借鑑意義。
接觸 Spark 是因為老師的一個和企業合作的專案需要用到,真正開始接觸 Spark到現在也不過一個多月,不過確實學習到了非常多的東西。
1、首先,搭環境一定是必須的啦,答主當時搭環境,前前後後就折騰了一個星期,linux,linux不懂,各種奇怪的命令,當時折騰linux命令的時候心中一萬隻草泥馬奔騰而過,許可權的各種奇奇怪怪的問題,跟著網上的教程來做還會出錯更是傷心。但是經歷這個初始的環境折騰之後,你最基礎的linux命令至少會了,環境搭建過程中的各種配置檔案坑爹問題,經歷你的各種搜尋之後,你也可以大概知道各種配置檔案的作用,這有助於你後面程式出錯的時候查詢錯誤。
2、環境搭建好之後,因為專案的關係,你開始要程式設計了,但是Spark啥也不懂怎麼辦啊。
沒關係,先搭好開發環境。搭好後得看你的專案需求了。根據你的專案需求來思考學習方向。
3、我的專案需求大概是,從mongoDB讀取資料,進行簡單的計算之後丟回mongoDB裡去。
3.1 先搜尋Spark如何連線mongoDB,根據我當時的情況,我記得使用某度搜索,關鍵詞 Spark和mongoDB基本是沒啥有用的東西的,所以,這個時候,題主需要學會科學上網,這種比較新的東西,靠某度是沒啥用的,該飛越的時候還是要飛越的,mongo-hadoop-core。
3.2 連線好了之後,不懂 Scala怎麼辦,這個根本不是問題,首先,Spark基本是RDD之間的轉化操作,就map,split等幾個東西而已,剩下的只要大概懂最基本的語法就可以了(預設題主懂C語言),我們暫時不需要scala高階功能。你要是考我語法特性啥的,答主只能說,臣妾做不到啊。
3.3 專案新出了一個坑爹要求啊,要求將計算好的資料同時送到MySQL啊,簡直坑爹有木有,有木有。抱怨歸抱怨,程式還是要好好做的。當時國內某度依然搜尋不到任何資料,又飛越了長城,這個問題我應該可以回答,零基礎學習spark,因為專案需要,硬著頭皮上了,先佔坑。
這幾天剛好被這貨折騰得死去活來的,晚上來答一發。
背景:某文科出長的三流985的cs專業本科,現大三,即將升大四,成績剛好夠保研,已放棄,準備找工作。大一,大二因為活躍於校內各社團,成績並不是很好,並且,尤其重要的是程式碼能力很渣。
大三才開始真正接觸程式設計。
交代背景只是想讓看到這個答案的朋友具有更好的借鑑意義。
接觸 Spark 是因為老師的一個和企業合作的專案需要用到,真正開始接觸 Spark到現在也不過一個多月,不過確實學習到了非常多的東西。
1、首先,搭環境一定是必須的啦,答主當時搭環境,前前後後就折騰了一個星期,linux,linux不懂,各種奇怪的命令,當時折騰linux命令的時候心中一萬隻草泥馬奔騰而過,許可權的各種奇奇怪怪的問題,跟著網上的教程來做還會出錯更是傷心。但是經歷這個初始的環境折騰之後,你最基礎的linux命令至少會了,環境搭建過程中的各種配置檔案坑爹問題,經歷你的各種搜尋之後,你也可以大概知道各種配置檔案的作用,這有助於你後面程式出錯的時候查詢錯誤。
2、環境搭建好之後,因為專案的關係,你開始要程式設計了,但是Spark啥也不懂怎麼辦啊。
沒關係,先搭好開發環境。搭好後得看你的專案需求了。根據你的專案需求來思考學習方向。
3、我的專案需求大概是,從mongoDB讀取資料,進行簡單的計算之後丟回mongoDB裡去。
3.1 先搜尋Spark如何連線mongoDB,根據我當時的情況,我記得使用某度搜索,關鍵詞 Spark和mongoDB基本是沒啥有用的東西的,所以,這個時候,題主需要學會科學上網,這種比較新的東西,靠某度是沒啥用的,該飛越的時候還是要飛越的,mongo-hadoop-core。
3.2 連線好了之後,不懂 Scala怎麼辦,這個根本不是問題,首先,Spark基本是RDD之間的轉化操作,就map,split等幾個東西而已,剩下的只要大概懂最基本的語法就可以了(預設題主懂C語言),我們暫時不需要scala高階功能。你要是考我語法特性啥的,答主只能說,臣妾做不到啊。
3.3 專案新出了一個坑爹要求啊,要求將計算好的資料同時送到MySQL啊,簡直坑爹有木有,有木有。抱怨歸抱怨,程式還是要好好做的。當時國內某度依然搜尋不到任何資料,又飛越了長城,發現Spark的新版本有個新功能,insertIntoJDBC,結果這貨也是個坑啊,哎,發現它不會自己關閉,插入資料較多的之後,MySQL連線池不夠用啊,而且這貨根據最新版Spark官方文件,已經被廢棄了,因此自己寫了一個使用scala連線到MySQL的類(和java連線MySQL差不多)。
4、是的,你沒猜錯,我又遇到坑問題了。這個問題已經摺騰兩三天了,暫時還沒解決,希望各位前輩,能夠指點一點。
坑問題描述:
開發機環境,一個master,一個salve,程式不管是local模式還是standalone模式都執行正常。
伺服器環境,一個master,兩個slave,程式在local模式下執行正確,standalone模式丟擲java.lang.IllegalStateException open錯誤。目前有較大的可能性,是在連線mongodb進行查詢操作的時候,前面一個操作完之後直接關閉了連線,而後一個操作還沒操作完造成的錯誤。具體問題描述請看這裡mongodb - Spark on standalone cluster throws java.lang.illegalStateException
上面這個問題已經解決了,是因為mongo-hadoop-core版本支援的問題。而最關鍵的是我沒有清理編譯器的快取,這也導致了,即使一開始我知道是connector版本可能有問題,也沒有解決,這也導致了我多花費了好幾天來搞了這個問題,但是,這次的經歷讓我對如何查詢錯誤,如何解決問題,有了更深刻的體會。
強烈建議題主找一個實際專案做!
強烈建議題主找一個實際專案做!
強烈建議題主找一個實際專案做!
實在沒辦法,自己想一個需求,比如寫個程式,隨便找個地抓取一堆資料,然後用Spark來分析資料。知乎有很多如何抓取資料的好問題和好回答,題主可以自行搜尋。
最後,提醒題主一句話,Spark並不是一顆銀彈。
估計有人會奇怪,答主說自己程式設計能力弱還敢搞這個東西,首先我這麼有信心的原因是我大二暑假去一個小公司實習,該公司需要有人做iOS,然後直接丟給我,答主當時,mac啥的,objective-c啥的也不懂,但是沒關係,隨便買兩本書,大概看一下語法,做了書本幾個相關的簡單例子就可以實際操作了,最後還是做成功了,雖然程式碼有點亂。但是正是這次的完整的專案經歷,給了我學習的極大資訊。
然後,最最重要的一點是,Spark是一個讓人會又恨又愛的東西,為什麼呢?因為你會遇到更種坑問題,但也正是因為如此,解決這種坑問題會給你極大的滿足感,能激發你持續進步。
回覆列表
下面我們基於該檔案進行 Spark Shell 操作。
1)利用本地檔案系統的一個文字檔案建立一個新 RDD。
scala>var textFile = sc.textFile(“file://home/Hadoop/SparkData/WordCount/text1”);
textFile:org.apache.spark.rdd.RDD[String] = MappedRDD[1] at textFile at
<console>:12
2)執行動作操作,計算文件中有多少行。
scala>textFile.count() //RDD中有多少行
17/05/17 22:59:07 INFO spark.SparkContext:Job finished:count at<console>:15, took 5.654325469 s
resl:Long = 2
返回結果表明文件中有“2”行。
3)執行動作操作,獲取文件中的第一行內容。
scala>textFile.first() // RDD 第一行的內容
17/05/17 23:01:25 INFO spark.SparkContext:Job finished:first at <console>:15,took
返回結果表明文件的第一行內容是“hello world”。
4)轉換操作會將一個 RDD 轉換成一個新的 RDD。獲取包含“hello”的行的程式碼如下。
scala>var newRDD = textFile.filter (line => line.contains(“hello”)) //有多少行含有 hello
scala>newRDD.ount() // 有多少行含 hello
17/05/17 23:06:33 INFO spark.SparkContext:Job finished:count at <console>:15,took 0.867975549 s
res4:Long = 2
這段程式碼首先透過轉換操作 filter 形成一個只包括含有“hello”的行的 RDD,然後再透過 count 計算有多少行。
5)Spark Shell 的 WordCount 實現
scala> val file = sc.textFile (“file://home/hendoop/SparkData/WordCount/text1”));
scala> val count = file.flatMap(line=>line.split(“”)).map(word => (word,1)).reduceByKey(_+_)
scala> count.collect()
17/05/17 23:11:46 INFO spark.SparkContext:Job finished: collect at<console>:17,
took 1.624248037 s
res5: Array[(String, Int)] = Array((hello,2),(world,1),(My,1),(is,1),(love,1),(I,1),(John,1),(hadoop,1),(name,1),(programming,1))
使用 sparkContext 類中的 textFile() 讀取本地檔案,並生成 MappedBJDD。
使用 flatMap() 方法將檔案內容按照空格拆分單詞,拆分形成 FlatMappedRDD。
使用 map(word=>(word,1)) 將拆分的單詞形成 <單詞,1> 資料對,此時生成 MappedBJDD。
使用 reduceByKey() 方法對單詞的頻度進行統計,由此生成 ShuffledRDD,並由 collect 執行作業得出結果。