当前位置: 首页 > 面试题库 >

使Spark,Python和MongoDB协同工作

微生欣怡
2023-03-14
问题内容

我很难让这些组件正确地编织在一起。我已经安装了Spark并且可以成功工作,我可以在本地,独立运行作业,也可以通过YARN运行作业。据我所知,我已经按照此处和此处建议的步骤进行操作

我正在使用Ubuntu,而我拥有的各种组件版本是

  • Spark Spark 1.5.1-bin-hadoop2.6
  • Hadoop hadoop-2.6.1
  • 蒙哥 2.6.10
  • *从 https://github.com/mongodb/mongo-hadoop.git克隆的 *Mongo-Hadoop连接器
  • Python 2.7.10

我在执行各个步骤时遇到了一些困难,例如将哪些罐子添加到哪个路径,所以我添加的是

  • /usr/local/share/hadoop-2.6.1/share/hadoop/mapreduce 我添加 mongo-hadoop-core-1.5.0-SNAPSHOT.jar
  • 以下 环境变量
    • export HADOOP_HOME="/usr/local/share/hadoop-2.6.1"
    • export PATH=$PATH:$HADOOP_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_HOME/bin

我的Python程序是基本的

from pyspark import SparkContext, SparkConf
import pymongo_spark
pymongo_spark.activate()

def main():
    conf = SparkConf().setAppName("pyspark test")
    sc = SparkContext(conf=conf)
    rdd = sc.mongoRDD(
        'mongodb://username:password@localhost:27017/mydb.mycollection')

if __name__ == '__main__':
    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

根据这里

当Java客户端代码中发生异常时,将引发此异常。例如,如果您尝试从空堆栈中弹出一个元素。引发的Java异常的实例存储在java_exception成员中。

查看源代码pymongo_spark.py并抛出错误,它说

“与JVM通信时出错。Spark的CLASSPATH上的MongoDB Spark jar是吗?:”

因此,作为回应,我试图确保传递了正确的罐子,但是我可能做错了所有事情,请参见下文

$SPARK_HOME/bin/spark-submit --jars /usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-hadoop-spark-1.5.0-SNAPSHOT.jar,/usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-java-driver-3.0.4.jar --driver-class-path /usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-java-driver-3.0.4.jar,/usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-hadoop-spark-1.5.0-SNAPSHOT.jar --master local[4] ~/sparkPythonExample/SparkPythonExample.py

我已经导入pymongo到相同的python程序中,以验证我至少可以使用它访问MongoDB,并且可以。

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


问题答案:

更新内容

2016-07-04

自上次更新以来,MongoDB Spark Connector已经相当成熟。它提供了最新的二进制文件和基于数据源的API,但它使用的是SparkConf配置,因此从主观上讲它不如Stratio
/ Spark-MongoDB灵活。

2016-03-30

从原始答案开始,我发现了两种从Spark连接到MongoDB的不同方法:

  • mongodb / mongo-spark
  • Stratio / 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|                 _id|
## +---+----+--------------------+
## |1.0|-1.0|56fbe6f6e4120712c...|
## |0.0| 4.0|56fbe701e4120712c...|
## +---+----+--------------------+

它似乎比稳定得多mongo-hadoop-spark,无需静态配置即可支持谓词下推,并且可以正常工作。

原始答案

确实,这里有很多活动部件。我试图通过构建一个与描述的配置大致匹配的简单Docker映像,使其更易于管理(不过,为简洁起见,我省略了Hadoop库)。您可以在GitHub(DOI 10.5281 /
zenodo.47882
)上找到完整的源代码,并从头开始构建它:

git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .

或下载我已推送到Docker Hub的映像,因此您可以简单地docker pull zero323/mongo-spark

起始图片:

docker run -d --name 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}

最后看看它是如何工作的:

import pymongo
import pymongo_spark

mongo_url = 'mongodb://mongo:27017/'

client = pymongo.MongoClient(mongo_url)
client.foo.bar.insert_many([
    {"x": 1.0, "y": -1.0}, {"x": 0.0, "y": 4.0}])
client.close()

pymongo_spark.activate()
rdd = (sc.mongoRDD('{0}foo.bar'.format(mongo_url))
    .map(lambda doc: (doc.get('x'), doc.get('y'))))
rdd.collect()

## [(1.0, -1.0), (0.0, 4.0)]

请注意,在第一个操作之后,mongo-hadoop似乎关闭了连接。因此,例如rdd.count()在collect之后调用将引发异常。

根据不同的问题,我以前遇到过这种创建图片我倾向于相信, 通过 mongo-hadoop-1.5.0-SNAPSHOT.jarmongo- hadoop-spark-1.5.0-SNAPSHOT.jar 这两个 --jars--driver-class-path
是唯一的硬性要求

注意事项

  • 该图像大致基于jaceklaskowski / docker-spark, 因此,如果有帮助,请确保将一些良好的业力发送到@ jacek-laskowski。
  • 如果不需要包含新API的开发版本,那么使用--packages很有可能是一个更好的选择。


 类似资料:
  • 问题内容: 我想要双向JSON到Java的序列化 我正在 成功 使用Java到JSON到jQuery的路径…()例如 在JQuery中,我使用 这 很好用 (例如,感谢所有回答者,注释已经可以使用了) 但是,我该如何做 反向 路径:是否已使用RequestBody将JSON序列化回Java对象? 无论我尝试什么,我都无法像这样工作: 我已经正确配置了Jackson(它在出局时进行序列化),并且我将

  • 问题内容: 我遇到了一个有趣的问题,一个以苹果为中心的用户将渴望在Filemaker Pro上运行数据库,而我们已经有多个数据库在MS SQL上运行。 FM Pro在外观上令人赞叹,作为与客户合作的前端看起来不错,但我更喜欢SQL。 有人同时使用吗?您是否可以轻松地在SQL和FM Pro之间运行任务以将数据更新到FM Pro(比如说隔夜)?是否有人出于任何目的将SQL从FM Pro更改为可以吗?

  • 完全相同的问题,因为Ubuntu WSL与docker无法找到 但我的要求不同——我想 坚持使用WSL1(出于本主题以外的原因) 也就是说,我有WSL1和Docker for Windows彼此并行安装。这是我目前的信息: 我看不到“资源”中的集成- 只是我遇到了上面的问题——我的可以在任何地方工作,在CMD、Powershell、git bash等中,只是不在我的WSL中。 我找到的所有解决方案

  • 项目落户GitHub后,一定希望有越来越多的人能参与其中。GitHub提供了包括传统的问题追踪系统、维基,还包括了分布式版本控制系统特有的协同工具。 4.1. Fork + Pull模式 4.2. 共享版本库 4.3. 组织和团队 4.4. 代码评注 4.5. 缺陷跟踪 4.6. 维基

  • 问题内容: 我想要双向JSON到Java的序列化 我正在成功使用Java到JSON到jQuery的路径…()例如 在JQuery中,我使用 这很好用(例如,感谢所有回答者,注释已经可以使用了) 但是,我该如何做反向路径:是否已使用RequestBody将JSON序列化回Java对象? 无论我尝试什么,我都无法像这样工作: 我已经正确配置了Jackson(它会在出局时序列化),并且我将MVC设置为当

  • 问题内容: 我想要双向JSON到Java的序列化 我正在成功使用Java到JSON到jQuery的路径…()例如 在JQuery中,我使用 这很好用(例如,感谢所有回答者,注释已经可以使用了) 但是,我该如何做反向路径:是否已使用RequestBody将JSON序列化回Java对象? 无论我尝试什么,我都无法像这样工作: 我已经正确配置了Jackson(它会在出局时序列化),并且我将MVC设置为驱