Spark是最近比較火的數(shù)據(jù)處理平臺(tái)赴捞,相對(duì)于Hadoop的Mapreduce(MR)逼裆,既具有運(yùn)行速度的優(yōu)勢(shì),又打破的Hadoop MR交互性差的局限赦政,同時(shí)胜宇,其機(jī)器學(xué)習(xí)組件MLlib可以極大的滿足數(shù)據(jù)處理過程中的算法需求。
Spark采用Scala語言編寫恢着,但同時(shí)支持Scala桐愉,Python與Java做為開發(fā)語言,甚至SparkR項(xiàng)目的出現(xiàn)某種程度上支持了R語言然评。
MongoDB做為NoSQL比較早的實(shí)現(xiàn)仅财,其文檔化的存儲(chǔ)方式狈究,更貼切數(shù)據(jù)的表達(dá)碗淌,其自身的BSON數(shù)據(jù)格式跟JSON非常相像,是做為半結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的選擇之一抖锥。
但是現(xiàn)有的Spark與MongoDB的集成亿眠,大部分都局限在Java和Scala版本上,Python的實(shí)現(xiàn)可以參考的文章實(shí)在有限磅废,尤其對(duì)Spark中的數(shù)據(jù)存儲(chǔ)到MongoDB方面纳像,也有不少坑。
本文參考 @Matt 發(fā)表在databricks上的這篇文章:https://databricks.com/blog/2015/03/20/using-mongodb-with-spark.html拯勉,在這篇文章的基礎(chǔ)上進(jìn)行了翻譯并改進(jìn)竟趾,希望能對(duì)現(xiàn)在跟我一樣有這樣需求的小伙伴有一定的幫助。
1宫峦、準(zhǔn)備工作
首先岔帽,你需要準(zhǔn)備好Spark跟MongoDB的環(huán)境,版本的話导绷,Spark一定要1.3.0+犀勒,這個(gè)版本推出了DataFrame,與Spark SQL集合起來用,可以達(dá)到開發(fā)效率跟運(yùn)行效率的雙向提高贾费,選擇1.3以上版本是因?yàn)橹暗陌姹居羞@個(gè)Issue:SPARK-5361存在钦购。MongoDB的話,推薦3.0褂萧,參考3.0的release note押桃。
然后,你需要準(zhǔn)備好相應(yīng)的Library:1)mongo-java-driver导犹,選擇3.0.1版本怨规,3.1版本沒有試過,理論上應(yīng)該也可行锡足;2)mongo-hadoop波丰,不要直接去下載1.3.2版本,該版本有BUG舶得,需要編譯掰烟。
2、修改mongo-hadoop庫
1)git clone https://github.com/mongodb/mongo-hadoop
2) 修改MongoRecordWriter.java文件
修改的目的是為了可以直接讓dict型的數(shù)據(jù)直接存在MongoDB中沐批,而不是以{value:dict}的方式存儲(chǔ)纫骑,修改參看下圖,實(shí)在忍不住吐槽下簡(jiǎn)書默認(rèn)的編輯器, 引用九孩,代碼都沒有辦法高亮 :(
3)編譯
官方默認(rèn)的編譯命令是: ./gradlew jar 先馆,編譯后的文件會(huì)放在core/build/libs目錄下
3、運(yùn)行
前期工作準(zhǔn)備好之后躺彬,使用pyspark --master local[6] --driver-class-path <path>/mongo-java-driver-3.0.1.jar --jars <path>/mongo-hadoop-core-1.3.3-SNAPSHOT.jar,<path>/mongo-java-driver-3.0.1.jar 運(yùn)行pyspark煤墙。注意,目前測(cè)試下來宪拥,僅支持local方式運(yùn)行仿野。
請(qǐng)參考https://databricks.com/blog/2015/03/20/using-mongodb-with-spark.html中的例子去運(yùn)行程序,just enjoy it :)
4她君、總結(jié)
Scala做為Spark的編寫語言脚作,目前來看,對(duì)Spark支持的最好的還是Scala缔刹,Python在數(shù)據(jù)類型的轉(zhuǎn)化上還是有著不少問題球涛,比如:Calendar類型的支持的Issue現(xiàn)在依然是Open的狀態(tài),參考HADOOP-193校镐,這只是眾多問題的一個(gè)亿扁,花大量的時(shí)間去填坑,而不能專注在數(shù)據(jù)處理的業(yè)務(wù)流上灭翔,也是不得不面對(duì)的問題魏烫。