让Spark、Python和MongoDB协同工作

让Spark、Python和MongoDB协同工作,python,mongodb,apache-spark,pyspark,pymongo,Python,Mongodb,Apache Spark,Pyspark,Pymongo,我很难将这些部件正确地连接在一起。我已安装Spark并成功运行,我可以在本地、独立运行作业,也可以通过Thread运行作业。我已遵循建议的步骤(据我所知),并且 我正在开发Ubuntu,我拥有的各种组件版本都是 SparkSpark-1.5.1-bin-hadoop2.6 HadoopHadoop-2.6.1 Mongo2.6.10 Mongo Hadoop连接器克隆自 Python2.7.10 我在遵循各种步骤时遇到了一些困难,例如要将哪些jar添加到哪个路径,因此我添加的是 在/usr

我很难将这些部件正确地连接在一起。我已安装Spark并成功运行,我可以在本地、独立运行作业,也可以通过Thread运行作业。我已遵循建议的步骤(据我所知),并且

我正在开发Ubuntu,我拥有的各种组件版本都是

  • SparkSpark-1.5.1-bin-hadoop2.6
  • HadoopHadoop-2.6.1
  • Mongo2.6.10
  • Mongo Hadoop连接器克隆自
  • Python2.7.10
我在遵循各种步骤时遇到了一些困难,例如要将哪些jar添加到哪个路径,因此我添加的是

  • /usr/local/share/hadoop-2.6.1/share/hadoop/mapreduce
    中,我添加了
    mongo-hadoop-core-1.5.0-SNAPSHOT.jar
  • 以下环境变量
    • export HADOOP\u HOME=“/usr/local/share/HADOOP-2.6.1”
    • export PATH=$PATH:$HADOOP\u HOME/bin
    • export SPARK_HOME=“/usr/local/share/SPARK-1.5.1-bin-hadoop2.6”
    • export PYTHONPATH=“/usr/local/share/mongo-hadoop/spark/src/main/python”
    • export PATH=$PATH:$SPARK\u HOME/bin
我的Python程序是basic

从pyspark导入SparkContext,SparkConf
进口pymongo_spark
pymongo_spark.activate()
def main():
conf=SparkConf().setAppName(“pyspark测试”)
sc=SparkContext(conf=conf)
rdd=sc.mongoRDD(
'mongodb://username:password@localhost:27017/mydb.mycollection')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
我正在使用命令运行它

$SPARK_HOME/bin/spark-submit --driver-class-path /usr/local/share/mongo-hadoop/spark/build/libs/ --master local[4] ~/sparkPythonExample/SparkPythonExample.py
因此,我得到了以下输出

Traceback (most recent call last):
  File "/home/me/sparkPythonExample/SparkPythonExample.py", line 24, in <module>
    main()
  File "/home/me/sparkPythonExample/SparkPythonExample.py", line 17, in main
    rdd = sc.mongoRDD('mongodb://username:password@localhost:27017/mydb.mycollection')
  File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 161, in mongoRDD
    return self.mongoPairRDD(connection_string, config).values()
  File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 143, in mongoPairRDD
    _ensure_pickles(self)
  File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 80, in _ensure_pickles
    orig_tb)
py4j.protocol.Py4JError
我已经将
pymongo
导入到同一个python程序中,以验证我至少可以使用它访问MongoDB,而且我可以


我知道这里有很多活动部件,如果我能提供更多有用的信息,请告诉我。

我昨天也遇到了同样的问题。通过将
mongo java driver.jar
放在
$HADOOP_HOME/lib
mongo HADOOP core.jar
mongo HADOOP spark.jar
$HADOOP_HOME/spark/classpath/emr
(或
$spark_classpath
中的任何其他文件夹)来修复它

如果有帮助,请告诉我。

您是否可以尝试在spark submit命令中使用
--package
选项而不是
--jars…

spark-submit --packages org.mongodb.mongo-hadoop:mongo-hadoop-core:1.3.1,org.mongodb:mongo-java-driver:3.1.0 [REST OF YOUR OPTIONS]

其中一些jar文件不是Uber jar,需要下载更多依赖项才能开始工作。

更新

2016-07-04

自从上次更新以来,它已经成熟了很多。它提供了基于数据源的API,但使用的是
SparkConf
配置,因此主观上不如Stratio/Spark MongoDB灵活

2016-03-30

根据最初的答案,我找到了两种不同的方法从Spark连接到MongoDB:

虽然前者似乎相对不成熟,但后者看起来比Mongo Hadoop连接器好得多,并提供了Spark SQL API

# Adjust Scala and package version according to your setup
# although officially 0.11 supports only Spark 1.5
# I haven't encountered any issues on 1.6.1
bin/pyspark --packages com.stratio.datasource:spark-mongodb_2.11:0.11.0
df=(sqlContext.read)
.format(“com.stratio.datasource.mongodb”)
.options(host=“mongo:27017”,database=“foo”,collection=“bar”)
.load())
df.show()
## +---+----+--------------------+
##| x | y | u id|
## +---+----+--------------------+
##| 1.0 |-1.0 | 56fbe6f6e4120712c|
##| 0.0 | 4.0 | 56fbe701e4120712c|
## +---+----+--------------------+
它似乎比mongo hadoop spark要稳定得多,支持谓词下推,无需静态配置,而且工作简单

原始答案

事实上,这里有相当多的运动部件。我试图通过构建一个简单的Docker映像使其更易于管理,该映像与所描述的配置大致匹配(不过为了简洁起见,我省略了Hadoop库)。您可以找到()并从头开始构建它:

git克隆https://github.com/zero323/docker-mongo-spark.git
cd docker mongo spark
docker构建-t zero323/mongo spark。
或者下载我的图片,这样你就可以简单地
docker pull zero323/mongo spark
):

开始图像:

docker run-d——名称mongo-mongo:2.6
docker run-i-t-link mongo:mongo zero323/mongo spark/bin/bash
启动PySpark shell传递
--jars
--driver class path

pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
最后看看它是如何工作的:

导入pymongo
进口pymongo_spark
蒙哥乌mongodb://mongo:27017/'
client=pymongo.MongoClient(mongo_url)
client.foo.bar.insert\u many([
{“x:1.0,y”:-1.0},{“x:0.0,y:4.0}])
client.close()
pymongo_spark.activate()
rdd=(sc.mongoRDD({0}foo.bar'.格式(mongo_url))
.map(lambda文档:(doc.get('x')、doc.get('y'))
rdd.collect()
## [(1.0, -1.0), (0.0, 4.0)]
请注意,mongo hadoop似乎在第一次操作后关闭了连接。因此,在collect之后调用例如
rdd.count()
将引发异常

基于创建此图像时遇到的不同问题,我倾向于认为将mongo-hadoop-1.5.0-SNAPSHOT.jar和mongo-hadoop-spark-1.5.0-SNAPSHOT.jar传递给
驱动程序类路径
是唯一的硬要求

注释

  • 这张图片是松散的基础上,所以请务必发送一些好业力,如果它有帮助
  • 如果不需要开发版本,那么使用
    --packages
    很可能是更好的选择
    • 祝你好运

      @看

      这似乎没有什么帮助,在$HADOOP_HOME/lib中我有mongo-java-driver-3.0.4.jar,然后是/usr/local/share/mongo-HADOOP/spark/build/libs
      pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
      
      from pyspark import SparkContext, SparkConf
      
      import pymongo_spark
      # Important: activate pymongo_spark.
      pymongo_spark.activate()
      
      
      def main():
          conf = SparkConf().setAppName("pyspark test")
          sc = SparkContext(conf=conf)
      
          # Create an RDD backed by the MongoDB collection.
          # This RDD *does not* contain key/value pairs, just documents.
          # If you want key/value pairs, use the mongoPairRDD method instead.
          rdd = sc.mongoRDD('mongodb://localhost:27017/db.collection')
      
          # Save this RDD back to MongoDB as a different collection.
          rdd.saveToMongoDB('mongodb://localhost:27017/db.other.collection')
      
          # You can also read and write BSON:
          bson_rdd = sc.BSONFileRDD('/path/to/file.bson')
          bson_rdd.saveToBSON('/path/to/bson/output')
      
      if __name__ == '__main__':
          main()