Aktualizace :
2016-07-04
Od poslední aktualizace MongoDB Spark Connector poměrně hodně dospěl. Poskytuje aktuální binární soubory a API založené na zdroji dat, ale používá SparkConf
konfigurace, takže je subjektivně méně flexibilní než Stratio/Spark-MongoDB.
2016-03-30
Od původní odpovědi jsem našel dva různé způsoby, jak se připojit k MongoDB od Spark:
- mongodb/mongo-spark
- Stratio/Spark-MongoDB
Zatímco první se zdá být relativně nevyzrálý, druhý vypadá jako mnohem lepší volba než konektor Mongo-Hadoop a poskytuje 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...|
## +---+----+--------------------+
Zdá se, že je mnohem stabilnější než mongo-hadoop-spark
, podporuje predikátový pushdown bez statické konfigurace a jednoduše funguje.
Původní odpověď :
Ve skutečnosti je zde poměrně dost pohyblivých částí. Snažil jsem se to udělat trochu lépe ovladatelným vytvořením jednoduchého obrazu Dockeru, který zhruba odpovídá popsané konfiguraci (i když jsem pro stručnost vynechal knihovny Hadoop). Kompletní zdroj najdete na GitHub
(DOI 10.5281/zenodo.47882) a sestavte jej od začátku:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
nebo si stáhněte obrázek, který jsem poslal do Docker Hub, abyste mohli jednoduše docker pull zero323/mongo-spark
):
Spustit obrázky:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Spusťte shell PySpark předáním --jars
a --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
A nakonec se podívejte, jak to funguje:
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)]
Upozorňujeme, že mongo-hadoop po první akci zřejmě ukončí spojení. Volání například rdd.count()
po shromáždění vyvolá výjimku.
Na základě různých problémů, se kterými jsem se při vytváření tohoto obrázku setkal, mám tendenci věřit, že prošlo mongo-hadoop-1.5.0-SNAPSHOT.jar
a mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
oběma --jars
a --driver-class-path
je jediným náročným požadavkem .
Poznámky :
- Tento obrázek je volně založen na jaceklaskowski/docker-spark, takže pokud to pomůže, nezapomeňte poslat dobrou karmu @jacek-laskowski.
- Pokud nepotřebujete vývojovou verzi včetně nového rozhraní API, použijte
--packages
je s největší pravděpodobností lepší varianta.