Pembaruan :
04-07-2016
Sejak pembaruan terakhir, MongoDB Spark Connector cukup matang. Ini menyediakan binari terbaru dan API berbasis sumber data tetapi menggunakan SparkConf
konfigurasi sehingga secara subyektif kurang fleksibel daripada Stratio/Spark-MongoDB.
30-03-2016
Sejak jawaban asli saya menemukan dua cara berbeda untuk terhubung ke MongoDB dari Spark:
- mongodb/mongo-spark
- Stratio/Spark-MongoDB
Sementara yang pertama tampaknya relatif belum matang, yang terakhir tampak seperti pilihan yang jauh lebih baik daripada konektor Mongo-Hadoop dan menyediakan API Spark SQL.
# 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...|
## +---+----+--------------------+
Tampaknya jauh lebih stabil daripada mongo-hadoop-spark
, mendukung pushdown predikat tanpa konfigurasi statis dan hanya berfungsi.
Jawaban asli :
Memang, ada beberapa bagian yang bergerak di sini. Saya mencoba membuatnya sedikit lebih mudah dikelola dengan membangun gambar Docker sederhana yang kira-kira cocok dengan konfigurasi yang dijelaskan (saya telah menghilangkan perpustakaan Hadoop untuk singkatnya). Anda dapat menemukan sumber lengkapnya di GitHub
(DOI 10.5281/zenodo.47882) dan buat dari awal:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
atau unduh gambar yang telah saya masukkan ke Docker Hub sehingga Anda cukup docker pull zero323/mongo-spark
):
Mulai gambar:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Mulai shell PySpark dengan melewati --jars
dan --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
Dan akhirnya lihat cara kerjanya:
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)]
Harap dicatat bahwa mongo-hadoop tampaknya menutup koneksi setelah tindakan pertama. Jadi memanggil misalnya rdd.count()
setelah mengumpulkan akan mengeluarkan pengecualian.
Berdasarkan berbagai masalah yang saya temui saat membuat gambar ini, saya cenderung percaya bahwa lulus mongo-hadoop-1.5.0-SNAPSHOT.jar
dan mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
ke keduanya --jars
dan --driver-class-path
adalah satu-satunya persyaratan yang sulit .
Catatan :
- Gambar ini secara longgar didasarkan pada jaceklaskowski/docker-spark jadi pastikan untuk mengirimkan karma baik ke @jacek-laskowski jika itu membantu.
- Jika tidak memerlukan versi pengembangan termasuk API baru, gunakan
--packages
kemungkinan besar merupakan pilihan yang lebih baik.