Cập nhật :
2016-07-04
Kể từ bản cập nhật cuối cùng MongoDB Spark Connector đã trưởng thành khá nhiều. Nó cung cấp các tệp nhị phân cập nhật và API dựa trên nguồn dữ liệu nhưng nó đang sử dụng SparkConf
nên về mặt chủ quan, nó kém linh hoạt hơn Stratio / Spark-MongoDB.
2016-03-30
Kể từ câu trả lời ban đầu, tôi đã tìm thấy hai cách khác nhau để kết nối với MongoDB từ Spark:
- mongodb / mongo-spark
- Stratio / Spark-MongoDB
Trong khi cái đầu tiên có vẻ tương đối chưa trưởng thành, cái sau có vẻ là lựa chọn tốt hơn nhiều so với trình kết nối Mongo-Hadoop và cung cấp 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...|
## +---+----+--------------------+
Nó có vẻ ổn định hơn nhiều so với mongo-hadoop-spark
, hỗ trợ đẩy xuống vị từ mà không cần cấu hình tĩnh và hoạt động đơn giản.
Câu trả lời ban đầu :
Thật vậy, có khá nhiều bộ phận chuyển động ở đây. Tôi đã cố gắng làm cho nó dễ quản lý hơn một chút bằng cách xây dựng một hình ảnh Docker đơn giản gần như khớp với cấu hình được mô tả (mặc dù vậy, tôi đã bỏ qua các thư viện Hadoop cho ngắn gọn). Bạn có thể tìm thấy nguồn hoàn chỉnh trên GitHub
(DOI 10.5281 / zenodo.47882) và xây dựng nó từ đầu:
git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
hoặc tải xuống hình ảnh mà tôi đã đẩy vào Docker Hub để bạn có thể chỉ cần docker pull zero323/mongo-spark
):
Hình ảnh bắt đầu:
docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
Khởi động trình bao PySpark chuyển --jars
và --driver-class-path
:
pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
Và cuối cùng hãy xem nó hoạt động như thế nào:
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)]
Xin lưu ý rằng mongo-hadoop dường như đóng kết nối sau hành động đầu tiên. Vì vậy, gọi ví dụ rdd.count()
sau khi thu thập sẽ đưa ra một ngoại lệ.
Dựa trên các vấn đề khác nhau mà tôi gặp phải khi tạo hình ảnh này, tôi có xu hướng tin rằng vượt qua mongo-hadoop-1.5.0-SNAPSHOT.jar
và mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
cho cả hai --jars
và --driver-class-path
là yêu cầu khó duy nhất .
Ghi chú :
- Hình ảnh này dựa trên jaceklaskowski / docker-spark một cách lỏng lẻo, vì vậy hãy nhớ gửi một số nghiệp lành đến @ jacek-laskowski nếu điều đó có ích.
- Nếu không yêu cầu phiên bản phát triển bao gồm API mới thì hãy sử dụng
--packages
rất có thể là một lựa chọn tốt hơn.