Spark是最近比较火的数据处理平台,相对于Hadoop的Mapreduce(MR),既具有运行速度的优势,又打破的Hadoop MR交互性差的局限,同时,其机器学习组件MLlib可以极大的满足数据处理过程中的算法需求。
Spark采用Scala语言编写,但同时支持Scala,Python与Java做为开发语言,甚至SparkR项目的出现某种程度上支持了R语言。
MongoDB做为NoSQL比较早的实现,其文档化的存储方式,更贴切数据的表达,其自身的BSON数据格式跟JSON非常相像,是做为半结构化数据存储的选择之一。
但是现有的Spark与MongoDB的集成,大部分都局限在Java和Scala版本上,Python的实现可以参考的文章实在有限,尤其对Spark中的数据存储到MongoDB方面,也有不少坑。
本文参考 @Matt 发表在databricks上的这篇文章:https://databricks.com/blog/2015/03/20/using-mongodb-with-spark.html,在这篇文章的基础上进行了翻译并改进,希望能对现在跟我一样有这样需求的小伙伴有一定的帮助。
1、准备工作
首先,你需要准备好Spark跟MongoDB的环境,版本的话,Spark一定要1.3.0+,这个版本推出了DataFrame,与Spark SQL集合起来用,可以达到开发效率跟运行效率的双向提高,选择1.3以上版本是因为之前的版本有这个Issue:SPARK-5361存在。MongoDB的话,推荐3.0,参考3.0的release note。
然后,你需要准备好相应的Library:1)mongo-java-driver,选择3.0.1版本,3.1版本没有试过,理论上应该也可行;2)mongo-hadoop,不要直接去下载1.3.2版本,该版本有BUG,需要编译。
2、修改mongo-hadoop库
1)git clone https://github.com/mongodb/mongo-hadoop
2) 修改MongoRecordWriter.java文件
修改的目的是为了可以直接让dict型的数据直接存在MongoDB中,而不是以{value:dict}的方式存储,修改参看下图,实在忍不住吐槽下简书默认的编辑器, 引用,代码都没有办法高亮 :(
MongoRecordWriter.java3)编译
官方默认的编译命令是: ./gradlew jar ,编译后的文件会放在core/build/libs目录下
mongo-hadoop-core-1.3.3-SNAPSHOT.jar3、运行
前期工作准备好之后,使用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 运行pyspark。注意,目前测试下来,仅支持local方式运行。
请参考https://databricks.com/blog/2015/03/20/using-mongodb-with-spark.html中的例子去运行程序,just enjoy it :)
4、总结
Scala做为Spark的编写语言,目前来看,对Spark支持的最好的还是Scala,Python在数据类型的转化上还是有着不少问题,比如:Calendar类型的支持的Issue现在依然是Open的状态,参考HADOOP-193,这只是众多问题的一个,花大量的时间去填坑,而不能专注在数据处理的业务流上,也是不得不面对的问题。
网友评论